首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口隔离原则与“可选”方法的实现

接口隔离原则与“可选”方法的实现
EN

Stack Overflow用户
提问于 2020-01-11 13:09:51
回答 1查看 212关注 0票数 1

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

当某些方法本质上是“可选的”时,如何应用这个原则,因为实现类是一个特定的角落案例。

假设我有这个接口示例:

代码语言:javascript
复制
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(){...}
}

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

代码语言:javascript
复制
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调用;

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-11 14:16:10

界面偏析原理

任何客户都不应被迫依赖它不使用的方法的国家。

它没有提到用空体实现方法的任何事情。类B同时使用capitalizeInputgetInput,只要这是Input中的两种方法,就不会违反接口隔离原则。在您的示例中,B使用NumberOnlyInput.capitalizeInput --恰好是空体是此功能的有效实现。

然而,Input.create确实违反了ISP。B依赖于Input,但不使用Input.create --它根本不被调用。在这种情况下,您只需将其从接口中删除即可。

你还是可以摆脱那个奇怪的空方法。由于NumberOnlyInputLatinInput的特例,所以可以重用该类:

代码语言:javascript
复制
class NumberOnlyInput {
    static Input create(int input) {
        return new LatinInput(String.valueOf(input));
    }
}

它可能不那么清楚或表现-这可能是为什么特例的数字被创建的第一。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59694700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档