接口隔离原则和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();
}
}它被一个clas 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();
}
}
}在不更改类C的情况下,如何更改设计以符合ISP,同时也不需要在运行时检查对象是否为instance of?
发布于 2020-01-11 14:16:10
任何客户都不应被迫依赖它不使用的方法的国家。
它没有提到用空体实现方法的任何事情。类B同时使用capitalizeInput和getInput,只要这是Input中的两种方法,就不会违反接口隔离原则。在您的示例中,B使用NumberOnlyInput.capitalizeInput --恰好是空体是此功能的有效实现。
然而,Input.create确实违反了ISP。B依赖于Input,但不使用Input.create --它根本不被调用。在这种情况下,您只需将其从接口中删除即可。
你还是可以摆脱那个奇怪的空方法。由于NumberOnlyInput是LatinInput的特例,所以可以重用该类:
class NumberOnlyInput {
static Input create(int input) {
return new LatinInput(String.valueOf(input));
}
}它可能不那么清楚或表现-这可能是为什么特例的数字被创建的第一。
https://stackoverflow.com/questions/59694700
复制相似问题