首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于计算方法的LCOM4询问

关于计算方法的LCOM4询问
EN

Stack Overflow用户
提问于 2017-02-27 16:36:24
回答 1查看 2.3K关注 0票数 9

最近,我在计算LCOM4时遇到了一个语义问题,这是一种度量,用于查找类的方法和属性是如何相干性的。

引言

LCOM4是“计算方法缺乏凝聚力的第四种方法”,Hitz和Montazeri (http://www.isys.uni-klu.ac.at/PDF/1995-0043-MHBM.pdf)对其进行了描述,目前是定义一个类拥有多少响应度的最佳方法。

我将尽量不使用特定的开发语言,因为我的问题是针对所有OOP语言。

让我用默认的算法向不知道的人解释一下它是如何工作的:

代码语言:javascript
复制
Class Foo {
    property a,b

    function f1() { this.a = 1 }
    function f2() { this.f1() }
    function f3() { this.b = 3 }
}

这个类有两个流:

  • 属性a由f1()和f2()共享
  • 属性b由f3()共享

所以Foo的LCOM4是2。

例如,让我们将函数f2()更改为也共享属性b。

代码语言:javascript
复制
Class Foo {
    property a,b

    function f1() { this.a = 1 }
    function f2() { this.f1(); this.b = 1 }
    function f3() { this.b = 3 }
}

现在这个类只有一个流:

  • 两个属性a和b都由f1()、f2()和f3()共享。

这意味着Foo的LCOM4现在是1。

LCOM4 =0或LCOM4 =1意味着类没有或只有一个响应性,这是每个开发人员对其类都必须要的,因为它们尊重SOLID良好实践的S

您可以在这里找到更多的图表信息:http://www.aivosto.com/project/help/pm-oo-cohesion.html#LCOM4

我的问题

让我们想象一下,你写了一个这样的类:

代码语言:javascript
复制
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语言。

谢谢你们,

EN

回答 1

Stack Overflow用户

发布于 2017-03-19 19:36:49

根据你提供的文件:

除了对LCOM定义的这种形式上的改进之外,我们还想消除LCOM定义中的一个更多的语义缺陷:第一,将实例变量的访问限制到特定目的的读写方法的设计原则并不少见,引入了这种方法的异常:否则内聚类将产生非常高的LCOM值,所有“真实”方法都会产生图中的孤立节点,因为它们不再直接共享任何实例变量。

我将其解释为静态方法和实例方法是分开的,因此是总的LCOM4 = 2。

它们将方法中缺乏凝聚力(LCOM)定义为在不相交的实例变量集上操作的方法对的数量,减少了至少一个共享实例变量上的方法对的数量。

在您的例子中,LCOM4 =1+1-0=2,如前所述。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42490962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档