LCOM4询问有关计算的方法

时间:2017-02-27 16:36:24

标签: algorithm oop metrics code-metrics lcom

最近,我在计算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 }
}

这个课有两个流程:

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

所以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 }
}

现在这个班只有一个流程:

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

这意味着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语言。

谢谢你们,

1 个答案:

答案 0 :(得分:1)

根据您提供的文件:

  

除了这个仅仅是正式改进的定义   对于LCOM,我们想摆脱更多的语义   LCOM定义中的缺陷:首先,并非罕见   限制访问实例变量的设计原则   专用读/写方法引入异常   这个措施:一个有凝聚力的课程会产生非常好的结果   高LCOM值,,因为所有“真实”方法都会产生   图中的孤立节点,因为它们不直接共享任何节点   实例变量

我将其解释为静态方法和实例方法是分开的,因此整体LCOM4 = 2.定义支持该结果:

  

他们将方法中的内聚力(LCOM)定义为数字   在不相交的实例变量集上运行的方法对,   减少了作用于至少一个共享实例变量的方法对的数量。

在您的情况下,如上所述,LCOM4 = 1 + 1 - 0 = 2。