64

SOLIDの「インターフェイス分離の原則」は「単一責任の原則」とどのように異なりますか?

SOLIDのウィキペディアのエントリには次のように書かれています

ISPは、非常に大きいインターフェイスをより小さく、より具体的なインターフェイスに分割するため、クライアントは関心のあるメソッドについてのみ知る必要があります。

ただし、私には、SRPをクラスだけでなくインターフェイスにも適用しているように聞こえます。結局のところ、インターフェースが1つの概念的なことだけを担当している場合、それをさらに分解することはできません。

私は何かが足りないのですか、それともISPはSRPと冗長なのですか?そうでない場合、ISPはSRPがそうではないことを何を意味しますか?

4

4 に答える 4

43

SRP は、モジュール内での責任は 1 つだけであるべきだと教えています。

ISP は、実際に必要以上のものに直面することを強いられるべきではないと言っています。print()interface からメソッドを使用したい場合は、そのためにまたはクラスIをインスタンス化する必要はありません。SwimmingPoolDriveThru

より具体的に言えば、それらは同じアイデアに対する異なる見解です。SRP はデザイナー側の視点により重点を置いていますが、ISP はクライアント側の観点により重点を置いています。 . だからあなたは基本的に正しいです。

それはすべてから来た

ISP は、Robert C. Martin が Xerox のコンサルティングを行っていたときに最初に使用および策定されました。Xerox は、一連の印刷された用紙のホチキス止めやファックス送信など、さまざまなタスクを実行できる新しいプリンター システムを作成しました。このシステムのソフトウェアはゼロから作成され、そのタスクを正常に実行しました。ソフトウェアが成長するにつれて、変更を加えることがますます難しくなり、最小の変更でも再展開サイクルに 1 時間かかるようになりました。これにより、開発を継続することがほぼ不可能になりました。設計上の問題は、ほとんどすべてのタスクで 1 つの主要な Job クラスが使用されていたことです。印刷ジョブまたはステープル ジョブを実行する必要があるときはいつでも、Job クラスの何らかのメソッドが呼び出されました。これにより、さまざまなクライアントに固有の多数のメソッドを持つ巨大な、または「太った」クラスが生まれました。

それで

Martin が提案した解決策は、今日では Interface Segregation Principle と呼ばれるものです。Xerox ソフトウェアに適用されると、Job クラスとそのすべてのクライアントとの間のインターフェイスのレイヤーが、依存関係逆転の原則を使用して追加されました。1 つの大きな Job クラスを持つ代わりに、Job クラスのメソッドを呼び出す Staple クラスまたは Print クラスによってそれぞれ使用される Staple Job インターフェイスまたは Print Job インターフェイスが作成されました。したがって、ジョブごとに 1 つのインターフェースが作成され、それらはすべて Job クラスによって実装されました。

@ http://en.wikipedia.org/wiki/Interface_segregation_principle#Origin

于 2013-01-17T21:24:12.210 に答える
19

SRPは、モジュールの機能とその実行方法に関係しており、抽象化レベルの混合を禁止します。基本的に、コンポーネントを1つの文で広範囲に定義できる限り、SRPを壊すことはありません。

一方、ISPは、モジュールをどのように消費するか、モジュールの一部だけを消費することが理にかなっているのかどうか、いくつかの側面を無視することに関心を持っています。

精神またはSRPを維持するが、ISPを破ることができるコードの例として、Facadeパターンがあります。「より大きなサブシステムへの簡素化されたアクセスを提供する」という単一の責任がありますが、基盤となるサブシステムが大きく異なる考えを公開する必要がある場合、ISPを破壊します。

とは言うものの、通常、コードの一部がSOLIDの原則に違反すると、多くの場合、コード全体が破られます。特定の原則を破り、残りを維持する具体的な例は、野生ではまれです。

于 2013-01-17T21:39:02.847 に答える
5

SRP と ISP は、最終的には同じものになります。それらのいずれかを実装するには、クラスまたはインターフェースの分割が必要です。

ただし、他の面では違いがあります。

  1. SRP に違反すると、設計構造全体に広範囲に及ぶ影響が及ぶ可能性があり、保守性の低下、再利用、そしてもちろん凝集度と結合度の低下を引き起こします。
  2. SRP は、オブジェクト構造の動作コンポーネントと構造コンポーネントの両方に影響を与えます。
  3. SRP 違反の再設計には、より深い分析が必要であり、全体的な方法で設計のさまざまなコンポーネントを調べる必要があります。

ISP への違反は、ほとんどの場合、可読性が低いこと (およびある程度、まとまりが低いこと) に関するものです。しかし、メンテナンスとコードの再利用への影響は、SRP よりもはるかに悪いものではありません。

さらに、コードを ISP のコンフォメーションにリファクタリングすることは、単なる構造上の変更のようです。

SRPISPについては、私のブログも参照してください。

于 2013-12-18T10:50:02.517 に答える