高内聚中的LCOM4指标衡量
经常说的软件“低耦合,高内聚”,哪么如何衡量高内聚呢?其实原来在sonar qube中有一个指标叫LCOM4,用来衡量。
一个类是否有高内聚性,可以使用LCOM4来度量。LCOM4用来说明class内部方法和变量之间的关系, 值越大, 说明内聚性越差. 一般情况下 LCOM4=1是内聚性最佳的. LCOM4=2说明可以拆成两个类, 以此类推。如何判断两个方法是否有关系了?举个例子:我们有一个类,类中有两个方法A和B,如果满足下面一个条件,我们就认为这两个方法有联系:
1)他们都调用了同一个类级别的变量。
2)方法A调用了方法B,或者方法B调用了方法A。
官网的一个图片来解释
上面的图中,有两个类,他们都是由两个类级别的变量x,y和5个方法(A,B,C,D,E)组成的。左边的图中方法A调用了方法B,方法B存取了实例变量x,方法C和方法D存取了变量y,方法D又调用了方法E。方法A,B以及实例变量x和方法C,D,E没有任何关系,所以缺乏凝聚度量为2,建议拆分为两个类。右边的图就不多做解释了,所有的方法之间紧密联系,内聚度很高
Sonar2.0带来了实验性且有前途的度量:用LCOM4 (缺乏内聚性的方法)来衡量类的内聚性。解释这个度量是非常简单的,值1表示这个类只有一个职责(好),值X代码这个类有X个职责(差),值X得类应该重构/分割。
当进入Sonar,事情仍然非常简单。在项目面板的第一个窗口小部件就可以快速的查看:
[img]http://sonar.codehaus.org/wp-content/uploads/2010/03/sonar_lcom4_widget.png [/img]
参考文档:
1) http://www.aivosto.com/project/help/pm-oo-cohesion.html