応用情報技術者試験過去問を解いてみた R6年度 春期 問46

応用情報技術者試験

はじめに

今回も、応用情報技術者試験の過去問を解いていきます。

今回はモジュール結合度に関する問題です。

システム開発では、プログラムを複数のモジュールに分割して設計します。

このとき重要になるのが、

「モジュール同士がどれくらい強く依存しているか」

という考え方です。

これを表すのがモジュール結合度です。

一般に、モジュール間の結合度は低い方が、モジュールの独立性が高くなり、修正や保守の影響を局所化しやすくなります。

直感的には、

「あるモジュールを直したとき、その変更がどこまで他のモジュールに波及するか」

を考えると理解しやすいです。

今回は、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で他モジュール内部へ入る → 内容結合
共通領域の大域データを共有 → 共通結合
大域的な単一データ項目を参照 → 外部結合
処理を決める情報を渡す → 制御結合
構造体などをまとめて渡す → スタンプ結合
必要なデータだけ渡す → データ結合

そして、結合度の順番は、

強い

内容
 ↓
共通
 ↓
外部
 ↓
制御
 ↓
スタンプ
 ↓
データ

弱い

です。


まとめ

今回は、モジュール結合度について解説しました。

正解は、

エ:大域的なデータを参照するモジュール間の関係は、共通結合である

です。

モジュール結合度とは、モジュール同士の依存関係の強さを表します。

直感的には、

「一つを変更したとき、その影響がほかへどれだけ波及しやすいか」

と考えると分かりやすいです。

一般に、

結合度は低い方がモジュールの独立性が高く、修正や保守をしやすくなります。

そして試験では、

結合度は低く、モジュール強度は高く

が基本です。

今回の問題では特に、

共通結合と外部結合の違い

を押さえておきましょう。


参考情報

コメント

タイトルとURLをコピーしました