高凝集性 is 何?
CLEAN コードの C は Cohesive = 高凝集性 の C です。
コードが高凝集だと,コードを変更するときに影響範囲を考えるのが楽になります。
高凝集を実現する方法は,「関連しているもの同士は近づけて,関連していないものは切り離しておく」ことです。
具体的には,
- 関心が近い変数・関数同士は近くに集める
- 関連がないメソッドや変数は別々のクラスにする
などの方法が考えられます。
Lack of Cohesion in Methods
この「高凝集」だといいよね!というお気持ちを,先人達は定量化しようと試みてきました。
その成果のひとつが LCOM です。LCOM は Lack of Cohesion in Methods(メソッド内の凝集性の欠如度合い)のアクロニムで、その値が低いほど凝集したコードであることを意味します。
📚 参考 : Cohesion metrics
LCOM には LCOM1,…,LCOM4 と種類があり,いろんなメトリクスが提唱されていますが,LCOM4
(M.Hiz and B.Montazeri) が実用上よく使われるみたいです。
その計算方法をみてみましょう 👇
LCOM4 の計算方法
- クラス内のメソッドとメンバ変数をノードとしたグラフを考える。
- 参照し,参照されるノード同士を辺で結ぶ。
- 非連結なグラフ(=コンポーネント)の個数が、
LCOM4
である
図にすると,以下のような感じです。
LCOM4 は常に自然数になりますが,
- LCOM4 = 1 ➡︎ 高凝集。最も好ましいクラスの状態。
- LCOM4 ≧ 2 ➡︎ 低凝集。コンポーネントをクラスとして分割することを推奨。
グラフじゃない方法でシンプルに描いてみました 👇
定義上 LCOM はクラス設計における指標ですが,この考え方は
- 関数の設計
- モジュールの設計
- ディレクトリ構成
などのレベルの設計でも適用できそうです。
とはいっても,実用上はこんなのをいちいち計算せず,非連結なコンポーネントを見つけたら積極的に切り離すみたいな感じでリファクタリングしていくのがいいんじゃないかと思います。
まとめ
- 「高凝集性」は,相互に参照するものが近くにあるという性質のことです
- 「高凝集」なコードは,変更の影響範囲がわかりやすく,保守性が高いです
- 「高凝集性」を定量化した LCOM4 という指標がある
おわり