インターフェース分離の原則 - インターフェースへのプログラム 質問する

インターフェース分離の原則 - インターフェースへのプログラム 質問する

SOLID やその他の設計原則について読んでいました。ISP は「実装ではなくインターフェースにプログラムする」と同じだと思っていました。しかし、これらは異なる原則のようですね。

違いはありますか?

ベストアンサー1

Robert Martin は著書「UML for Java Programmers」で、インターフェース分離原則 (ISP) について非常にわかりやすく説明しています。それを踏まえると、ISP とはインターフェースを 1 つの論理的で一貫したグループに「集中」させることではないと思います。それは言うまでもないことです。少なくとも言うまでもないはずです。各クラス、インターフェース、または抽象クラスは、そのように設計する必要があります。

では、ISP とは何でしょうか。例を挙げて説明しましょう。クラス A と、クラス A のクライアントであるクラス B があるとします。クラス A には 10 個のメソッドがあり、そのうち 2 個だけが B によって使用されるとします。では、B は A の 10 個のメソッドすべてを知る必要があるでしょうか。おそらくそうではありません。これは、情報隠蔽の原則です。公開するメソッドが増えるほど、結合の可能性が高まります。そのため、2 つのクラスの間にインターフェイス (C と呼ぶ) を挿入することができます (分離)。そのインターフェイスは、B によって使用される 2 つのメソッドのみを宣言し、B は直接 A に依存するのではなく、そのインターフェイスに依存します。

それで今、

class A {
  method1()
  method2()
  // more methods
  method10()
}

class B {
   A a = new A()
}

となります

interface C {
  method1()
  method2()
}

class A implements C{
  method1()
  method2()
  // more methods
  method10()
}

class B {
  C c = new A()      
}   

これにより、B が必要以上の情報を知ることがなくなります。

おすすめ記事