FE EXAM

モジュール結合度の6段階

モジュール同士の依存の強さを示す尺度。

FIGURE
弱い(良い)
強い
弱い(良い)強い1データ結合必要なデータだけを引数で受け渡すData2スタンプ結合データの集まり(構造体)を渡すStamp3制御結合動作を指示する制御情報を渡すControl4外部結合外部宣言した必要な変数を共有External5共通結合共通領域の変数を複数で共有Common6内容結合相手の内部を直接参照・変更Content
解説

📌
モジュール結合度とは

弱い結合(良い)細いつながり1本強い結合太く絡んだつながり

モジュール結合度とは、モジュール同士の依存(つながり)の強さを示す尺度です。モジュール(=機能ごとに分けたプログラムの部品)が、お互いにどれだけ深く関わり合っているかを表します。

やり取りが「必要最小限のデータだけ」なら結合度は弱く(良く)、「相手の内部まで踏み込んで使う」なら結合度は強く(悪く)なります。前のテーマである強度(凝集度)が「1つの部品の中身」を見るのに対し、結合度は「部品と部品の間」を見る指標です。

身近な例で考えると、部署同士の連携に似ています。「決まった書類1枚を渡すだけ」で済む関係は身軽(弱い結合)ですが、「相手の机の中を勝手にいじる」ような関係は混乱を招きます(強い結合)。上の図解では、弱い順に6段階を並べています。一番上のデータ結合が最も良い状態です。

📌
6段階の意味

モジュール結合度は、弱い順に6段階に分類されます。上ほど良く、下ほど避けたい状態です。

順位名称意味評価
1データ結合必要なデータだけを引数で受け渡す良い
2スタンプ結合データの集まり(構造体)を渡す良い
3制御結合動作を指示する制御情報を渡す避けたい
4外部結合外部宣言した必要な変数を共有避けたい
5共通結合共通領域の変数を複数で共有避けたい
6内容結合相手の内部を直接参照・変更避けたい

それぞれの段階を具体的に見ると次のようになります。
データ結合:必要なデータだけを引数(=渡す値)で受け渡す理想形
スタンプ結合:データの集まり(構造体)をまとめて渡す。不要な項目も含まれうる
制御結合:相手の動作を指示する制御情報(フラグなど)を渡す
外部結合:外部宣言した必要なデータを複数モジュールで共有する
共通結合:共通領域(グローバル変数)を多くのモジュールで共有する
内容結合:相手モジュールの内部を直接参照・変更する最も悪い状態

📌
弱い方が良い理由

弱い結合独立性が高い影響が少ない強い結合巻き込まれる直すと連鎖

モジュール結合度は弱い方が良いとされます。その理由は、結合度が弱いモジュールほど次の利点があるからです。
独立性が高い:他に依存しないので、単独で理解・開発できる
影響範囲が限定的:1つを修正しても他のモジュールに波及しにくい
再利用しやすい:他とのつながりが少ないので別のシステムでも使える
テストしやすい:そのモジュール単体で動作を確認できる

逆に結合度が強いモジュールは、相手の内部やグローバル変数に深く依存しているため、1か所直すと連鎖的に他のモジュールも壊れる恐れがあり、修正もテストも難しくなります。だからモジュール設計では「できるだけデータ結合に近づける」ことを目指します。

前のテーマである強度(凝集度)とセットで「強度は強く、結合度は弱く」が良い設計の合言葉です。強度は強いほど良い、結合度は弱いほど良いと、向きが逆である点に注意しましょう。

📌
結合度が高いと連鎖修正が起きる理由

共通データ領域モジュールAモジュールBモジュールCA を修正B・C も影響を受ける

結合度が高い(強い)状態では、複数のモジュールが同じデータや変数を直接共有しています。この状態で1つのモジュールを修正すると、連鎖的に他のモジュールも動作が変わってしまうのはなぜでしょうか。

上の図のように、モジュールA・B・Cが共通のデータ領域(変数など)を直接読み書きしているとします。Aがそのデータの形式を変えると、同じデータを使っているBもCも正しく動かなくなります。
共通結合・内容結合:複数のモジュールが「同じデータを直接いじる」ため、1か所を変えると全員に影響が出る
テスト範囲が広がる:Aを直すだけでもB・C・…すべての動作を確認し直す必要が生じる
把握が困難になる:どのモジュールがどのデータに触れているか追いきれなくなる

なぜデータ結合が理想なのか。データ結合(=必要なデータだけを引数で渡す)では、モジュールが外部の共通領域に頼らず「もらった値だけ」を使って処理します。だから修正の影響はそのモジュールの中だけで収まり、他のモジュールを壊しません。引数のやり取りを「窓口」として1本に絞ることが、連鎖修正を防ぐ鍵です。

📌
データ結合とスタンプ結合の違い

データ結合(良い)A金額B必要な値1つだけを引数で渡すスタンプ結合A注文全体B構造体をまるごと渡す(不要項目含む)

結合度の1位と2位、データ結合スタンプ結合は、どちらも「引数でデータを渡す」点は同じです。では何が違うのでしょうか。

データ結合必要な値だけを1つずつ渡す。例えば「金額」だけを渡せば済む処理に金額だけを引数にする
スタンプ結合データの集まり(構造体)をまとめて渡す。例えば「注文情報全体」を渡すと、受け取る側は金額・住所・品名など必要かどうかに関わらず全部持つことになる

なぜデータ結合の方が良いのか。スタンプ結合では、受け取る側が「このモジュールへ何を渡したら動くか」を調べるために構造体の中身を全部知る必要が出てきます。構造体の定義が変わると受け取る側も修正が必要になります。データ結合なら渡す値が明確で、変更の影響を最小限に抑えられます。どちらも「良い」側ですが、できるだけデータ結合を目指すのが設計の基本です。

練習問題

🎯
基本情報技術者 練習問題

Q1.モジュール結合度の説明として最も適切なものはどれか。
A.モジュール同士の依存(つながり)の強さを示す尺度
B.1つのモジュール内の機能のまとまりの強さを示す尺度
C.モジュールの実行にかかる時間を示す尺度
D.モジュールの行数を示す尺度
Q2.最も結合度が弱い(良い)モジュール結合はどれか。
A.内容結合
B.共通結合
C.データ結合
D.制御結合
Q3.結合度は弱い方が良いとされる理由として正しいものはどれか。
A.モジュール同士の依存が少なく、修正の影響が他に波及しにくいから
B.モジュールの行数を増やせるから
C.モジュール内の機能を減らせるから
D.実行速度が必ず速くなるから

関連コンテンツ