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 が必要以上の情報を知ることがなくなります。