1

SOLID 的接口隔离原则说类不应该实现/依赖于它们不需要的方法。你永远不应该 //Not used: just needed to implement interface在代码库中。

当某些方法本质上是“可选的”时,我该如何应用这个原则,因为实现类是一个特定的极端情况。

假设我有这个接口示例:

Interface Input {
    Input create();
    void capitalizeInput(CAPITALIZATION cap);
    String getInput();
}

Class LatinInput implements Input {
    String input;
    Input create(String input){...}
    void capitalizeInput(CAPITALIZATION cap){...}
    String getInput(){...}
}

Class NumberOnlyInput implements Input {
    int input;
    Input create(int input){...}
    void capitalizeInput(CAPITALIZATION cap){
         // Needed because the interface requires it.
         return;
    }
    String getInput(){...}
}

该接口在程序中被其他类广泛使用。目前在我的程序中,我正在做类似以下的事情。

Class B {
    Input input;
    B(Input input){
       this.input = input;
    }

    String doStuff(){
        ...
        methodA();
        ...
        methodB();
        ...
        methodC();
        ...
        methodA();
        ...
        return ...;
    }

    private void methodA(){
        ...
        input.transformInput(CAPITAL);
        input.getInput();
    }

    private void methodB(){
        ...
        input.getInput();
    }

    private void methodC(){
        ...
        input.transformInput();
    }
}

它被 C 类调用;

Class C {
    void doStuff() {
        List<A> list = new Arraylist<>();
        list.add(LatinInput.create("hello"));
        list.add(LatinInput.create("goodbye"));
        list.add(NumberOnlyInput.create(12345));

        for(Input input: list){
            B b = new B(a);
            b.doStuff();
        }
    }
}

我应该如何更改设计以符合 ISP,而不更改 C 类,同时也不需要检查对象是否instance of在运行时?

4

1 回答 1

2

接口隔离原则

声明不应强迫任何客户依赖它不使用的方法。

它没有说明用空体实现方法。您的类B同时使用capitalizeInputand getInput,只要它们只是 中的两个方法Input,就不会违反接口隔离原则。在您的情况下,恰好碰巧Bempy NumberOnlyInput.capitalizeInputbody 是此功能的有效实现。

但是,Input.create确实违反了ISP。B取决于Input但不使用Input.create- 它根本不被调用。在这种情况下,您可以将其从界面中删除。

你仍然可以摆脱那个奇怪的空方法。由于您可以重用该类NumberOnlyInput的特殊情况:LatinInput

class NumberOnlyInput {
    static Input create(int input) {
        return new LatinInput(String.valueOf(input));
    }
}

它可能不太清晰或性能较差 - 这可能是为什么首先创建数字的特殊情况。

于 2020-01-11T14:16:10.987 回答