LCOM4询问有关计算的方法

nic*_*noe 9 oop algorithm metrics code-metrics lcom

最近,我在计算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 }
}
Run Code Online (Sandbox Code Playgroud)

这个类有两个流程:

  • 属性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 }
}
Run Code Online (Sandbox Code Playgroud)

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

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

这意味着Foo的LCOM4现在为1.

LCOM4 = 0或LCOM4 = 1表示班里有没有或只有1名责任,这是每个人都必须要为自己的班级,因为他们尊重小号小号奥利德良好做法.

您可以在此处找到有关图表的更多信息: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 }
}
Run Code Online (Sandbox Code Playgroud)

...当然,在做的时候new self,我创建了一个使用Bar声明的方法构建的Bar的新实例.

根据Hitz和Montazeri的作品,我班级的LCOM4是Bar什么?

我用的都是说LCOM4 = 2的度量工具很多,但对我来说,类只有1名责任,因此其LCOM4必须为1.此外,即使它不是真正明确的,这两种方法build()Bar()必须属于功能相同的图正如build()调用Bar()(嗯,我知道,它正在调用另一个实例,但即使它不是同一个对象,它也是同一个类).

你对这个有什么看法?

有没有人有关于如何处理这类课程的答案?(我读了许多Hitz和Montazeri的文件,但我可能会想念一些)

如果没有答案,我们是否可以改进计算LCOM4的方式,使其更接近一类的责任?

顺便说一下,关于这个的案例是用PHP编写的,但我认为这个问题也与其他所有OOP语言有关.

感谢你们,

Gil*_* AB 1

根据您提供的文档:

\n\n
\n

除了 LCOM 定义的形式改进之外,我们还希望消除 LCOM 定义中的更多语义缺陷:首先,将实例变量的访问限制为不罕见的设计原则\n 特殊用途的读/写方法引入了此测量的异常情况:否则内聚类将产生非常高的 LCOM 值,因为所有 \xe2\x80\x9creal\xe2\x80\x9d 方法都会产生\n \n 图中的孤立节点,因为它们不再直接共享任何\n 实例变量

\n
\n\n

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

\n\n
\n

他们将方法缺乏内聚性 (LCOM) 定义为作用于不相交的实例变量集的方法对的数量,\n 减去作用于至少一个共享实例变量的方法对的数量。

\n
\n\n

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

\n