「オブジェクト指向の分析と設計」の Grady Booch:
「結束の考え方は、構造化された設計にも由来します。簡単に言えば、結束は、単一のモジュール (およびオブジェクト指向設計の場合、単一のクラスまたはオブジェクト) の要素間の接続の程度を測定します。結束の最も望ましくない形式は偶然です。まったく無関係な抽象化が同じクラスまたはモジュールにスローされる凝集力. たとえば, 動作がまったく無関係な犬と宇宙船の抽象化を含むクラスを考えてみましょう. 凝集力の最も望ましい形は機能的凝集力です.クラスまたはモジュールのすべてが連携して、適切に制限された動作を提供します。したがって、そのセマンティクスが犬、犬全体、および犬以外の行動を包含する場合、クラス Dog は機能的にまとまりがあります。」
上記の Dog を Customer に置き換えると、少しわかりやすくなるかもしれません。したがって、実際の目標は、機能的な結束を目指し、偶然の結束から可能な限り離れることです. 抽象化に応じて、これは単純な場合もあれば、リファクタリングが必要な場合もあります。
凝集性は、単一のクラス、つまり一緒に動作するクラスのグループよりも「モジュール」に適用されることに注意してください。したがって、この場合、Customer クラスと Order クラスは、この強力な関係 (顧客が注文を作成し、注文が顧客に属している) を持っているため、適切なまとまりを持っています。
Martin Fowler は、これを「デメテルの提案」と呼んだ方が快適だと述べています (モックはスタブではないという記事を参照してください)。
「モックスト テスターは、『列車事故』を回避することについてもっと話します。つまり、getThis().getThat().getTheOther() のスタイルのメソッド チェーンです。メソッド チェーンを回避することは、デメテルの法則に従うこととしても知られています。メソッド チェーンは臭いですが、仲介者のオブジェクトが転送方法で肥大化するという反対の問題も臭いです. (私はいつも、デメテルの提案と呼ばれていれば、デメテルの法則の方が快適だと感じていました.)
それは私がどこから来ているのかをうまくまとめています。それは完全に受け入れられ、多くの場合、「法律」を厳密に順守するよりも低いレベルの結束が必要です。偶然の結束を避け、機能的な結束を目指しますが、設計の抽象化により自然に適合するために必要な微調整に夢中にならないでください。