PR

凝集度と結合度の違い|高凝集・低結合が望ましい理由と判断方法

システム
スポンサーリンク

はじめに

凝集度と結合度は、どちらもクラスやモジュールなどの設計単位を評価する考え方です。しかし、凝集度は設計単位の内部、結合度はほかの設計単位との関係を評価するため、確認する対象が異なります。

内部の役割がまとまっていても、外部の実装方法へ強く依存していることがあります。反対に、外部への依存が少なくても、内部に異なる目的の処理が混在していることがあります。

本記事では、凝集度と結合度の違い、4つの組み合わせ、高凝集・低結合が望ましい理由、実務での判断方法を解説します。

凝集度と結合度の違い

凝集度は設計単位の内部を、結合度は設計単位と外部との関係を評価します。

観点凝集度結合度
評価する対象クラスやモジュールの内部ほかのクラスやモジュールとの関係
確認すること一つの目的にまとまっているか相手の詳細へどの程度依存しているか
望ましい方向高い低い
主な判断材料目的、扱うデータ、変更理由依存する情報、共有状態、変更の波及
問題がある状態異なる目的が混在している相手の実装方法を知りすぎている

凝集度が高い設計単位は、内部の処理やデータが共通する目的にまとまっています。詳しい定義や判断方法は、凝集度とは?高い・低いの違いと設計への影響をわかりやすく解説で説明しています。

結合度が低い設計単位は、依存先の実装方法を必要以上に知らず、公開された役割や必要な情報だけを使って連携します。詳しい定義や依存の種類は、結合度とは?高い・低いの違いと設計への影響をわかりやすく解説で説明しています。

凝集度と結合度は別の軸で評価する

凝集度が高ければ、結合度も低くなるとは限りません。内部の目的が明確でも外部の詳細へ依存していれば高凝集・高結合となり、外部への依存が少なくても内部に複数の目的が混在していれば低凝集・低結合となります。

二つの指標を組み合わせると、設計上の問題が内部と外部のどちらにあるのかを整理できます。

状態判断主な問題・対応
高凝集・低結合目的が明確で、外部の詳細へ依存していない変更箇所と影響範囲を限定しやすい
高凝集・高結合目的は明確だが、外部の詳細へ依存している外部との境界を見直す
低凝集・低結合外部の詳細へは依存していないが、内部に複数の目的がある内部の責務を整理する
低凝集・高結合内部に複数の目的があり、外部の詳細にも依存している責務と依存関係の両方を見直す

この分類は設計を数値で採点するものではありません。問題の場所と改善する方向を整理するための判断枠組みです。

なぜ高凝集・低結合が望ましいのか

高凝集・低結合が望ましいのは、変更する場所と、その変更が影響する範囲を限定しやすくなるためです。

凝集度が高ければ、同じ目的や変更理由を持つ処理が一つの設計単位にまとまります。結合度が低ければ、その設計単位で発生した変更が、ほかの設計単位へ波及しにくくなります。

高凝集は変更箇所をまとめ、低結合は変更の波及を抑えます。

ただし、低結合は依存関係をなくすことではありません。システムを動かすために必要な依存を残しながら、相手の実現方法へ必要以上に依存しない状態を目指します。

注文処理を二つの軸で評価する例

注文完了までの流れを管理するOrderServiceを例に考えます。注文処理は、保存、在庫確保、通知、請求など複数の部品と連携しますが、複数の部品を呼び出すこと自体は問題ではありません。

確認すべきなのは、OrderServiceの目的が明確か、連携先の詳細をどこまで知っているかです。

状態OrderServiceの設計例
高凝集・低結合注文完了までの流れを調整し、保存や通知は公開された操作を通じて依頼する
高凝集・高結合注文完了までの調整だけを担当するが、テーブル構造や通知API固有の型へ依存する
低凝集・低結合注文処理に加えて売上集計や請求書のレイアウトも担当するが、外部とは公開された操作で連携する
低凝集・高結合注文、集計、請求書作成を担当し、SQLや通知APIの操作方法も直接扱う

注文完了までの調整だけを担当し、保存方法や通知方法を知らずに必要な処理を依頼していれば、高凝集・低結合と判断できます。

売上集計や請求書のレイアウト変更まで同じクラスが担当していれば、内部に異なる変更理由が混在しています。さらにSQLや通知APIの詳細まで知っていれば、内部と外部の両方に問題があります。

実務で凝集度と結合度を評価する方法

1. 内部の目的を確認する

対象となるクラスやモジュールについて、「何を担当するものか」を一文で説明します。内部の処理が同じ目的に関係し、同じ理由で変更されるのであれば、凝集度は比較的高いと判断できます。

一文で説明できない場合や、異なる仕様変更によって別々の処理が修正される場合は、複数の目的が混在している可能性があります。

2. 外部への依存を確認する

次に、依存先の何を知っているかを確認します。公開された役割や必要なデータだけを使っているのか、内部データ、処理手順、保存形式などの詳細まで知っているのかを調べます。

依存先の実現方法を変更したときに、利用する側も修正しなければならない場合は、結合度が高い可能性があります。

3. 実際の変更で確かめる

想定される仕様変更を一つ選び、どこを修正することになるか確認します。一つの変更で異なる目的の処理まで修正される場合は凝集度を、依存先の変更が利用側まで波及する場合は結合度を見直します。

この確認によって、内部の責務を整理すべきか、外部との境界を見直すべきかを判断できます。

高凝集・低結合を目的化しない

高凝集・低結合を目指してクラスを細かく分けすぎると、処理の流れを追うために多くのクラスを確認しなければならなくなります。抽象化や中間層を増やしても、内部の目的が曖昧なままでは設計は改善しません。

クラス数や依存先の数ではなく、変更箇所を特定でき、影響範囲を予測できるかで判断することが重要です。

まとめ

  • 凝集度は設計単位の内部、結合度は外部との関係を評価する
  • 二つは別の軸であり、一方だけでは設計状態を判断できない
  • 高凝集は変更箇所をまとめ、低結合は変更の波及を抑える
  • 実務では、内部の目的、外部への依存、実際の変更影響を順に確認する
  • クラスの分割や抽象化自体を目的にしない

関連記事


コメント

タイトルとURLをコピーしました