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)
这个类有两个流程:
所以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)
现在这个类只有一个流程:
这意味着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语言有关.
感谢你们,
根据您提供的文档:
\n\n\n\n\n除了 LCOM 定义的形式改进之外,我们还希望消除 LCOM 定义中的更多语义缺陷:首先,将实例变量的访问限制为不罕见的设计原则\n 特殊用途的读/写方法引入了此测量的异常情况:否则内聚类将产生非常高的 LCOM 值,因为所有 \xe2\x80\x9creal\xe2\x80\x9d 方法都会产生\n \n 图中的孤立节点,因为它们不再直接共享任何\n 实例变量。
\n
我将其解释为静态方法和实例方法是分开的,因此总体 LCOM4 = 2。定义支持该结果:
\n\n\n\n\n他们将方法缺乏内聚性 (LCOM) 定义为作用于不相交的实例变量集的方法对的数量,\n 减去作用于至少一个共享实例变量的方法对的数量。
\n
在您的情况下,如上所述,LCOM4 = 1 + 1 - 0 = 2。
\n| 归档时间: |
|
| 查看次数: |
814 次 |
| 最近记录: |