ソフトウェア開発メモ

日々のソフトウェア設計、実装で考えている、気づいた事を書いています。それが真実か否かは保証しません。悪しからず。

低凝集度は高結合を促す

書籍「実践UML」によると低凝集なクラス(=モジュール)は高結合を促すとある。そこで何がそうさせるのか、自分の経験と照らし合わせて考察してみた。例としてFacadeクラス内で使われている複数のクラスをFacacdeクラス毎統合した場合を考える。

 統合当初、元のクラスの各インスタンス変数はその通りにカテゴライズされており、メソッドを通じて分離しているが、仕様変更やバグ修正により、違うクラスに属していたインスタンス変数が明確なメソッドを通じてやりとりしなくなる。仕様追加で新たにインスタンス変数が追加されるが、それは元々のクラスのどちらに属すべきなのかも分からないし、そもそも新しいクラスとして分離させるべきは分からない。

 で、事態はが進むうちに当初別々のクラスに属していたインスタンス変数が各メソッド内で混在化していく。ソフトウェアプロジェクトで言うと、各機能のチームリーダーを介さずに各メンバーがやりとりするようなものだ。組み合わせ論的にはその経路はインスタンス変数のべき乗になるだろう。

 当然、リファクタリングすべきだが、適切なタイミングでうまくそれをこなせるようなオブジェクト指向技術の大家なんて(組織にもよるけど)そうそういない。差し迫る納期に追われてとりあえず動かしてデバックという方向に行きやすい。そのうち、神クラスは 1ゼウス、2ゼウス、3ゼウスとどんどん肥大化してくる(1ゼウスは=2000行らしい)。実質そのFacadeクラス内でグローバル変数を使うのと変わらなくなる。インスタンス変数(≒グローバル変数)が過剰に多いクラスは認知心理学的に理解不能になって行く。

 その結果、このクラスから発するバグは原因特定に時間がかかり収束しにくい。また、仕様変更の対応にも時間がかかる。

PS:頭が整理できた。理論武装完了w