/note/tech

「ソフトウェア設計の結合バランス」から学ぶ、高凝集・疎結合を三次元で考えるモジュール設計

要約:

■ 1. 記事の概要

  • テーマ: アーキテクチャ、設計、DDD、マイクロサービス
  • 従来の凝集度・結合度モデルの限界を指摘し、「均衡結合モデル」を提案
  • 記事を通じてECサイトの注文処理・在庫管理を一貫した実例として使用

■ 2. 従来モデルの限界

  • 物理的に接続されない結合(ロジック重複など)を評価する枠組みが欠落している
  • 同じ結合であっても、異なるチーム間では変更労力が異なる点が考慮されていない
  • 設計コストの優先順位を調整する機能が不足している

■ 3. 均衡結合モデルの概要

  • 結合は排除するものではなく管理するものであるという考え方を基盤とする
  • 評価の3次元:
    • 強度(統合強度): 共有される知識の種類による依存の深さ
    • 距離: 結合されたコンポーネント間の物理的・組織的隔たり
    • 変動性: コンポーネントが変更される頻度
  • 判定式: 均衡度 = (強度 XOR 距離) OR NOT 変動性
    • 強度と距離が対応関係にあるか、変動性が低ければ設計は均衡していると判定される

■ 4. 統合強度の4分類

  • 侵入結合(最強):
    • 他コンポーネントの非公開実装詳細に依存する
    • 内部実装の変更が即座に依存側を破壊する
    • 例: 注文サービスが在庫サービスのDBテーブルを直接操作
  • 機能結合:
    • 対称機能結合が最も問題であり、複数コンポーネントが物理接続なく同じビジネスルールを重複実装する
    • 静的解析ツールやアーキテクチャ図では発見できず、変更影響の見落としリスクが最高
  • モデル結合:
    • 内部型そのものを他のコンポーネントに公開する
    • エンティティの構造変更が参照するすべてのコンポーネントに波及する
  • コントラクト結合(最弱):
    • 統合専用に設計された契約のみを共有する
    • 内部実装やドメインモデルが変更されても、コントラクトが変わらなければ影響しない

■ 5. 結合強度と距離による4パターン

  • 強度低い × 距離近い = 局所的複雑性:
    • 関連性のないコンポーネントが同じ場所に混在する
    • 認知負荷は増大するが、変更影響は波及しない
  • 強度低い × 距離遠い = 疎結合(良い分離):
    • 関連性が低いコンポーネントが離れて配置される
    • 互いに影響を与えずに独立して進化できる
  • 強度高い × 距離遠い = 大域的複雑性(最悪):
    • 強く依存しているのに離れてしまっているパターン
    • モノリスからマイクロサービス移行時にDB分割が後回しになった場合などが該当
    • マイクロサービスに分割しても共有知識が多ければ「分散した巨大な泥団子」になるだけである
  • 強度高い × 距離近い = 高凝集(良い結合):
    • 強く依存するコンポーネントが近く配置される
    • 変更影響範囲が限定され、管理しやすい

■ 6. 変動性の概念と適用

  • 変動性の定義と役割:
    • 変動性が低ければ判定式の NOT 変動性 が真となり、強度・距離のバランスにかかわらず均衡と判定される
    • 変更されないものは複雑なままでも問題にならない
    • ただし「開発が終了しているから変更されない」という解釈には慎重であるべきであり、環境変化による予期しない変更が起こり得る
  • DDDサブドメインとの連携:
    • 汎用サブドメイン: 既存ソリューションで対応可能であり、低変動性
    • 支援サブドメイン: 単純で設計後は変更が少なく、低変動性
    • コアサブドメイン: 競争優位性の源泉であり、高変動性
  • ビジネス戦略による変動性の変化:
    • 変動性は固定的ではなく、ビジネス戦略の変化により変わる
    • 低変動性として許容していた重複実装が、戦略変化により高変動性に転じた場合は設計の見直しが必要になる
    • 変動性は現時点の評価であり、ビジネス戦略の変化に応じて設計の均衡を見直す姿勢が重要

■ 7. モデルの位置づけと目的

  • 均衡結合モデルを絶対的評価基準とすることは意図していない
  • 統合強度・距離・変動性という3次元がどのように連携するかを理解し、設計のトレードオフを議論するための共通言語として活用することが本来の目的