応用情報技術者 2023年 春期 午前2 問46
問題文
モジュールの独立性を高めるには、モジュール結合度を低くする必要がある。モジュール間の情報の受渡し方法のうち、モジュール結合度が最も低いものはどれか。
選択肢
ア:共通域に定義したデータを関係するモジュールが参照する。
イ:制御パラメータを引数として渡し、モジュールの実行順序を制御する。
ウ:入出力に必要なデータ項目だけをモジュール間の引数として渡す。(正解)
エ:必要なデータを外部宣言して共有する。
🔒 解説は解答すると表示されます
最小限の引数受渡し【午前2解説】
正解の理由
モジュール間で渡すデータを「入出力に必要なデータ項目だけ」に限定する設計は、モジュール結合度の観点で最も低くなるため正解です。これは「データ結合(data coupling)」に該当し、モジュール間で必要最小限のスカラ値や単純データ項目を引数として渡すことで、相互依存を小さく保てます。選択肢のうち、ウが該当します。
データ結合は結合度の低さで最も望ましく、引数が単一の責務に対応し、モジュールの独立性や再利用性、テスト容易性を高めます。
解法ステップ
- 各選択肢がどの「結合の種類」に対応するかを判断する(共通、外部、制御、スタンプ、データなど)。
- 結合度の標準的な順序(高い→低い)を確認する:
- 内容結合 (content coupling) > 共通結合 (common coupling) > 外部結合 (external coupling) > 制御結合 (control coupling) > スタンプ結合 (stamp coupling) > データ結合 (data coupling)
- 各選択肢を上の順に照合し、もっとも結合度が低いものを選ぶ。
- 該当するのが「入出力に必要なデータ項目だけを引数として渡す(データ結合)」であるため選択。
選択肢別の誤答解説
-
ア: 共通域に定義したデータを参照する
- これは「共通結合 (common coupling)」に該当します。複数モジュールが同じ共有領域を参照・更新すると、変更の波及や依存が大きくなり独立性が低下します。よって高結合で不適切です。
-
イ: 制御パラメータを引数として渡し、モジュールの実行順序を制御する
- これは「制御結合 (control coupling)」です。フラグやモード情報を渡して相手モジュールの内部処理や分岐を変える場合に該当します。制御結合はデータ結合より結合度が高く、モジュールの振る舞いが外部から指定されるため独立性を損ないます。なお、「制御結合」と「スタンプ結合」は別概念であり、制御パラメータを渡す行為をスタンプ結合と混同してはいけません。
-
ウ: 入出力に必要なデータ項目だけを引数として渡す
- これは「データ結合 (data coupling)」で、最小限のスカラーや単純なデータを引数で渡します。モジュール間の依存を最小化できるため最も低い結合度になります。実務でもインターフェースを小さくすることで変更の影響範囲を限定できます。
-
エ: 必要なデータを外部宣言して共有する
- これは「外部結合 (external coupling)」に該当します。外部ファイル・外部システム・グローバル変数などを介して共有すると、モジュールは外部仕様に依存し結合度は高くなります。共通結合に近い問題を生じることもあります。
よくある誤解
-
制御パラメータ=スタンプ結合と考える誤解
- 制御パラメータを渡すのは「制御結合」です。スタンプ結合は構造体やレコードなどの複合データを丸ごと渡し、受け取り側がその中の複数項目を使用するケースを指します。用途と影響範囲が異なります。
-
引数の数を減らせば常に結合度が下がるわけではない
- 単に引数を1つにまとめて構造体や辞書で渡すと、スタンプ結合になり得ます。必要な項目だけを明示的に渡すこと(データ結合)と、引数の「数」だけを削減することは別です。
-
グローバル共有は便利で誤解しやすいが高結合になる
- 共有領域や外部宣言は見た目は簡単でも変更耐性が低くなります。短期的な利便性と長期的な保守コストを混同しないこと。
補足コラム
実務上、引数が多くなりすぎる場合は設計判断が必要です。たとえば関連する複数の項目が常に一緒に使われるならば、意味のある抽象(DTOや値オブジェクト)としてまとめることが妥当です。ただしその場合は「スタンプ結合」的になるため、まとめる前に次を検討してください:その複合型がモジュール間の契約(インターフェース)として自然か、将来の変更で不要な依存が生じないか。
例(Python):
# データ結合(望ましい):必要項目だけを渡す
def process(x, y):
return x * y + 10
# スタンプ結合:辞書を丸ごと渡す(受け側が複数項目を見る)
def process_stamp(params):
return params['x'] * params['y'] + 10
# 制御結合:フラグで処理を切り替える(振る舞いが外部指定される)
def process_control(x, y, mode):
if mode == 'fast':
return x * y
else:
return x * y + 10
設計では「データ結合を基本に、必要に応じて適切な抽象を導入する」ことを目標にしてください。
FAQ
Q: データ結合とスタンプ結合の線引きは?
A: データ結合は必要最小限のスカラ値や単純項目を個別に渡すこと。スタンプ結合は構造体やレコードなど複合データを丸ごと渡し、受け側がその中の複数フィールドを使う場合を指します。
A: データ結合は必要最小限のスカラ値や単純項目を個別に渡すこと。スタンプ結合は構造体やレコードなど複合データを丸ごと渡し、受け側がその中の複数フィールドを使う場合を指します。
Q: グローバル変数はなぜ避けるべきか?
A: グローバル変数は複数モジュールから読み書きされると、変更が波及しやすくバグ原因になりやすい(共通結合・外部結合)。単体テストもしにくくなります。
A: グローバル変数は複数モジュールから読み書きされると、変更が波及しやすくバグ原因になりやすい(共通結合・外部結合)。単体テストもしにくくなります。
Q: 引数が多すぎるときはどうする?
A: 関連性の高い項目を意味のあるオブジェクトにまとめる検討は有効ですが、まとめることで不要な依存を生じないか注意してください。関数の責務を見直し、分割やリファクタリングも検討します。
A: 関連性の高い項目を意味のあるオブジェクトにまとめる検討は有効ですが、まとめることで不要な依存を生じないか注意してください。関数の責務を見直し、分割やリファクタリングも検討します。
関連キーワード: モジュール結合度, データ結合, 制御結合, スタンプ結合, 共通結合, 外部結合, インターフェース設計, 引数設計

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

