ホームページ >Java >&#&チュートリアル >Javaにおけるインターフェース分離原理の説明例

Javaにおけるインターフェース分離原理の説明例

黄舟
黄舟オリジナル
2017-08-09 16:15:123171ブラウズ

この記事では主にインターフェイスの分離の原理を紹介します。編集者はそれが非常に優れていると考えたので、参考として紹介します。エディターをフォローして見てみましょう

定義: クライアントは、必要のないインターフェースに依存すべきではありません。あるクラスの別のクラスへの依存は、最小のインターフェースに基づく必要があります。

問題の原因: クラス A はインターフェイス I を通じてクラス B に依存し、クラス C はインターフェイス I を通じてクラス D に依存します。インターフェイス I がクラス A とクラス B の最小インターフェイスでない場合、クラス B とクラス D はそれを実装する必要があります。メソッドは必要ありません。

解決策: 肥大化したインターフェイス I をいくつかの独立したインターフェイスに分割し、クラス A とクラス C がそれぞれ必要なインターフェイスとの依存関係を確立します。つまり、インターフェース分離の原理が採用されています。
インターフェイス分離の原則を説明する例:

Javaにおけるインターフェース分離原理の説明例

(図 1 インターフェイス分離の原則に従わない設計)

この図の意味は次のとおりです: クラス A はメソッド 1、メソッド 2、メソッド 3 に依存します。インターフェイス I では、クラス B はクラス A への依存関係の実装です。クラス C は、インターフェイス I のメソッド 1、メソッド 4、およびメソッド 5 に依存します。クラス D は、クラス C への依存の実装です。クラスBとクラスDについては、どちらも未使用のメソッド(図中の赤文字で示したメソッド)がありますが、インタフェースIが実装されているため、これらの未使用メソッドも実装する必要があります。クラス図に慣れていない人は、プログラム コードを参照して理解することができます。コードは次のとおりです。


interface I {
  public void method1();
  public void method2();
  public void method3();
  public void method4();
  public void method5();
}

class A{
  public void depend1(I i){
    i.method1();
  }
  public void depend2(I i){
    i.method2();
  }
  public void depend3(I i){
    i.method3();
  }
}

class B implements I{
  public void method1() {
    System.out.println("类B实现接口I的方法1");
  }
  public void method2() {
    System.out.println("类B实现接口I的方法2");
  }
  public void method3() {
    System.out.println("类B实现接口I的方法3");
  }
  //对于类B来说,method4和method5不是必需的,但是由于接口A中有这两个方法,
  //所以在实现过程中即使这两个方法的方法体为空,也要将这两个没有作用的方法进行实现。
  public void method4() {}
  public void method5() {}
}

class C{
  public void depend1(I i){
    i.method1();
  }
  public void depend2(I i){
    i.method4();
  }
  public void depend3(I i){
    i.method5();
  }
}

class D implements I{
  public void method1() {
    System.out.println("类D实现接口I的方法1");
  }
  //对于类D来说,method2和method3不是必需的,但是由于接口A中有这两个方法,
  //所以在实现过程中即使这两个方法的方法体为空,也要将这两个没有作用的方法进行实现。
  public void method2() {}
  public void method3() {}

  public void method4() {
    System.out.println("类D实现接口I的方法4");
  }
  public void method5() {
    System.out.println("类D实现接口I的方法5");
  }
}

public class Client{
  public static void main(String[] args){
    A a = new A();
    a.depend1(new B());
    a.depend2(new B());
    a.depend3(new B());

    C c = new C();
    c.depend1(new D());
    c.depend2(new D());
    c.depend3(new D());
  }
}

インターフェイスが肥大化しすぎている場合は、インターフェイスは、それに依存するクラスにとって便利です。これらのメソッドは実装クラスに実装する必要がありますが、これは明らかに良い設計ではありません。この設計がインターフェース分離原則に準拠するように変更された場合、インターフェース I を分割する必要があります。ここで、元のインターフェイス I を 3 つのインターフェイスに分割します。 分割設計を図 2 に示します。

