Object Cohesion: Why It Matters

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

您很可能已经听说过Elegant Objects(EO),这是一种替代的面向对象编程范式,它声称对象必须是不可变的、不包含静态方法、在代码中不使用NULL、不使用注解等等。我们,EO的信徒,声称了很多事情,但并非所有人都相信我们。那些不相信者在这里声称我们是恶意挑衅者,顶多而已。他们的主要观点是:每个人的工作方式都不同,为什么我们要听你们的?对于他们,我没有答案……直到我创建了jPeek并开始研究对象的内聚性

让我解释一下内聚性如何帮助我们,EO的信徒,证明我们的一些假设。

作为软件模块的特征,内聚性是由Larry Constantine在1974年发明的,而那时我甚至还不存在。这是它的意思;请看这个简单的Java类的示例:

有两个属性和两个方法。方法addTitle()与属性titles一起工作,而方法addPrice()仅与属性prices一起工作。这个类的内聚性很低,因为属性titlesprices之间没有任何关联。我们可以很容易地将这个类分成两个部分而不会失去任何东西。

现在,我们有两个更加内聚的类:它们的属性和方法是相互关联的。我们不能再改变Books1,因为每个属性都被每个方法所需要。

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

我们能把它分成更小的部分吗?不可以。我们不能把课程的任何一部分拆分出来。属性titles和这两个方法必须保持在一起。这意味着这个类是高度内聚的。

早些时候就证明了,从错误的角度来看,更内聚的类比低内聚的类更好,例如Victor R. Basili等人在他们的研究《面向对象设计度量作为质量指标的验证》中证明了这一点(链接)。

现在,如果我们能够实证地证明,例如,没有静态方法的类在平均情况下比那些富含静态方法的类更内聚,我们就可以说,“静态方法是邪恶的”(由Elegant Objects提出)这一说法是经过科学验证的。我们可以拿一大组随机的Java类来计算它们的内聚性。然后,我们可以将具有静态方法的类与没有静态方法的类分开。接下来,我们可以计算哪个组的平均内聚性更高。如果没有静态方法的组获胜,那么这个假设就是有效的。

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

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

使用这个工具,我们可以实证EO的一些关键观点。例如,我们可以证明可变类的内聚性更低,注解对内聚性产生负面影响,DTO是低内聚性的实体,以及其他许多事情。因此,内聚性将成为推动Elegant Objects达到大部分观点得到科学证实的工具。再给我们几年时间,我们将会有非常有趣的结果。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 14:31

sixnines availability badge   GitHub stars