最近,我在计算LCOM4的过程中遇到了一个问题,这个度量用于查找类的方法和属性是如何被清除的。
LCOM4是“计算方法凝聚力缺乏的第四种方法”,并由Hitz和Montazeri(http://www.isys.uni-klu.ac.at/PDF/1995-0043-MHBM.pdf)描述,目前是定义一个班级拥有多少责任的最佳方法。 / p>
我会尝试不使用特定的开发语言,因为我的问题是针对所有OOP语言。
让我基本上用默认算法解释它对不知道的人的作用:
Class Foo {
property a,b
function f1() { this.a = 1 }
function f2() { this.f1() }
function f3() { this.b = 3 }
}
这个课有两个流程:
所以Foo的LCOM4是2。
让我们改变例如函数f2()来共享属性b。
Class Foo {
property a,b
function f1() { this.a = 1 }
function f2() { this.f1(); this.b = 1 }
function f3() { this.b = 3 }
}
现在这个班只有一个流程:
这意味着Foo的LCOM4现在为1.
LCOM4 = 0或LCOM4 = 1表示该类没有或只有1个责任,这是每个开发人员必须为他们的类所需要的,因为他们尊重 S <的 S / strong> OLID良好做法。
您可以在此处找到有关图表的更多信息:http://www.aivosto.com/project/help/pm-oo-cohesion.html#LCOM4
让我们想象你写了一个类似这样的课:
Class Bar {
property a
static function build() { return new self }
function Bar() { this.a = 5 }
}
...当然,在执行new self
时,我创建了一个使用声明的方法Bar
构建的新Bar实例。
根据Hitz和Montazeri的作品,我班Bar
的LCOM4是什么?
我使用的很多度量工具都说LCOM4 = 2,但对我来说,该类只有1个责任,所以它的LCOM4必须为1。
此外,即使它不是非常明确,方法build()
和Bar()
必须属于同一个函数图形,而build()
正在调用Bar()
(嗯,我知道,它是调用另一个实例,但即使它不是同一个对象,它也是同一个类。)
您对此有何看法?
有没有人有关于如何处理这类课程的答案? (我读了很多Hitz和Montazeri的文件,但我可能会想念一些)
如果没有答案,我们是否可以改进计算LCOM4的方式,使其更接近一类的责任?
顺便说一下,关于这个的案例是用PHP编写的,但我认为这个问题也涉及所有其他OOP语言。谢谢你们,
答案 0 :(得分:1)
根据您提供的文件:
除了这个仅仅是正式改进的定义 对于LCOM,我们想摆脱更多的语义 LCOM定义中的缺陷:首先,并非罕见 限制访问实例变量的设计原则 专用读/写方法引入异常 这个措施:一个有凝聚力的课程会产生非常好的结果 高LCOM值,,因为所有“真实”方法都会产生 图中的孤立节点,因为它们不直接共享任何节点 实例变量。
我将其解释为静态方法和实例方法是分开的,因此整体LCOM4 = 2.定义支持该结果:
他们将方法中的内聚力(LCOM)定义为数字 在不相交的实例变量集上运行的方法对, 减少了作用于至少一个共享实例变量的方法对的数量。
在您的情况下,如上所述,LCOM4 = 1 + 1 - 0 = 2。