モジュール同士の依存の強さを示す尺度。
モジュール結合度とは、モジュール同士の依存(つながり)の強さを示す尺度です。モジュール(=機能ごとに分けたプログラムの部品)が、お互いにどれだけ深く関わり合っているかを表します。
やり取りが「必要最小限のデータだけ」なら結合度は弱く(良く)、「相手の内部まで踏み込んで使う」なら結合度は強く(悪く)なります。前のテーマである強度(凝集度)が「1つの部品の中身」を見るのに対し、結合度は「部品と部品の間」を見る指標です。
身近な例で考えると、部署同士の連携に似ています。「決まった書類1枚を渡すだけ」で済む関係は身軽(弱い結合)ですが、「相手の机の中を勝手にいじる」ような関係は混乱を招きます(強い結合)。上の図解では、弱い順に6段階を並べています。一番上のデータ結合が最も良い状態です。
モジュール結合度は、弱い順に6段階に分類されます。上ほど良く、下ほど避けたい状態です。
| 順位 | 名称 | 意味 | 評価 |
|---|---|---|---|
| 1 | データ結合 | 必要なデータだけを引数で受け渡す | 良い |
| 2 | スタンプ結合 | データの集まり(構造体)を渡す | 良い |
| 3 | 制御結合 | 動作を指示する制御情報を渡す | 避けたい |
| 4 | 外部結合 | 外部宣言した必要な変数を共有 | 避けたい |
| 5 | 共通結合 | 共通領域の変数を複数で共有 | 避けたい |
| 6 | 内容結合 | 相手の内部を直接参照・変更 | 避けたい |
それぞれの段階を具体的に見ると次のようになります。
・データ結合:必要なデータだけを引数(=渡す値)で受け渡す理想形
・スタンプ結合:データの集まり(構造体)をまとめて渡す。不要な項目も含まれうる
・制御結合:相手の動作を指示する制御情報(フラグなど)を渡す
・外部結合:外部宣言した必要なデータを複数モジュールで共有する
・共通結合:共通領域(グローバル変数)を多くのモジュールで共有する
・内容結合:相手モジュールの内部を直接参照・変更する最も悪い状態
モジュール結合度は弱い方が良いとされます。その理由は、結合度が弱いモジュールほど次の利点があるからです。
・独立性が高い:他に依存しないので、単独で理解・開発できる
・影響範囲が限定的:1つを修正しても他のモジュールに波及しにくい
・再利用しやすい:他とのつながりが少ないので別のシステムでも使える
・テストしやすい:そのモジュール単体で動作を確認できる
逆に結合度が強いモジュールは、相手の内部やグローバル変数に深く依存しているため、1か所直すと連鎖的に他のモジュールも壊れる恐れがあり、修正もテストも難しくなります。だからモジュール設計では「できるだけデータ結合に近づける」ことを目指します。
前のテーマである強度(凝集度)とセットで「強度は強く、結合度は弱く」が良い設計の合言葉です。強度は強いほど良い、結合度は弱いほど良いと、向きが逆である点に注意しましょう。
結合度が高い(強い)状態では、複数のモジュールが同じデータや変数を直接共有しています。この状態で1つのモジュールを修正すると、連鎖的に他のモジュールも動作が変わってしまうのはなぜでしょうか。
上の図のように、モジュールA・B・Cが共通のデータ領域(変数など)を直接読み書きしているとします。Aがそのデータの形式を変えると、同じデータを使っているBもCも正しく動かなくなります。
・共通結合・内容結合:複数のモジュールが「同じデータを直接いじる」ため、1か所を変えると全員に影響が出る
・テスト範囲が広がる:Aを直すだけでもB・C・…すべての動作を確認し直す必要が生じる
・把握が困難になる:どのモジュールがどのデータに触れているか追いきれなくなる
なぜデータ結合が理想なのか。データ結合(=必要なデータだけを引数で渡す)では、モジュールが外部の共通領域に頼らず「もらった値だけ」を使って処理します。だから修正の影響はそのモジュールの中だけで収まり、他のモジュールを壊しません。引数のやり取りを「窓口」として1本に絞ることが、連鎖修正を防ぐ鍵です。
結合度の1位と2位、データ結合とスタンプ結合は、どちらも「引数でデータを渡す」点は同じです。では何が違うのでしょうか。
・データ結合:必要な値だけを1つずつ渡す。例えば「金額」だけを渡せば済む処理に金額だけを引数にする
・スタンプ結合:データの集まり(構造体)をまとめて渡す。例えば「注文情報全体」を渡すと、受け取る側は金額・住所・品名など必要かどうかに関わらず全部持つことになる
なぜデータ結合の方が良いのか。スタンプ結合では、受け取る側が「このモジュールへ何を渡したら動くか」を調べるために構造体の中身を全部知る必要が出てきます。構造体の定義が変わると受け取る側も修正が必要になります。データ結合なら渡す値が明確で、変更の影響を最小限に抑えられます。どちらも「良い」側ですが、できるだけデータ結合を目指すのが設計の基本です。