现代C++软件架构:方法与实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.8.2 内聚

内聚衡量的是软件中单位元素的关联程度。在高内聚的系统中,同一模块中的组件所提供的功能是密切相关的,感觉就像这些组件是共生的一样。

在类级别上,方法操作的字段越多,类的内聚性就越强。这意味着常见的低内聚数据类型是那些庞大的类。当类中发生太多的事情时,它很可能没有内聚,也破坏了单一责任原则(SRP),这些类很难维护,并且容易出现bug。

较小的类也可能不是内聚的。请考虑以下示例。这个例子可能看起来很小,但真实场景的代码通常有成千上万行,都贴过来是不切实际的:

可以看到,我们的处理器类实际上做了三种工作:实际的工作、结果缓存工作和侦听器管理工作。在这种情况下,增加内聚性的一种常见方法是抽象出一个类,甚至是多个类:

现在每个部分都由一个独立、内聚的类来完成。现在也可以很容易地重用这些类。即使将它们变成模板类,也只需要很少的工作。最后,测试这些类也更容易。

内聚原则在组件或系统级别上也很简单——所设计的每个组件、服务和系统都应该很简洁,专注于做一件事并做好它。耦合与内聚的对比如图1.2所示。

图1.2 耦合与内聚的对比

低内聚高耦合的软件通常难以测试,难以复用,难以维护,甚至难以理解,因此它缺乏软件中通常需要的许多质量属性。

这些术语通常会结合在一起考虑,因为通常一个特征会影响另一个特征,不管我们谈论的是函数、类、库、服务,还是整个系统。举个例子,大的单体服务通常是低内聚高耦合的,而分布式服务往往是高内聚低耦合的。

第1章到此结束。现在,我们来总结一下所学到的内容。