组件构建原则(四):稳定依赖原则

简介: 组件构建原则(四):稳定依赖原则

背景介绍


这是我的《架构整洁之道》系列的第十四篇,这篇文章的内容为稳定依赖原则。

《架构整洁之道》系列:


稳定依赖原则


依赖关系必须要指向更稳定的方向。

任何一个我们预期会经常变更的组件都不应该被一个难于修改的组件所依赖,否则这个多变的组件也将会变得非常难以被修改。


稳定性


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 依赖反转原则,以及组件构建原则(三):无依赖环原则 文章的打破循环依赖章节~


✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

少年向来不识天高地厚
放眼处皆自负才高八斗
虽是自命风流
倒也坦诚无忧
我爱这样的少年
谦和而狂妄
骄傲又坦然☀️

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

相关文章
|
4月前
|
机器学习/深度学习 分布式计算 前端开发
构建前端防腐策略问题之前端代码会随着技术引擎的迭代而腐烂的问题如何解决
构建前端防腐策略问题之前端代码会随着技术引擎的迭代而腐烂的问题如何解决
|
5月前
软件复用问题之在复用组件降低成本和复用组件引入依赖之间取得平衡,如何解决
软件复用问题之在复用组件降低成本和复用组件引入依赖之间取得平衡,如何解决
|
4月前
|
SQL 分布式计算 大数据
Android项目架构设计问题之平衡技术选型与业务需求之间的关系如何解决
Android项目架构设计问题之平衡技术选型与业务需求之间的关系如何解决
66 0
|
5月前
|
存储 设计模式 前端开发
软件架构设计的原则与模式:构建高质量系统的基石
【7月更文挑战第26天】软件架构设计是构建高质量软件系统的关键。遵循高内聚、低耦合、单一职责等设计原则,并灵活运用分层架构、微服务架构、客户端-服务器架构等设计模式,可以帮助我们设计出更加灵活、可扩展、可维护的软件系统。作为开发者,我们应该不断学习和实践这些原则与模式,以提升自己的架构设计能力,为团队和用户提供更加优秀的软件产品。
|
5月前
|
监控 前端开发 UED
软件交付问题之架构让代码组织更有序,如何解决
软件交付问题之架构让代码组织更有序,如何解决
|
5月前
|
存储
业务系统架构实践问题之倒置依赖和非倒置依赖有什么区别
业务系统架构实践问题之倒置依赖和非倒置依赖有什么区别
|
5月前
|
设计模式 存储 Java
代码优化设计问题之解耦策略路由和策略实现的依赖问题如何解决
代码优化设计问题之解耦策略路由和策略实现的依赖问题如何解决
|
消息中间件 存储 数据可视化
【结合业务需求给出合理的技术解决方案,改进现有模块功能,提高系统的可扩展性,封装性,稳定性】
【结合业务需求给出合理的技术解决方案,改进现有模块功能,提高系统的可扩展性,封装性,稳定性】
134 1
|
7月前
|
缓存 架构师 安全
打造高效稳定的单体项目工程结构
本文主要说明下单体项目的工程结构如何设计,目前业界存在两种主流的应用工程结构:一种是阿里推出的《 Java 开发手册》中推荐的,另外一种是基于 DDD (领域驱动设计)推荐的,ddd有借鉴别的老师的。
225 2
|
消息中间件 设计模式 缓存
聊聊结合业务需求给出合理的技术解决方案,改进现有模块功能,提高系统的可扩展性,封装性,稳定性
聊聊结合业务需求给出合理的技术解决方案,改进现有模块功能,提高系统的可扩展性,封装性,稳定性