Javaにおけるインターフェース分離原理の説明例

(図 2 インターフェイス分離原則に従った設計)


友人の参考のために、通常どおりプログラムを投稿します。クラス図に詳しくありません:



interface I1 {
  public void method1();
}

interface I2 {
  public void method2();
  public void method3();
}

interface I3 {
  public void method4();
  public void method5();
}

class A{
  public void depend1(I1 i){
    i.method1();
  }
  public void depend2(I2 i){
    i.method2();
  }
  public void depend3(I2 i){
    i.method3();
  }
}

class B implements I1, I2{
  public void method1() {
    System.out.println("类B实现接口I1的方法1");
  }
  public void method2() {
    System.out.println("类B实现接口I2的方法2");
  }
  public void method3() {
    System.out.println("类B实现接口I2的方法3");
  }
}

class C{
  public void depend1(I1 i){
    i.method1();
  }
  public void depend2(I3 i){
    i.method4();
  }
  public void depend3(I3 i){
    i.method5();
  }
}

class D implements I1, I3{
  public void method1() {
    System.out.println("类D实现接口I1的方法1");
  }
  public void method4() {
    System.out.println("类D实现接口I3的方法4");
  }
  public void method5() {
    System.out.println("类D实现接口I3的方法5");
  }
}

インターフェイス分離原則の意味は次のとおりです: 単一のインターフェイスを確立し、巨大で肥大化したインターフェイスを構築せず、可能な限りインターフェイスを改良し、インターフェース内のメソッドをできるだけ少なくします。言い換えれば、呼び出しに依存するすべてのクラスに対して巨大なインターフェイスを構築しようとするのではなく、クラスごとに専用のインターフェイスを確立する必要があります。この記事の例では、インターフェイス分離の原則を使用して、巨大なインターフェイスを 3 つの専用インターフェイスに変更します。プログラミングでは、1 つの包括的なインターフェイスに依存するよりも、複数の専用インターフェイスに依存する方が柔軟性が高くなります。インターフェースは設計時に外部から設定される「契約」であり、複数のインターフェースを分散定義することで外部からの変更の波及を防ぎ、システムの柔軟性と保守性を向上させることができます。


これについて言うと、多くの人はインターフェイス分離原則が以前の単一責任原則に非常に似ていると思うでしょうが、そうではありません。まず、単一責任原則はもともと責任に焦点を当てていましたが、インターフェイス分離原則はインターフェイスの依存関係の分離に焦点を当てていました。第二に、単一責任原則は主にクラスを制約し、次にインターフェイスとメソッドが制約され、プログラムの実装と詳細が対象となりますが、インターフェイス分離原則は主に、主に抽象化とプログラム全体のフレームワークの構築のためにインターフェイスを制約します。 。


インターフェース分離原則を使用してインターフェースを制約する場合は、次の点に注意してください:


  • インターフェースは、制限内で可能な限り小さくする必要があります。インターフェイスを改良するとプログラミングの柔軟性が向上することは事実ですが、小さすぎるとインターフェイスが多くなり、設計が複雑になります。したがって、それは適度に行う必要があります。

  • インターフェースに依存するクラスのサービスをカスタマイズして、必要なメソッドのみを呼び出しクラスに公開し、不要なメソッドを非表示にします。モジュールにカスタマイズされたサービスを提供することに重点を置くことによってのみ、確立される依存関係を最小限に抑えることができます。

  • 結束力を高め、外部とのやり取りを減らします。ほとんどのことを達成するためにインターフェイスで使用するメソッドを最小限にします。

インターフェース分離の原則を使用し、インターフェースの設計が大きすぎても小さすぎてもよくありません。インターフェイスをデザインするとき、より多くの時間をかけて考え、計画することによってのみ、この原則を正確に実装することができます


以上がJavaにおけるインターフェース分離原理の説明例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。