ソフトウェア設計における凝集度と結合度
凝集度
機能的凝集度と情報的凝集度
連絡的凝集度
手順的凝集度
時間的凝集度
論理的凝集度
暗合的凝集度
暗合的凝集度は、機能を定義することすらできないモジュールのことです。
何を根拠にモジュールになっているのか説明できないような、論外の状態です。暗合的凝集度の問題点としては、複雑さを増すという点で長いスパゲッティコードよりも悪いものです。
論理的凝集度は、関連したいくつかの機能を持っていて、呼び出しモジュールによって選択され、実行するモジュールのことです。イベントによる処理の振り分け制御などが該当します。
時間的凝集度は、関連の少ない幾つかの機能を逐次的に実行するモジュールのことです。
ここで逐次的とは、特定のタイミングで動くことを意味しています(ちなみに、本家の「構造化設計」では、一時的凝集度と呼んでいます)。初期化処理や終了処理ではよくあるケースですね。
手順的凝集度は、仕様によって定められた、関連の少ない複数の機能を逐次的に実行するモジュールのことです。
連絡的凝集度は、データに関連のある複数の機能を逐次的に実行するモジュールのことです。
これらはどれも、複数の機能を逐次的に実行するものですが、データに関係があるものからないものまでを細かく分類したものです。
機能的凝集度は、1つの固有の機能を実行するモジュールのことです。Simple is best! ですね。
情報的凝集度は、概念、データ構造、資源などを1つのモジュール内に隔離したモジュールのことです。
特徴として、多重入口点(複数のメソッド)、各入口点は単一の機能、機能のすべてはモジュール内に収められた概念、データ構造、資源に関連するもの、というものです。
結合度
非直接結合
データ結合
スタンプ結合
制御結合
外部結合
共通結合
内容結合
内容結合は、一番良くない関連で、2つのモジュールで、1つが他の内部を「直接」参照するケースなどです。
これはカプセル化を破るものとして、論外と言えるでしょう。
共通結合は、グローバル(大域的)な、データ構造を参照するモジュールのグループの間で生じるものです。
なにより、「システムを必要以上に複雑にし、拡張性をそこない、デバッグを難しくしてしまう」という問題が大きいです。
外部結合は、内容結合でも共通結合でもなく、単一のグローバルデータを参照しているものです。
共通結合との違いは、共通結合ではデータ構造と関連しているのに対して、外部結合は単一のデータと関連していることです。共有メモリを使ったアクセスなどはこれらに該当します。
制御結合は、1つのモジュールが他のモジュールの論理をはっきりと制御する関連です。
制御されるモジュールの凝集度は、おそらく論理的凝集度になり、パラメータとして渡される制御要素としては機能コード、制御スイッチなどがあります。システムイベントの実行を振り分ける主制御などは、これを用いた方が良いケースもあります。
スタンプ結合は、2つのモジュール間でやり取りするデータがグローバルではないものです。
ただし、データ構造などで不必要なデータを含んでいるケースです。スタンプ結合の問題点は、グローバルデータの問題点を除いた共通結合と同様です。
データ結合は最も良い関連で、モジュール間のインタフェースデータが単一のデータであるものです。
「データ結合は、モジュールの独立性、モジュールの再利用性、エラー傾向、拡張性、保守性、テストの容易さといった面に有益な効果をもっている」ということになります。
Cohesion(凝集度)という概念が作られた47年前の論文読んでみたら、すでに完成された無茶苦茶分かりやすい判定ロジックが書いてあるのですよね。