モジュール結合度|つまづきやすいポイントと攻略法 徹底解説!
この連載は、基本情報技術者試験の受験者を対象としたものです。
毎回1つのテーマにしぼって、多くの受験者がつまづきやすいポイントと攻略法を解説します。
今回のテーマはモジュール結合度です。
もくじ
モジュール結合度とは?
大規模なプログラムは、いくつかの部分に分けて作り、それぞれの部分を「モジュール(module=構成要素)」と呼びます。
大規模なプログラムは、いくつかのモジュールから構成され、個々のモジュールが連携して動作し、その際にデータを受け渡すことがあります。
モジュールとモジュールの結び付きの強さを「モジュール結合度」と呼びます。
モジュール結合度は、弱いほど良いとされます。
なぜなら、モジュール結合度が強いと、バグの修正や仕様の変更などでプログラムをメンテナンスするときに、1つのモジュールに変更を加えると、それと連携する他のモジュールにも多くの変更が必要になり、コストが上がってしまうからです。
モジュール結合度は、表1に示した分類があり、表の上にあるほど弱くなります。
「引数」とは、モジュールを使うときに受け渡すデータです。「大域変数(グローバル変数)」とは、すべてのモジュールから共通して利用できるデータです。
大域変数に対して、モジュールの処理の中だけで使われるデータを「局所変数(ローカル変数)」と呼びます。
引数も、局所変数です。「制御用の引数」とは、モジュールの処理内容を変える引数です。
| 分類名 | 結び付き方 | 強度 |
|---|---|---|
| データ結合 | 単純な引数で結び付く |
弱い
強い
|
| スタンプ結合 | 複雑な引数で結び付く | |
| 制御結合 | 制御用の引数で結び付く | |
| 外部結合 | 単純な大域変数で結び付く | |
| 共通結合 | 複雑な大域変数で結び付く | |
| 内部結合 | モジュールの内部を部分的に利用する |
モジュール結合度の攻略法
後で示す問題を見ればわかりますが、試験には「データ結合」や「スタンプ結合」などの分類名ではなく、どうすればモジュール結合度が弱くなるかが出題されます。
分類名を知るよりも、モジュール結合度を弱くする方法を知る方が、重要だからです。
したがって、モジュール結合度に関する問題の攻略法は、モジュール結合度を弱くする方法をしっかりと理解することです。
もう一度、表1に示したモジュール結合度の分類を見てみましょう。分類名ではなく、結び付き方に注目してください。
6つの分類は、大きく分けて「引数で結び付く」「大域変数で結び付く」「データで結び付くのではなくモジュールの内部を部分的に利用する」の3つに分けられます。
これらの中で、「データで結び付くのではなくモジュールの内部を部分的に利用する」は、プログラムをモジュールに分けた意味がないような結び付きであり、一般的にはあり得ないことなので最もモジュール結合度が強い、と覚えてください。
「引数で結び付く」と「大域変数で結び付く」は、「引数で結び付く」の方が「大域変数で結び付く」よりモジュール結合度が弱くなります。これは、当然のことです。「引数で結び付く」は、モジュールとそれを使うモジュールの間だけの結び付きです。「大域変数で結び付く」は、すべてのモジュールが大域変数を使えるので、すべてのモジュールが結び付く可能性があります。
そして、これも当然のことですが、「引数で結び付く」と「大域変数で結び付く」のどちらの場合も、単純なデータで結び付いた方が、複雑なデータで結び付くより、モジュール結合度が弱くなります。
「制御用の引数で結び付く」とモジュール結合度が強くなるのは、計算するための引数よりも、処理内容を変える引数の方が、引数の形式や内容を変更したときにモジュールに与える影響が大きいからです。
擬似言語で示したモジュール結合度の例
基本情報技術者試験の科目Bで採用されている擬似言語を使って、「引数で結び付く」「大域変数で結び付く」「制御用の引数で結び付く」の例を示しましょう。
擬似言語では、関数、手続き、オブジェクトをモジュールとすることができます。ここでは、関数をモジュールとしています。
リスト1のfunc1関数は、引数aとbの値を加算します。
func1関数と結び付くのは、引数を指定してfunc1関数を呼び出したモジュールだけです。したがって、大域変数で結び付くよりモジュール結合度が弱くなります。
○実数型:func1(実数型:a, 実数型:b)
実数型:ret
ret ← a + b
return ret
リスト2のfunc2関数は、大域変数data1とdata2の値を加算します。
すべてのモジュールが大域変数を使えるので、すべてのモジュールがfunc2関数と結び付く可能性があります。したがって、引数で結び付くよりモジュール結合度が強くなります。
大域:実数型:data1,data2
○実数型:func2()
実数型:ret
ret ← data1 + data2
return ret
リスト3のfunc3関数は、引数aとbの値を、引数opの値に応じて、加算、減算、乗算、除算します。引数opによって処理内容が変わるので、これは制御用引数です。もしも、引数opに剰余やべき乗を指定できるように変更するなら、それに合わせてfunc3関数の内容に多くの変更が必要になります。したがって、計算するための引数で結び付くよりモジュール結合度が強くなります。
○実数型:func3(実数型:a, 実数型:b, 文字列型:op)
実数型:ret ← 0
if (op = “加算”)
ret ← data1 + data2
elseif (op = “減算”)
ret ← data1 - data2
elseif (op = “乗算”)
ret ← data1 × data2
elseif (op = “除算”)
ret ← data1 ÷ data2
endif
return ret
モジュール結合度に関する問題の攻略法(1)
モジュール結合度に関する問題を見てみましょう。
以下は、どうすればモジュール結合度が弱くなるか、という問題(出典:R01秋問46)です。
問題(出典:R01秋問46)
モジュール結合度が最も弱くなるものはどれか。
ア 一つのモジュールで,できるだけ多くの機能を実現する。
イ 二つのモジュール間で必要なデータ項目だけを引数として渡す。
ウ 他のモジュールとデータ項目を共有するためにグローバルな領域を使用する。
エ 他のモジュールを呼び出すときに,呼び出したモジュールの論理を制御するための引数を渡す。
表1の分類にはありませんでしたが、1つのモジュールに多くの機能があると、多くのモジュールと結び付くことになるので、選択肢アはモジュール結合度が強くなります。
選択肢イは、データ項目(計算するためのデータ)を引数で渡す。
選択肢ウは、データ項目をグローバルな領域(大域変数のことです)で渡す。
選択肢エは、モジュールの論理を制御するための引数を渡すです。
これらの中で、モジュール結合度が最も弱くなるのは、データ項目を引数で渡すなので、選択肢イが正解です。
モジュール結合度に関する問題の攻略法(2)
モジュール結合度に関する問題を、もう1つ見てみましょう。
以下も、どうすればモジュール結合度が弱くなるか、という問題(出典:H28春問47)です。
問題(出典:H28春問47)
モジュールの独立性を高めるには,モジュール結合度を低くする必要がある。モジュール間の情報の受渡し方法のうち,モジュール結合度が最も低いものはどれか。
ア 共通域に定義したデータを関係するモジュールが参照する。
イ 制御パラメータを引数として渡し,モジュールの実行順序を制御する。
ウ 入出力に必要なデータ項目だけをモジュール間の引数として渡す。
エ 必要なデータを外部宣言して共有する。
選択肢アの共通域に定義したデータとは、大域変数のことです。
選択肢イは、制御用の引数を渡しています。
選択肢ウは、計算するためのデータを引数で渡しています。
選択肢エのデータを外部宣言して共有するというのは、大域変数のことです。
これらの中で、モジュール結合度が最も低くなるのは、計算するためのデータを引数で渡すなので、選択肢ウが正解です。
今回は、「モジュール結合度」のポイントと攻略法を解説しました。
このテーマが苦手だった受験者の参考になれば幸いです。
それでは、またお会いしましょう!
label 関連タグ免除試験を受けた 74.9% の方が、科目A免除資格を得ています。
※独習ゼミは、受験ナビ運営のSEプラスによる試験対策eラーニングです。

『プログラムはなぜ動くのか』(日経BP)が大ベストセラー
IT技術を楽しく・分かりやすく教える“自称ソフトウェア芸人”
大手電気メーカーでPCの製造、ソフトハウスでプログラマを経験。独立後、現在はアプリケーションの開発と販売に従事。その傍ら、書籍・雑誌の執筆、またセミナー講師として活躍。軽快な口調で、知識0ベースのITエンジニアや一般書店フェアなどの一般的なPCユーザの講習ではダントツの評価。
お客様の満足を何よりも大切にし、わかりやすい、のせるのが上手い自称ソフトウェア芸人。
主な著作物
- 「プログラムはなぜ動くのか」(日経BP)
- 「コンピュータはなぜ動くのか」(日経BP)
- 「出るとこだけ! 基本情報技術者」 (翔泳社)
- 「ベテランが丁寧に教えてくれる ハードウェアの知識と実務」(翔泳社)
- 「ifとelseの思考術」(ソフトバンククリエイティブ) など多数







