最近,我在计算LCOM4时遇到了一个语义问题,这是一种度量,用于查找类的方法和属性是如何相干性的。
引言
LCOM4是“计算方法缺乏凝聚力的第四种方法”,Hitz和Montazeri (http://www.isys.uni-klu.ac.at/PDF/1995-0043-MHBM.pdf)对其进行了描述,目前是定义一个类拥有多少响应度的最佳方法。
我将尽量不使用特定的开发语言,因为我的问题是针对所有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意味着类没有或只有一个响应性,这是每个开发人员对其类都必须要的,因为它们尊重SOLID良好实践的S。
您可以在这里找到更多的图表信息: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 }
}当然,在执行...and时,我使用Bar声明的方法创建了一个新的Bar实例。
基于Hitz和Montazeri的作品,我类的LCOM4是什么Bar?
我使用的许多度量工具都是LCOM4=2,但对我来说,类只有一个响应性,所以它的LCOM4必须是1。而且,即使它不是很明确,build()和Bar()都必须属于build()调用Bar()的函数图(我知道,它在调用另一个实例,但即使它不是同一个对象,它也是同一个类)。
你对此有何看法?
有人知道如何处理这类课程吗?(我读过Hitz和Montazeri的许多文件,但我可能错过了一些)
如果没有答案,我们能改进计算LCOM4的方法,使其更接近于类的响应数吗?
顺便说一下,我的例子是PHP,但我认为这个问题也涉及到所有其他OOP语言。
谢谢你们,
发布于 2017-03-19 19:36:49
根据你提供的文件:
除了对LCOM定义的这种形式上的改进之外,我们还想消除LCOM定义中的一个更多的语义缺陷:第一,将实例变量的访问限制到特定目的的读写方法的设计原则并不少见,引入了这种方法的异常:否则内聚类将产生非常高的LCOM值,所有“真实”方法都会产生图中的孤立节点,因为它们不再直接共享任何实例变量。
我将其解释为静态方法和实例方法是分开的,因此是总的LCOM4 = 2。
它们将方法中缺乏凝聚力(LCOM)定义为在不相交的实例变量集上操作的方法对的数量,减少了至少一个共享实例变量上的方法对的数量。
在您的例子中,LCOM4 =1+1-0=2,如前所述。
https://stackoverflow.com/questions/42490962
复制相似问题