9

最近,我在计算 LCOM4 的方式中遇到了一个语义问题,LCOM4 是一种用于确定类的方法和属性如何内聚的度量。

介绍

LCOM4 是“计算缺乏凝聚力的第 4 种方法”,并已由 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 }
}

这个类有两个流程:

  • 属性 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 OLID 良好实践的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 }
}

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

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

我使用的很多度量工具都说 LCOM4=2,但对我来说,这个类只有 1 个责任,所以它的 LCOM4 必须是 1。此外,即使它不是很明确,两种方法build()Bar()必须属于同一个函数图就像build()调用一样Bar()(嗯,我知道,它正在调用另一个实例,但即使它不是同一个对象,它也是同一个类)。

你对此有何看法?

有没有人知道如何处理这类课程?(我读了很多 Hitz 和 Montazeri 的文件,但我可能错过了一些)

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

顺便说一句,我的情况是在 PHP 中,但我认为这个问题也涉及所有其他 OOP 语言。

感谢你们,

4

1 回答 1

1

根据您提供的文档:

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

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

他们将方法内聚不足 (LCOM) 定义为对不相交的实例变量集进行操作的方法对的数量,减去对至少一个共享实例变量起作用的方法对的数量。

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

于 2017-03-19T19:36:49.353 回答