对象凝聚力:为什么重要

您可能最了解典雅对象 (EO),这是一种替代的面向对象的范例,它声称对象必须是不可变的,没有静态方法 ,永远不要在其代码中使用NULL ,不使用注释 ,等等。 EO专家我们声称有很多事情,但没有多少人相信我们。 这些非信徒 ,我们是巨魔,充其量。 他们的主要论点是:每个人的工作方式都不一样,为什么我们要听你的话? 对于他们,我没有答案……好吧,直到我创建jPeek并开始研究对象凝聚力之前,我都没有答案。

对象凝聚力:为什么重要

EO专家,让我解释一下凝聚力如何帮助我们证明我们的某些假设。

凝聚力是软件模块的一个特性,它是我1974年由拉里·康斯坦丁Larry Constantine )发明的,当时我还不存在。 看一下这个简单的Java类:

有两个属性和两个方法。 addTitle()方法适用于属性titles ,而addPrice()方法仅适用于属性prices 在此类中,内聚性很低 ,因为属性titlesprices之间没有任何关联。 我们可以轻松地将此课程分为两部分,而不会丢失任何内容:

现在,我们有了两个更多的内聚类:它们的属性和方法相互关联。 我们无法再破坏Books1 ,因为每种方法都需要每个属性。

这是高度内聚的类的另一个示例:

我们可以把它分成小块吗? 不,我们不能。 我们不能上课的任何一部分。 属性titles和这两种方法必须保持在一起。 这意味着该课程具有高度的凝聚力。

很久以前就已经证明,就内在错误的倾向而言,更多的内聚类比内聚性低的类更好,例如Victor R. Basili等人。 在他们的研究中, 将面向对象的设计指标作为质量指标进行验证

现在,如果我们可以凭经验证明,例如,没有静态方法的类比具有丰富静态知识的类平均而言更具凝聚力,那么我们可以说“静态方法是邪恶的”(由Elegant Objects假设)的说法是经过科学验证。 我们可以采用大量随机Java类,并计算它们的内聚性。 然后,我们可以将那些使用静态方法的方法与那些没有静态方法的方法分开。 接下来,我们可以计算出哪个组具有更高的平均内聚力。 如果没有静态方法的组获胜,则该假设将成立。

当然,另一组随机的Java类可能会产生不同的结果,但这就是经验科学的工作原理:除了通过一些实验,我们无法证明该定理。

我创建了一个开源软件库来帮助我进行这些实验,并将其命名为jPeek.org 它是Java代码的内聚度量标准的计算器。 毫不奇怪,我们可以使用许多度量来计算内聚力。 其中至少有三十个已发布,而只有少数几个已正确实施。 在jPeek中,由于其贡献者,我们成功实施了十几个。

使用此工具,我们可以凭经验证明EO的一些关键点。 例如,我们可以证明可变类的内聚性较低,注释对内聚性产生负面影响, DTO是低内聚性生物,还有许多其他事情。 因此,凝聚力将成为驱使优雅物件到达其大部分主张得到科学证明的地方的工具。 再给我们几年,我们将获得非常有趣的结果。

翻译自: https://www.javacodegeeks.com/2020/02/object-cohesion-why-it-matters.html