背景介绍
这是我的《架构整洁之道》系列的第十四篇,这篇文章的内容为稳定依赖原则。
《架构整洁之道》系列:
稳定依赖原则
依赖关系必须要指向更稳定的方向。
任何一个我们预期会经常变更的组件都不应该被一个难于修改的组件所依赖,否则这个多变的组件也将会变得非常难以被修改。
稳定性
Webster 在线字典中的描述: 稳定指的是“很难移动“。
那么一个立在桌子上的硬币是稳定的么?
当然不是,一碰就倒
而相比起来,桌子就更加的稳定,因为移动它需要我们要更大的力。
所以类比下来,组件的稳定性也与其变更难度有关。本章节关于修改难度就集中于“依赖”这一点,而让软件组件难于修改的一个最直接的办法就是让很多其他组件依赖于它。带有许多入向依赖关系的组件是非常稳定的,因为它的任何变更都需要应用到所有依赖它的组件上。
- 独立组件
上图中 x 是一个稳定的组件。因为有三个组件依赖着 x,所以 x 有三个不应该被修改的原因。这里就说 x 要对三个组件负责。另一方面,x 不依赖于任何组件,所以不会有任何原因导致它需要被变更,我们称它为“独立”组件。
- 依赖性组件
下图中的 y 组件,这是一个非常不稳定的组件。由于没有其他的组件依赖 Y,所以 Y 并不对任何组件负责。但因为 Y 同时依赖于三个组件,所以它的变更就可能由三个不同的源产生。这里就说 Y 是有依赖性的组件。
稳定性指标
如何来量化一个组件的稳定性呢:
其中一种方法是计算所有入和出的依赖关系。通过这种方法,我们就可以计算出一个组件的位置稳定性.
- Fan-in:入向依赖,这个指标指代了组件外部类依赖于组件内部类的数量。
- Fan-out:出向依赖,这个指标指代了组件内部类依赖于组件外部类的数量 。
- I:不稳定性,I = Fan-out / (Fan-in + Fan-out)。该指标的范围是[0,1],I = O 意味着组件是最稳定的, I = 1 意味着组件是最不稳定的。
稳定依赖原则 (SDP) 的要求:
每个组件的 I 指标都必须大于其所依赖组件 的 I 指标。也就是说,组件结构依赖图中各组件的 I 指标必须要按其依赖关系方向递减。
并不是所有组件都应该是稳定的:
如果一个系统中的所有组件都处于最高稳定性状态,那么系统就一定无法再进行变更了,这显然不是我们想要的。事实上,我们设计组件架构图的目的就是要决定应该让哪些组件稳定,让哪些组件不稳定。
结束语
如果上文原则无法满足怎么办? 我们可以参考 设计原则(六):DIP 依赖反转原则,以及组件构建原则(三):无依赖环原则 文章的打破循环依赖章节~
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
少年向来不识天高地厚
放眼处皆自负才高八斗
虽是自命风流
倒也坦诚无忧
我爱这样的少年
谦和而狂妄
骄傲又坦然☀️
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