web-dev-qa-db-ja.com

低結合:単一の責任の原則と凝集

私は[〜#〜] srp [〜#〜]cohesionに関するいくつかの記事を読みましたが、それらはlowまでは互いに矛盾しているようですカップリングが関係しています。

cohesionに関する記事は、クラスHighly_Cohesive_Classに密接に関連する責任をまとめることでカップリングが減少する一方、[〜#〜] srp [〜#〜]に関する記事は、これらの密接に関連する責任をクラスHighly_Cohesive_Classから個別のクラスに削除することにより、結合を減らすことを主張します(各クラスが変更する単一の責任/理由のみを持つように)。

2つの主張は互いに矛盾していませんか?つまり、

ところで、私はSRP原則に準拠するクラスも凝集性の高いクラスと見なされていることを認識していますが、この投稿ではhighly cohesiveという用語は、密接に関連するいくつかの責任を持つクラスを指します。

4
user1483278

混乱は、凝集度が高いからといって必ずしもすべての「密接に関連する責任」を1つのクラスに入れたいという意味ではなく、クラス内のすべての項目が密接に関連する責任に対応している必要があるということです。

たとえば、Kitchenクラスがある場合、その中にバスルームロジックは必要ありません。ただし、オーブンとキッチンのシンクロジックを含める必要はありません。それらが関連しているからです。それは台所用電化製品ですが、オーブンはおそらく独自のクラスに値するものであり、構成を通じて台所に関連することになります。同様に、KitchenSinkはコンポジションを通じてKitchenに関連付けられます。

したがって、関連性のないロジックが含まれていないものとして非常にまとまりのあるものを見て、その1つの責任を果たすオブジェクトに責任を委任するための呼び出しとしてSRPを見てください。

12
Matthew Flynn

あなたは2つを混同しています。責任とは、振る舞いについて、クラスが何をすべきか、またはできるかについてです。凝集度は、コンポーネントに関するものであり、同じドメイン内で動作するクラスのグループ化に関するものです。したがって、いくつかの関連データを含むクラスと、そのタイプのデータをストアから取得する別のクラスを作成できます。クラス内のデータメンバーは、それ自体ではほとんど意味がなく、一緒に意味を持つため、まとまりがあります(同じテーブルから取得される場合があります)。また、クラスは両方ともデータへのアクセスの提供を扱い、それらをまとまりにするため、同じアセンブリ内に存在する可能性があります。

データを格納し、データをフェッチ/格納するための個別のクラスを持つことは、SRPに準拠します。同時に、それらを同じ議会に置くことは、彼らのまとまりを認識します。あなたはそれらを分離したいが、それらはお互いを必要とするのでそれらを一緒に近くに保ちたい。

車のコンポーネントは非常にまとまりがあり、一緒に動作します。しかし、ステアリングメカニクスがギアボックスから分離されているので、2つを別々に維持でき、一方を変更しても他方には影響しません。同時に、ドライバーはあなたが運転するときに両方にアクセスすることを望んでいるので、同じ車両に統合されているのは素晴らしいことです。

1
Martin Maat