凝集度の計測方法

ドメイン駆動設計入門に、凝集度を測る手法として LCOM(Lack of Cohesion in Methods) というものが紹介されていた。

ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本

ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本

  • 作者:成瀬 允宣
  • 出版社/メーカー: 翔泳社
  • 発売日: 2020/02/13
  • メディア: 単行本(ソフトカバー)

DDDとあまり関係ない話だったけど、便利そうな考え方なので紹介します。

LCOMにとっての凝集度最高の状態とはすべてのインスタンス変数がすべてのメソッドから使われている状態。メソッドから使われてないインスタンス変数が多いとき、凝集度が低いとみなす。

この考え方を聞いて最初戸惑ったけど、いくつかのケースをシミュレーションしてみたところ、なかなか有用な尺度な気がしてきた。

例として挙げられているのが、UserApplicationServiceがRegister, Deleteの2メソッドを持っていて、Deleteがインスタンス変数userServiceを使ってないとき、LCOMとしては凝集度が低い状態と言える。

f:id:kmdsbng:20200216154024p:plain
凝集度の低いクラス

こういうケースの改善手法はクラスを分割すること。

f:id:kmdsbng:20200216154047p:plain
凝集度の高いクラス

これで凝集度の高い2クラスに分割できた。

ただ、機械的にLCOMを適用して高凝集度を目指すのはよくない気がする。 そうではなくクラスが複数の責務を背負ってそうなわだかまりを感じたとき、LCOMを利用してコードを改善するのが良さそう。 LCOMを使えば個人の感覚に依存せずに定量的な指標として使えるので、複数人で開発しているときに、コード修正方針への抵抗感を減らせて良さそう。