結合度

  • 結合度の高い順に記載。結合度の内容が参照したサイト毎に微妙に異なるのが困る。
  • これからクラス図を見るときは結合度も意識しよう。
  • 副作用*1との関係も含めて整理してみたい。

基本の考え方

  • 変数のスコープがローカルの結合度 < 変数のスコープがグローバルの結合度
  • 受け渡しのパラメータがデータ(数値・文字列)の場合の結合度 < 受け渡しのパラメータが複合データ(クラス・構造体)の結合度 < モジュール間でロジックを共有した場合の結合度

内容結合(病理学的結合)

  • 呼び出し元モジュールが呼び出し先モジュール内を直接参照する。
  • モジュール同士がからみあっている状態なので事実上モジュール化されていない。

共通結合

  • 各モジュールが同一のグローバル変数を共有する*2
  • 一方のモジュール内の動作が関連するモジュール全てに波及する。
  • デバッグが困難。

外部結合

  • 各モジュールが必要最低限の変数だけを共有する*3
  • 一方のモジュール内の動作が関連するモジュール全てに波及する。
  • デバッグが困難。

制御結合

  • 呼び出し時に制御用のフラグを介してモジュール内の処理を制御する。
  • 呼び出し先モジュール内部を呼び出し元が知る必要がありモジュール間の独立性が低い。
  • 呼び出し元モジュールのロジックに呼び出し先モジュールが混入する。

スタンプ結合

  • モジュール間で複合データ(構造体やクラス)をやり取りする。
  • 潜在的に複合データの内部構造が変更される恐れがある。
  • 基本的にはモジュール間は独立している。
  • 呼び出し先モジュールをブラックボックスとして扱える。

データ結合

  • モジュール間でデータのみをやり取りする。
  • モジュール間で整数値を渡して平方根を返す場合など。
  • 原理的にそれぞれのモジュール間が独立している。
  • 原理的に呼び出し先モジュールをブラックボックスとして扱える。

メッセージ結合

  • モジュールの呼び出し時に引数が不要。

*1:ここでは副作用を「関数の主たる仕事である値を返すこと」以外全てとする。例えば変数の代入、ファイルの入出力は全て副作用。

*2:グローバル変数の複合としている場合もあり

*3:単一のグローバル変数としている場合もあり