Skip to content

组件耦合

当设计从类级别上升到组件级别时,类与类之间的耦合原则就不够用了,需要一套新的原则来控制组件之间的依赖关系。组件是比类更大的发布和复用单元,它的依赖一旦失控,影响范围也远大于单个类。

ADP:无环依赖原则

组件依赖图中不应出现环路。如果 A 依赖 B,B 依赖 C,那么 C 绝不能依赖 A。循环依赖会导致组件无法独立测试和独立发布,任何一处变更都可能沿环路产生连锁反应,让整个组件群一起被迫重新构建。

打破循环依赖的常用办法是引入新的抽象组件,或通过依赖倒置把原来的依赖链条反转,让稳定的抽象居于中间,把两个相互纠缠的组件隔开。

SDP:稳定依赖原则

依赖应该指向更稳定的方向。不稳定的组件(容易变化的)应当依赖稳定的组件(不易变化的);一旦一个稳定的组件反过来依赖了一个易变组件,那么每次易变组件修改都会迫使稳定组件跟着变动,这就违背了它被广泛依赖的初衷。

组件的稳定性可以用"入度"和"出度"来衡量:被越多组件依赖(入度大)、自身依赖越少组件(出度小),就越稳定。设计时要让依赖箭头整体指向入度大、出度小的方向。

SAP:稳定抽象原则

一个组件越稳定,它就应该越抽象。稳定的组件被广泛依赖、不应频繁变化,因此更应是抽象的接口或基类;不稳定的组件可以频繁变化,因此可以是具体的实现。这与 SDP 结合起来,就形成了组件设计的总体方针:向着"稳定且抽象"的方向努力,避免"不稳定且具体"的组件——后者既容易变又被广泛依赖,是耦合灾难的温床。

值得注意的是,组件耦合原则与更底层的作用域管理一脉相承:作用域层面要求避免循环依赖、保持单向依赖,到了组件层面,只是把同样的约束放大到了更大的发布单元上。