インプリメンテーションの「オプション」メソッドを持つインターフェイスの棲み分け原理

jdoeに:

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、実行時に?

ピーターPraszmo:

分離原則インタフェース

何のクライアントが使用していない方法に依存することを強制すべきではないと述べています。

これは、空のボディを持つメソッドの実装については何も言いません。あなたのクラスのB用途は両方capitalizeInputgetInput、限り、それらは唯一の2つの方法があるとしてInput、それはインターフェイス分離の原則に違反しません。あなたのケースでBの使用NumberOnlyInput.capitalizeInput、ちょうどそうempy体は、この機能の有効な実装であることを起こります。

しかし、Input.createISPに違反しません。B依存しますInputが、使用していませんInput.create-それはまったく呼び出されません。その場合は、あなただけのインターフェイスから削除することができます。

あなたはまだその奇妙な空のメソッドを取り除くことができます。以来NumberOnlyInputの特殊なケースでLatinInput、そのクラスを再利用することができます:

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

それはあまり鮮明なまたはパフォーマンスのかもしれない - 数字のための特別なケースが最初の場所で作成された理由であるかもしれません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=363715&siteId=1