はじめに
今回も、応用情報技術者試験の過去問を解いていきます。
今回はモジュール結合度に関する問題です。
システム開発では、プログラムを複数のモジュールに分割して設計します。
このとき重要になるのが、
「モジュール同士がどれくらい強く依存しているか」
という考え方です。
これを表すのがモジュール結合度です。
一般に、モジュール間の結合度は低い方が、モジュールの独立性が高くなり、修正や保守の影響を局所化しやすくなります。
直感的には、
「あるモジュールを直したとき、その変更がどこまで他のモジュールに波及するか」
を考えると理解しやすいです。
今回は、6種類あるモジュール結合度の違いを整理しながら問題を解いていきます。
問題
モジュール結合度に関する記述のうち、適切なものはどれか。
選択肢
ア
あるモジュールがCALL命令を使用せずにJUMP命令でほかのモジュールを呼び出すとき、このモジュール間の関係は、外部結合である。
イ
実行する機能や論理を決定するために引数を受け渡すとき、このモジュール間の関係は、内容結合である。
ウ
大域的な単一のデータ項目を参照するモジュール間の関係は、制御結合である。
エ
大域的なデータを参照するモジュール間の関係は、共通結合である。
解答
正解:エ
解説
モジュール結合度とは、
モジュール同士の依存関係の強さ
を表すものです。
結合度が強いと、一つのモジュールを変更しただけで、ほかのモジュールにも影響が広がる可能性があります。
反対に結合度が弱ければ、それぞれのモジュールが独立しやすくなります。
イメージすると次のようになります。
結合度が強い
= 他のモジュールへの依存が大きい
= 修正の影響が広がりやすい
結合度が弱い
= 他のモジュールへの依存が小さい
= 修正の影響を局所化しやすい
ただし、
結合度そのものが「修正範囲」を意味するわけではありません。
結合度が高いことで依存関係が強まり、結果として修正の影響が広がりやすくなる、と考えるのが正確です。
モジュール結合度の強さ
モジュール結合度は、一般に次の順序で整理します。
【結合度が強い・独立性が低い】
内容結合
↓
共通結合
↓
外部結合
↓
制御結合
↓
スタンプ結合
↓
データ結合
【結合度が弱い・独立性が高い】
表にすると次のようになります。
| 結合の種類 | 内容 |
| 内容結合 | 他モジュールの内部データや内部処理を直接参照する |
| 共通結合 | 共通領域に置かれた大域的なデータを複数モジュールで共有する |
| 外部結合 | 外部宣言されたデータをモジュール間で共有する |
| 制御結合 | 実行する処理を決定する制御情報を引数として渡す |
| スタンプ結合 | 構造体やレコードなど、複数項目をまとめたデータ構造を渡す |
| データ結合 | 必要なデータ項目だけを引数として渡す |
試験では、
内容 → 共通 → 外部 → 制御 → スタンプ → データ
の順番を押さえておくことが重要です。
各選択肢の解説
ア:誤り
CALL命令を使わず、JUMP命令でほかのモジュールを呼び出す。
これは内容結合です。
JUMP命令によって、ほかのモジュールの内部処理へ直接移ることになります。
つまり、
モジュールA
│
└── JUMP ──→ モジュールBの途中
というように、他モジュールの内部構造へ直接依存しています。
6種類の中でも特に結合度が強く、モジュールの独立性が低い状態です。
したがって、「外部結合」としているアは誤りです。
イ:誤り
実行する機能や論理を決定するために引数を受け渡す。
これは制御結合です。
例えば、次のようなケースです。
mode = 1 → 登録処理
mode = 2 → 更新処理
mode = 3 → 削除処理
呼び出す側から渡されたmodeによって、呼び出された側の処理内容が変化しています。
つまり、
処理の流れを制御するための情報を渡している
ので、制御結合になります。
したがって、「内容結合」としているイは誤りです。
ウ:誤り
大域的な単一のデータ項目を参照する。
この問題の分類では、これは外部結合です。
制御結合ではありません。
外部結合は、
外部宣言されたデータをモジュール間で共有・参照する関係
です。
特に今回の問題では、
「単一のデータ項目」
というところがポイントです。
したがって、ウは誤りです。
エ:正しい
大域的なデータを参照するモジュール間の関係
これは共通結合です。
例えば、
共通データ
│
┌────┴────┐
↓ ↓
モジュールA モジュールB
のように、複数のモジュールが共通領域に置かれたデータを参照します。
共通データが変更されると、それを利用している複数のモジュールへ影響する可能性があります。
したがって、エが正解です。
「共通結合」と「外部結合」の違い
この問題で最も紛らわしいのが、共通結合と外部結合です。
どちらにも「大域的なデータ」という考え方が登場するため、単純に、
共通結合 = グローバル変数
だけで覚えてしまうと混乱します。
試験対策では、次のように整理すると分かりやすいです。
| 結合 | 覚え方 |
| 共通結合 | 共通領域の大域的なデータを複数モジュールで共有 |
| 外部結合 | 外部宣言された単一のデータ項目などを共有 |
今回の問題では、
大域的な単一のデータ項目
↓
外部結合
大域的なデータ
↓
共通結合
という区別になっています。
Excelで考えるモジュール結合度
モジュール結合度は、Excelで考えると直感的に理解しやすくなります。
例えば、消費税込み価格を計算するとします。
修正が1か所で済む設計
| セル | 内容 | 値・数式 |
| A1 | 税抜価格 | 1,000 |
| B1 | 消費税率 | 10% |
| C1 | 税込価格 | =A1*(1+B1) |
税率が10%から12%へ変わった場合、
B1だけを修正すれば済みます。
A1 税抜価格
│
├──→ B1 税率
│
└──→ C1 税込価格
↑
B1を参照
税率というルールが1か所に集約されているため、変更箇所が明確です。
修正が複数箇所必要な設計
一方、次のようになっていたらどうでしょうか。
| セル | 内容 | 値・数式 |
| A1 | 税抜価格 | 1,000 |
| B1 | 税額 | =A1*10% |
| C1 | 税込価格 | =A1*1.10 |
税率が10%から12%へ変わると、
B1 = A1*12%
C1 = A1*1.12
と、2か所を修正する必要があります。
もし片方だけ修正してしまえば、計算結果に食い違いが発生します。
このように、
同じルールが複数箇所へ散らばっている
設計では、変更の影響を追いかけるのが難しくなります。
モジュール結合度そのものとExcelのセル参照は完全に同じ概念ではありませんが、
「依存関係が複雑になるほど変更の影響範囲が分かりにくくなる」
という感覚をつかむ例としては有効です。
問題の用語解説
モジュール
モジュールとは、プログラムを機能ごとに分割した処理単位です。
例えば、
- ログイン処理
- 顧客登録処理
- 売上計算処理
- メール送信処理
などが考えられます。
一つの巨大なプログラムにすべての処理を書くのではなく、役割ごとに分割することで、管理や修正がしやすくなります。
結合度(Coupling)
結合度とは、
モジュール同士の依存関係の強さ
です。
結合度が高いと、
- 変更の影響が他モジュールへ波及しやすい
- 単体テストがしにくい
- 再利用しにくい
- 修正時の確認範囲が広がりやすい
といった問題が起こります。
そのため、一般には結合度を低くすることが望まれます。
内容結合
内容結合は、他モジュールの内部処理や内部データを直接利用する結合です。
例えば、
モジュールA
│
└──→ モジュールBの処理途中へ直接JUMP
のような状態です。
6種類の中で最も結合度が強く、モジュールの独立性が低い結合です。
共通結合
共通結合は、複数のモジュールが共通領域にある大域的なデータを共有する結合です。
共通データ
/ \
モジュールA モジュールB
共通データを変更すると、複数のモジュールへ影響する可能性があるため、依存関係が強くなります。
外部結合
外部結合は、外部宣言されたデータをモジュール間で共有する結合です。
今回の問題では、
大域的な単一のデータ項目を参照する場合
が外部結合として問われています。
共通結合との違いを意識して覚えておきましょう。
制御結合
制御結合は、呼び出されたモジュールの処理内容を決める情報を渡す結合です。
処理A
│
└── mode = 1
↓
処理B
├─ 登録
└─ 更新
フラグやモードなどを渡して処理を切り替えるケースが代表例です。
スタンプ結合
スタンプ結合は、
構造体・レコードなど、複数の項目をまとめたデータ構造を引数として渡す結合
です。
例えば、
顧客データ
├─ 顧客ID
├─ 氏名
├─ 住所
├─ 電話番号
└─ 生年月日
という構造体を、呼び出されたモジュールでは顧客IDしか使わないのに丸ごと渡すようなケースです。
データ結合よりも依存関係が強くなります。
データ結合
データ結合は、
必要なデータだけを引数として渡す結合
です。
例えば顧客IDだけ必要なら、
customer_id
だけを渡します。
余計な情報を渡さないため、モジュール同士の依存関係が小さくなります。
6種類の中では最も結合度が弱い結合です。
モジュール結合度とモジュール強度の違い
モジュール結合度と一緒に出てくるのがモジュール強度です。
名前が似ているため混乱しやすいですが、見る場所が違います。
| 項目 | 何を見るか | 理想 |
| モジュール結合度 | モジュール同士のつながり | 弱い方がよい |
| モジュール強度 | 一つのモジュール内部のまとまり | 強い方がよい |
つまり、
モジュール同士
↓
結合度
モジュール内部
↓
強度
です。
試験対策では、
結合度は低く、強度は高く
とセットで覚えておきましょう。
体系的位置づけ
今回の問題は、
テクノロジ系
→ システム開発技術
→ ソフトウェア方式設計・詳細設計
に位置づけられる問題です。
関連するテーマとしては、
- モジュール分割
- モジュール結合度
- モジュール強度
- ソフトウェア設計
- 保守性
- 再利用性
などがあります。
今回の問題の重要ポイント
今回押さえておきたいポイントは次のとおりです。
| ポイント | 覚える内容 |
| ① | 結合度はモジュール間の依存の強さ |
| ② | 一般に結合度は弱い方が望ましい |
| ③ | JUMPで他モジュール内部へ入る → 内容結合 |
| ④ | 共通領域の大域データを共有 → 共通結合 |
| ⑤ | 大域的な単一データ項目を参照 → 外部結合 |
| ⑥ | 処理を決める情報を渡す → 制御結合 |
| ⑦ | 構造体などをまとめて渡す → スタンプ結合 |
| ⑧ | 必要なデータだけ渡す → データ結合 |
そして、結合度の順番は、
強い
内容
↓
共通
↓
外部
↓
制御
↓
スタンプ
↓
データ
弱い
です。
まとめ
今回は、モジュール結合度について解説しました。
正解は、
エ:大域的なデータを参照するモジュール間の関係は、共通結合である
です。
モジュール結合度とは、モジュール同士の依存関係の強さを表します。
直感的には、
「一つを変更したとき、その影響がほかへどれだけ波及しやすいか」
と考えると分かりやすいです。
一般に、
結合度は低い方がモジュールの独立性が高く、修正や保守をしやすくなります。
そして試験では、
結合度は低く、モジュール強度は高く
が基本です。
今回の問題では特に、
共通結合と外部結合の違い
を押さえておきましょう。


コメント