知识卡片
SDP稳定依赖原则:稳定性的量化定义与Fan-in/Fan-out指标
内容
稳定依赖原则(SDP)要求依赖关系必须指向更稳定的方向:任何预期会经常变更的组件,都不应该被一个难以修改的组件所依赖——否则这个原本设计为易变的组件也会被拖得难以修改,哪怕它自身没有一行代码需要改,光是”被别人依赖”这件事本身就已经构成了修改上的挑战。理解这条原则的前提是重新定义”稳定性”:把硬币竖着立住,它不会因为长期不倒就被认为是稳定的——稳定性和变更频率无关,而和”推倒它需要多大的动作”(变更所需的工作量)有关,硬币不稳定是因为轻轻一碰就倒,桌子稳定是因为掀翻它需要很大力气。放到软件组件上,让一个组件难以修改的最直接办法就是让很多其他组件依赖它:入向依赖越多,任何变更就越需要顾及所有依赖它的组件,因此可以被量化——Fan-in(入向依赖,组件外部类依赖组件内部类的数量)和Fan-out(出向依赖,组件内部类依赖组件外部类的数量)共同定义了不稳定性指标I=Fan-out/(Fan-in+Fan-out),取值范围[0,1]:I=0代表最稳定(只被依赖、不依赖别人,”负责、不对外依赖”),I=1代表最不稳定(不被任何人依赖、却依赖了别人,”不负责、对外依赖”)。SDP的具体要求是:组件结构依赖图中,每个组件的I指标必须大于它所依赖组件的I指标——换句话说,沿依赖方向,I指标必须递减。当然不是所有组件都该处在最高稳定性,一个全员I=0的系统根本无法再变更,架构设计的真正任务是决定”该让哪些组件稳定、哪些不稳定”,通常把易变组件放在依赖图顶层、稳定组件放在底层,这样任何违反SDP的”箭头向上”依赖都能一眼看出来。
参考来源
- 位置:《架构整洁之道》第14章《组件耦合》"稳定依赖原则""稳定性""稳定性指标"(源文件:_epub-src/text/part0013_split_003.html)
- 结论依据:原文用硬币与桌子的类比定义稳定性=变更所需工作量而非变更频率,给出Fan-in/Fan-out及不稳定性指标I的公式,并明确SDP要求依赖图中I指标沿依赖方向递减,直接支撑本卡片结论。
- 原始内容:任何一个我们预期会经常变更的组件都不应该被一个难于修改的组件所依赖……稳定性应该与变更所需的工作量有关……I=Fan-out/(Fan-in+Fan-out)……稳定依赖原则(SDP)的要求是让每个组件的I指标都必须大于其所依赖组件的I指标。