最近,我在计算 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 语言。
感谢你们,