凝集度と結合度

凝集度と結合度

Read in: en
凝集度と結合度

概要

ソフトウェア設計において品質を測る基本的な指標として、**凝集度(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) { ... }

悪い例:低凝集・高結合

func DoStuffAndLog() {
    // データ処理
    // DB更新
    // エラー時にメール送信
    // ログ出力
}

まとめ

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

Tags: 設計 システム設計
Share: 𝕏 Post Facebook Hatena
✏️ View source / Discuss on GitHub
☕ サポート

このブログを応援していただける方は、以下からサポートをお願いします。いただいたサポートはブログ運営・技術研鑽に活用します。


関連記事