川獺の外部記憶

なんでも残しておく闇鍋みたいな備忘録

結合度と凝集度についての考察

目次

システムとモジュールについて

  • システム : 開発しようとしている対象全体
  • モジュール : システムを構成する一部分
[システム全体] :システム  
  ├ [モジュール1] :モジュール
  ├ [モジュール2]  
     :  
  └ [モジュールn]  

実際にはモジュールを開発する場合にも対象モジュールをシステムとして捉え、更に細分化したサブモジュールをモジュールとして捉える場合もあります。

結合度、凝集度とは

システムのアーキテクチャを綺麗に保つためにどうすればいいかの方針に「モジュール間の結合度を下げる」「モジュールの凝集度を上げる」いうものがあります。

これらはざっくり説明すると次のようになります。

  • モジュール間の結合度 とは、
    モジュールが相互に連携するために 相互理解がどのぐらい必要か を指す指標です。
  • モジュールの凝集度 とは、
    各モジュールが どのぐらい適切に分業できているか を指す指標です。

これらのように、アーキテクチャ設計においては様々な指標が存在します。
特にソフトウェアシステムではこれらの指標は「ソフトウェアメトリクス」と呼ばれ、不具合の少ないソフトウェアを書くための都市伝説ガイドラインとして使われています。

結合度、凝集度の限界

結合度や凝集度は思想として重要なポイントですが、いきあたりばったりにそれらの指標にこだわった設計をすると以下のようなことになるみたいです。(音が出ます。注意。)

togetter.com

結合度、凝集度の使い方

ここからはソフトウェアシステムに限っての話になりますが、システムを健全に作るためのベストプラクティス、「銀の弾丸」と呼ばれるものはいまだ存在しません。
これはソフトウェア工学に入門したときに最初に教えていただいたことだったと記憶しています。

先程言及した限界の存在から、結合度や凝集度も「銀の弾丸」には程遠い指標です。

少し脱線しますが、アーキテクチャ決定業務で頼れるのは自分自身や所属する組織の思想の強さだけだと思います。この思想を鍛えるための道具として最初は結合度や凝集度のような様々な指標を意識した設計をしてみることが必要なのかな、と考えています。

おまけ

銀の弾丸」の元ネタは1986年にIBMメインフレーム エンジニアだったFrederick Phillips Brooks, Jr. 氏が記した "No Silver Bullet - essence and accidents of software engineering" です。

人月の神話【新装版】 - Amazon.co.jp