応用情報技術者 2011年 春期 午前2 問47
問題文
モジュール設計に関する記述のうち、モジュール強度 (結束性)が最も強いものはどれか。
選択肢
ア:ある木構造データを扱う機能をデータとともに一つにまとめ、木構造データをモジュールの外から見えないようにした。(正解)
イ:複数の機能のそれぞれに必要な初期設定の操作が、ある時点で一括して実行できるので、一つのモジュールにまとめた。
ウ:二つの機能A,Bのコードは重複する部分が多いので,A, Bを一つのモジュールとし、A, Bの機能を使い分けるための引数を設けた。
エ:二つの機能 A, B は必ずA, Bの順番に実行され、しかもAで計算した結果を Bで使うことがあるので、一つのモジュールにまとめた。
🔒 解説は解答すると表示されます
モジュール結束性【午前2解説】
正解の理由
選択肢のうち、アは「木構造データ」とそれを操作する機能を一つのモジュールにまとめ、さらに木構造データをモジュール外から隠蔽しています。これはモジュール内の要素が共通のデータを扱い、相互に関連性が非常に高い状態を示します。ソフトウェア工学での標準的な結束性分類に当てはめると、アは「情報的結束(communicational / information cohesion)」に該当し、提示された選択肢の中で最も強い結束性を持つため正解となります。
解法ステップ
- 各選択肢でモジュールにまとめられている「要素(処理・データ)」の関係性を把握する。
- 関係性に基づき、該当する結束性の種類を特定する(偶発的、論理的、時間的、逐次的、情報的 等)。
- 結束性の強さの順序に照らして、最も強いものを選ぶ。
- 本問での扱う順序(弱 → 強)は概ね: 偶発的 < 論理的 < 時間的 < 逐次的 < 情報的
- 選んだ結束性が設問文の記述と整合するか再確認する。
選択肢別の誤答解説
-
ア: 情報的結束(最も強い)
- 木構造データという共通データと、そのデータを操作する関数群を一体化し、外部からデータを隠蔽している。モジュール内の要素は同じデータに作用し、相互の関連性が強いため「情報的結束」に該当する。提示選択肢の中では最も高い結束性。
-
イ: 時間的結束(弱〜中程度)
- 複数の初期設定操作を「ある時点で一括実行する」という理由でまとめているため、実行タイミングという共通点で結合されている。これは「時間的結束(temporal cohesion)」に相当し、機能的関連性は弱い。結束性としては中程度より弱い側。
-
ウ: 論理的結束(弱)
- 機能AとBを同一モジュールにまとめ、引数で使い分ける設計は「似た種類(論理的カテゴリ)」でまとめているに過ぎない。内部要素が同一の目的を果たしていないため「論理的結束(logical cohesion)」となり、結束性は低い(偶発的に近い弱さを内包することもある)。
-
エ: 逐次的結束(中〜強)
- A→B の順序が必須で、Aの出力をBが利用するという関係は「逐次的結束(sequential cohesion)」に該当する。逐次的は比較的強い結束性だが、本問では「共通データを扱い情報隠蔽する」アの情報的結束の方が設問者の基準では上位と判断される。
よくある誤解
- 情報隠蔽と結束性を混同する誤解
- 情報隠蔽(データ隠蔽)は良い設計の手段であり結束性を高めるが、情報隠蔽そのものが結束性の種類を決めるわけではありません。要素間の「関連の性質」を見て結束性を判定します。
- 実行順がある=最も強い結束性と考える誤り
- 順序(逐次的)は強い要因ですが、要素が共通データに密接に関わる「情報的結束」の方が設問文の文脈ではさらに高い結束性になります。
- 「同じ処理があるからまとめる」=高結束とする誤り
- 単にコード重複を避ける(共通部分をまとめる)ために引数で切り替える設計は、しばしば論理的結束になり結束性は低いです。目的を明確にすることが重要です。
補足コラム
- 「結束性」と「結合度(カップリング)」は別物
- 結束性はモジュール内部の要素同士の関連の強さ、結合度はモジュール間の依存関係の強さを指します。高結束+低結合度が理想です。
- 実務での対応例(抽象データ型=ADT)
- 木構造(Tree)を扱うモジュールは、データ構造と操作を一体化して公開インタフェースだけを提供する設計(クラスやモジュールでのカプセル化)が典型的な実装です。これにより結束性が高まり、他モジュールからの依存(結合度)を下げられます。
コード例(Python: 木をカプセル化した簡単な例)
class TreeNode:
def __init__(self, value):
self.value = value
self.children = []
class TreeModule:
def __init__(self):
self._root = None # 外部からは見えない(情報隠蔽)
def create_root(self, value):
self._root = TreeNode(value)
def add_child(self, parent_node, value):
parent_node.children.append(TreeNode(value))
def traverse(self, node=None):
if node is None:
node = self._root
# 木操作のための関連処理が同一モジュール内にまとまる
# ...
FAQ
Q1: 情報的結束と機能的結束はどう違うのか?
A1: 機能的結束(functional cohesion)はモジュール内の全要素が単一の明確なタスクを遂行する場合で最強とされます。情報的結束は同じデータに対して複数の処理が行われる場合で非常に高い結束性ですが、要素が完全に単一目的ではない点で機能的結束とは区別されます。本問では「データと操作を隠蔽してまとめる」設計が情報的結束として最も妥当と判断されています。
A1: 機能的結束(functional cohesion)はモジュール内の全要素が単一の明確なタスクを遂行する場合で最強とされます。情報的結束は同じデータに対して複数の処理が行われる場合で非常に高い結束性ですが、要素が完全に単一目的ではない点で機能的結束とは区別されます。本問では「データと操作を隠蔽してまとめる」設計が情報的結束として最も妥当と判断されています。
Q2: 逐次的結束と情報的結束の判断があいまいなときは?
A2: 「出力が直接次の処理の入力になる」なら逐次的、複数処理が同じデータを操作するなら情報的です。両方の性質が混在する場合は、設計の主目的(データ中心か、処理フロー中心か)で判定します。
A2: 「出力が直接次の処理の入力になる」なら逐次的、複数処理が同じデータを操作するなら情報的です。両方の性質が混在する場合は、設計の主目的(データ中心か、処理フロー中心か)で判定します。
関連キーワード: 結束性、情報的結束、逐次的結束、時間的結束、論理的結束、情報隠蔽、抽象データ型、モジュール設計、カプセル化、結合度

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

