モジュールの強度と結合度
ソフトウェア設計では
「強度は高く、結合度は低く」 が基本原則。
→再利用のしやすさを表す指標として用いられるのが、
- 強度:中身のまとまり具合(高いほど良い)
- 結合度:他との依存の強さ(低いほど良い)
の二つ。
1. モジュールの強度(Cohesion)
概要
1つのモジュールが、どれだけ「まとまった役割」を持っているか を表す。
強度が高いほど「このモジュールは何をするものか」が明確。
- 強度が高い → 良い設計
- 強度が低い → 修正・再利用が困難
強度の種類(低 → 高)
| 種類 | 名称 | 説明 |
|---|---|---|
| 低 | 偶発的強度 | 無関係な処理がたまたま集まっている |
| 論理的強度 | 条件分岐で処理を切り替えている | |
| 時間的強度 | 同じタイミングで実行される処理の集まり | |
| 手続き的強度 | 処理の流れが同じというだけ | |
| 通信的強度 | 同じデータを扱う処理の集まり | |
| 逐次的強度 | 前の処理結果を次が利用 | |
| 高 | 機能的強度 | 1つの明確な機能だけを持つ |
- 機能的強度が理想
- 上に行くほど「なぜこの処理がここにあるのか」が説明しやすい
① 偶然的強度(最悪)
- 関係のない処理がたまたま同じモジュールに入っている
- 例:
- ログ出力
- 日付計算
- ファイル削除
を1つのクラスにまとめている
② 論理的強度
- 種類は違うが「同じ分類」の処理をまとめている
- 例:
- 入力チェック処理(数値チェック、文字チェックなど)
③ 時間的強度
- 実行タイミングが同じ処理をまとめている
- 例:
- 初期化処理を1つのモジュールにまとめる
④ 手続き的強度
- 実行順序が決まっている処理をまとめている
- 例:
- 読み込み → 加工 → 出力
⑤ 情報的強度
- 同じデータ構造に対する処理をまとめている
- 例:
- 配列に対する追加・削除・検索
⑥ 機能的強度(理想)
- 1つの明確な機能だけを持つ
- 例:
- 「税込価格を計算する」だけのメソッド
2. モジュールの結合度(Coupling)
概要
モジュール同士がどれだけ密接につながっているか を表す。
結合度が低いほど、1つの変更が他に影響しにくい。
- 結合度が低い → 良い設計
- 結合度が高い → 変更が連鎖しやすい
結合度の種類(高 → 低)
| 種類 | 名称 | 説明 |
|---|---|---|
| 高 | 内容結合 | 他モジュールの内部を直接参照 |
| 共通結合 | グローバル変数を共有 | |
| 外部結合 | 外部定義(ファイル形式など)に依存 | |
| 制御結合 | フラグで相手の処理を制御 | |
| スタンプ結合 | 構造体やクラスを丸ごと渡す | |
| 低 | データ結合 | 必要なデータだけを引数で渡す |
- データ結合が理想
- 内部実装に踏み込むほど結合度は高くなる
① 内容結合(最悪)
- 他モジュールの内部実装を直接操作する
- 例:
- 他クラスの private 変数を直接書き換える
② 共通結合
- グローバル変数を共有している
- 例:
- 複数のモジュールが同じグローバル変数を参照
③ 外部結合
- 外部データ形式やプロトコルに依存
- 例:
- 特定のファイル形式に強く依存
④ 制御結合
- フラグなどで処理の流れを制御
- 例:
-
mode = 1ならA処理、mode = 2ならB処理
-
⑤ データ結合
- 必要なデータだけを引数で渡す
- 例:
calculatePrice(int price)
⑥ メッセージ結合(理想)
- オブジェクト間でメッセージ(メソッド呼び出し)のみ
- 例:
order.calculateTotal()
3. 強度と結合度の関係(まとめ)
| 観点 | 良い設計 | 悪い設計 |
|---|---|---|
| 強度 | 高い(機能的) | 低い(偶発的など) |
| 結合度 | 低い(データ結合) | 高い(内容結合など) |
| 影響範囲 | 変更に強い | 変更に弱い |
| 可読性 | 役割が明確 | 意図が分かりにくい |