2012-08-07 5 views
9

に違反:は、複数のインタフェースを実装してい<a href="http://en.wikipedia.org/wiki/Single_responsibility_principle">Wikipedia</a>から単一責任の原則

「シングル責任原則すべてのクラスは、単一の責任を持つべき状態、およびその責任は完全にクラスによってカプセル化されなければなりません。」

複数のインターフェイスを実装するということは、この原則に違反していますか?

+4

単一の責任が必要な場合は、複数のインターフェイスを実装する必要はありません。 – oldrinb

答えて

13

私はそれだけではありません。クラスは1つの責任を負うことができますが、その過程で複数のことを行い、責任を果たすために必要な一連の作業ごとに1つのインタフェースを実装します。

また、Javaのインターフェイスを使用して、クラスのプロパティ(たとえば、ComparableおよびSerializable)についての説明ができますが、クラスの責任は実際には何も言いません。

しかし、あるクラスが1つの責任に対応する複数のインタフェースを実装する場合、、次にはその原則に違反します。

0

「単一の責任」は、抽象化のレベルによって異なります。例えば、複雑なシステムは、システムレベルでそれを考慮すると、1つの責任を負う可能性があります。たとえば、テレビシステムの責任は、ビデオ画像を表示することです。次の低レベルでは、そのシステムはサブシステム、モニタ、電源ユニットなどで構成されています。このレベルでは、これらのユニットはそれぞれ独自の責任を持ちます。

同じように、クラスは1つのレベルで1つの責任を持つと見なすことができます。しかし、より低いレベルでは、ジョブの一部を実行する他の構成モジュール(クラス、インタフェースなど)を持つことがあります。たとえば、学生クラスの責任は、学生抽象を表現することです。しかし、それは学生の住所を表す別の単位(クラス)を持つかもしれません。

このように、複数のインターフェイスを使用しても、オブジェクト指向の原則に違反するものではありません。

1

多分、必須ではありません。

インターフェイスは、責任を負いません。 There's a very powerful mode of architectureは、ロールを定義していると見なします。オブジェクトはアプリケーションで再生される可能性があります。

その意味を考えてください。あなたは、これはSRPに違反することはできません今、明らかに

class Person : IAmAStudent, IDrawSocialSecurity, IAmACitizen { 
    public SocialSecurityNumber getSocialSecurityNumber() { 
     return this.ssn; 
    } 
    private SocialSecurityNumber ssn; 
    public Person(SocialSecurityNumber ssn) { this.ssn = ssn; } 
} 

(さんが命名の.NET規則を使用してみましょう)のインターフェイスのすべての種類で Personクラスを持つことができます。それは明確に を持っています - 人々と社会保障番号の間の関係が変わった場合。しかし、オブジェクトは多くのインタフェースを実装し、アプリケーションでいくつかの役割を果たします。

の異なる機能を公開する複数のインターフェイスを実装している場合は、SRPに違反している可能性がありますが、これも判断の呼び出しになる可能性があります。単一の責任原則は、疎結合を達成するための大まかな経験則ですが、それだけでは町の理想ではありません。また、の高い結束度には、の関連コードが一緒に住んでいる必要があります。 2つは根本的に不安定です(しかし、しばしば良いバランスを達成する方法があります)。だから、あなたは合理的に互いの方向に選択をして意識的にSRPに違反することを決めるかもしれません。

最終的に、SRPとすべてのSOLIDルールは、あなたが毎回盲目的に従うということではなく、特定の行に沿って考えることを確認することに関するものです。