凝集度と結合度

システムアーキテクチャ

概要

ソフトウェア設計において品質を測る基本的な指標として、**凝集度(Cohesion)結合度(Coupling)**がある。これらは、モジュール化、保守性、再利用性などを考慮する際に重要な概念である。

凝集度(Cohesion)とは

凝集度とは、モジュール内の構成要素(関数や変数など)がどれほど密接に関連しているかを表す指標である。

高凝集(High Cohesion)

  • モジュール内の要素が「同じ目的」のために連携している状態を指す。
  • 理想的な状態であり、理解しやすく、保守・再利用が容易である。

低凝集(Low Cohesion)

  • 無関係な機能が同一モジュール内に混在している状態を指す。
  • 理解やテストが難しく、変更の影響範囲が広くなりやすい。

凝集度の種類(低 → 高)

種類 説明
Coincidental(偶発的) 無関係な処理がただまとめられている
Logical(論理的) 同カテゴリの処理だが、条件分岐などで選択される
Temporal(時間的) 同じタイミングで実行される処理(例:初期化処理)
Procedural(手続き的) 一連の処理だが目的が異なる
Communicational(通信的) 同一データを扱う処理群
Sequential(逐次的) 出力が次の処理の入力となる
Functional(機能的) 単一かつ明確な目的に特化している(理想)

結合度(Coupling)とは

結合度とは、モジュール間の依存の強さを表す指標である。

低結合(Low Coupling)

  • モジュール間の依存が少ない状態を指す。
  • 理想的な状態であり、変更の波及が少なく、テストや再利用がしやすい。

高結合(High Coupling)

  • モジュール同士が強く依存している状態を指す。
  • 一部の変更が他モジュールに広範囲に影響を与える可能性がある。

結合度の種類(高 → 低)

種類 説明
Content(内容結合) 他モジュールの内部に直接アクセスする
Common(共通結合) グローバル変数などを共有する
External(外部結合) 外部フォーマット(ファイル形式など)に依存する
Control(制御結合) フラグなどで制御を委ねる
Stamp(スタンプ結合) 不要なデータを含む構造体を渡す
Data(データ結合) 必要最小限のデータのみを渡す(望ましい)
Message(メッセージ結合) メッセージパッシングによる完全分離(理想)

理想

指標 理想の状態
凝集度 高いほど良い(目的に集中している)
結合度 低いほど良い(依存が少ない)

実例:ログ機能の設計

良い例:高凝集・低結合

type Logger struct {
    Output io.Writer
}

func (l *Logger) Info(msg string)  { ... }
func (l *Logger) Error(msg string) { ... }
  • ログ出力という明確な目的に集中しており、高凝集である。
  • 他モジュールはLoggerのインターフェースにのみ依存しており、低結合である。

悪い例:低凝集・高結合

func DoStuffAndLog() {
    // データ処理
    // DB更新
    // エラー時にメール送信
    // ログ出力
}
  • 無関係な処理が混在しており、凝集度が低い。
  • 複数の他モジュールに依存しており、結合度が高い。

まとめ

凝集度と結合度は、設計品質を左右する重要な判断基準である。モジュールの責務を明確にし、依存関係を最小限に保つことで、理解しやすく、保守しやすく、成長可能なシステム設計が実現できる。


関連書籍