ソフトウェア設計において品質を測る基本的な指標として、**凝集度(Cohesion)と結合度(Coupling)**がある。これらは、モジュール化、保守性、再利用性などを考慮する際に重要な概念である。
凝集度とは、モジュール内の構成要素(関数や変数など)がどれほど密接に関連しているかを表す指標である。
種類 | 説明 |
---|---|
Coincidental(偶発的) | 無関係な処理がただまとめられている |
Logical(論理的) | 同カテゴリの処理だが、条件分岐などで選択される |
Temporal(時間的) | 同じタイミングで実行される処理(例:初期化処理) |
Procedural(手続き的) | 一連の処理だが目的が異なる |
Communicational(通信的) | 同一データを扱う処理群 |
Sequential(逐次的) | 出力が次の処理の入力となる |
Functional(機能的) | 単一かつ明確な目的に特化している(理想) |
結合度とは、モジュール間の依存の強さを表す指標である。
種類 | 説明 |
---|---|
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更新
// エラー時にメール送信
// ログ出力
}
凝集度と結合度は、設計品質を左右する重要な判断基準である。モジュールの責務を明確にし、依存関係を最小限に保つことで、理解しやすく、保守しやすく、成長可能なシステム設計が実現できる。