《架构整洁之道》摘录 – 14.4
第 14 章 – 组件耦合 – 4
稳定抽象原则
一个组件的抽象化程度应该与其稳定性保持一致。
代表了系统高阶策略的组件应该被放到稳定组件(I=0)中,而不稳定的组件(I=1)中应该只包含那些我们想要快速和方便修改的部分。
稳定抽象原则(SAP)为组件的稳定性与它的抽象化程度建立了一种关联。一方面,该原则要求稳定的组件同时应该是抽象的,这样它的稳定性就不会影响到扩展性。另一方面,该原则也要求一个不稳定的组件应该包含具体的实现代码,这样它的不稳定性就可以通过具体的代码被轻易修改。
因此,如果一个组件想要成为稳定组件,那么它就应该由接口和抽象类组成,以便将来扩展。
将 SAP(稳定抽象原则)与 SDP(稳定依赖原则)这两个原则结合起来,就等于组件层次上的 DIP(依赖反转原则)。因为 SDP 要求的是让依赖关系指向更稳定的方向,而 SAP 则告诉我们稳定向本身就隐含了对抽象化的要求,即依赖关系应该指向更抽象的方向。跟 DIP 不同的是,在组件层面上,我们要允许一个组件部分抽象,部分稳定。
以稳定性 I 作为 X 轴,抽象化程度 A 作为 Y 轴。(0, 0) 周围的这个区域称为痛苦区,不可变组件落在这一区域是无害的。只有多变的软件组件落在这一区域才会造成麻烦。
(1, 1) 这个位置则表示这些组件是无限抽象的,而且没有被其他组件依赖,这样的组件往往无法使用。这个区域是无用区。
组件应该在主序列线(从 (1, 0) 到 (0, 1) 的线)附近,最优的位置是这条线的两端。
设计不好,需要重点分析,进行改造的组件:过于抽象而有没有多少其他组件依赖它,或者过于具体而又被依赖得太多