クラスの凝集度を示すメトリクス:LCOM*

ソフトウェアメトリクスについて調査中です。今日はLCOM*について。

LCOM*とはLack of Cohision in Methods(メソッドの凝集度の欠陥)を示しており、以下の式で定義されます。

             1   a
           ――――― Σ μ( Aj ) - m
             a   j
LCOM* = ―――――――――――――――――――――――――
           1 - m

ここで、mはクラスに含まれるメソッドの数、aはクラスに含まれるインスタンス変数の数、μ(Aj)j番目のインスタンス変数にアクセスするメソッドの数です。

LCOM*はクラスごとに算出される値で、[0, 1]の値を取ります。

0だとすべてのメソッドがすべてのインスタンス変数にアクセスしていて、そのクラスは凝集度が高いと言えます。左がメソッドで右がインスタンス変数だとしたら、LCOM*=0のときは以下の図のようになります。

f:id:fjkz:20160424204412p:plain

一方で、1だと1つのメソッドしかそれぞれのインスタンス変数にアクセスしていないので凝集度が低いということになります。どのメソッドも最低でも1つのメソッドからアクセスされることを期待しています。LCOM*=1のときは以下のようになります。

f:id:fjkz:20160424204752p:plain

メソッドインスタンス変数の関係は要するに2部グラフです。Σ μ(Aj)はグラフのエッジの数となる。


[0, 1]になるように正規化しているようだが、この正規化が妥当かは疑問だ。一般にメソッドの数の方がインスタンス変数の数より多い。以下のようなインスタンス変数にアクセスしないメソッドがいたらLCOM*=1になる。

f:id:fjkz:20160424210937p:plain

しかし、以下のように2つ以上のメソッドインスタンス変数にアクセスすればLCOM*は低くなる。

f:id:fjkz:20160424211016p:plain

メソッドが多ければLCOM*は低く見えてしまう。値に対する操作が1つのクラスに集まっていれば、凝集度が高いと言えるので良いという意味なのだろうか。

また、この場合にはグラフは連結していないので、メソッドが増えたとしても凝集度は低いはずだ。LCOMにはグラフが連結しているかどうかという観点が抜けている。

LCOMが高いのはよくなさそうだが、LCOM=0がいいかというとそれも疑問だ。LCOM=0になるようには作れないだろう。良いものを見つけるのでなく、悪いものを見つけるのがメトリクスの目的と考えればよいのだろうか。

www.amazon.co.jp