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

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

背景介绍


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

《架构整洁之道》系列:


稳定依赖原则


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

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


稳定性


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


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

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

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

相关文章
|
前端开发 API
图片或文件Blob、File、Base64之间的相互转换
在做前端项目的时候,遇到图片的上传或者下载时,不可避免的会遇到Blob、File、Base64三种类型的转换。那么今天就总结下,三者之间的相互转换。 首先我们看看base64 ,File 对象,Blob 对象长什么样的,怎么来的。
826 1
|
关系型数据库 MySQL PHP
PHP与MySQL动态网站开发实战指南####
深入探索PHP与MySQL的协同工作机制,本文旨在通过一系列实战案例,揭示构建高效、稳定且用户友好的动态网站的秘诀。从环境搭建到数据交互,再到最佳实践分享,本文为开发者提供了一条清晰的学习路径,助力其在LAMP(Linux, Apache, MySQL, PHP/Perl/Python)栈上实现技术飞跃。 ####
|
关系型数据库 数据处理 PostgreSQL
在 Postgres 中使用 Split Part
【8月更文挑战第11天】
1107 0
在 Postgres 中使用 Split Part
|
人工智能 自然语言处理 IDE
💡通义灵码:让每个人都能成为软件开发的「超级个体」
通义灵码是阿里巴巴达摩院推出的大模型技术,支持多种编程语言和框架,具备强大的自然语言理解和生成能力。它能够自动生成代码、自动化测试、文档编写等,显著提升开发效率,降低技术门槛,让每个人都能轻松参与软件开发。通义灵码不仅支持多语言、多编辑器,还具备智能问答、代码优化等功能,为企业和开发者提供全方位的支持。通过通义灵码,开发者可以从繁琐的任务中解放出来,专注于创新和创意,推动软件开发进入新时代。
959 4
💡通义灵码:让每个人都能成为软件开发的「超级个体」
|
JSON 算法 数据挖掘
基于图论算法有向图PageRank与无向图Louvain算法构建指令的方式方法 用于支撑qwen agent中的统计相关组件
利用图序列进行数据解读,主要包括节点序列分析、边序列分析以及结合节点和边序列的综合分析。节点序列分析涉及节点度分析(如入度、出度、度中心性)、节点属性分析(如品牌、价格等属性的分布与聚类)、节点标签分析(如不同标签的分布及标签间的关联)。边序列分析则关注边的权重分析(如关联强度)、边的类型分析(如管理、协作等关系)及路径分析(如最短路径计算)。结合节点和边序列的分析,如子图挖掘和图的动态分析,可以帮助深入理解图的结构和功能。例如,通过子图挖掘可以发现具有特定结构的子图,而图的动态分析则能揭示图随时间的变化趋势。这些分析方法结合使用,能够从多个角度全面解读图谱数据,为决策提供有力支持。
569 0
|
索引 搜索推荐 缓存
使用Elasticsearch进行高效全文搜索的技术探索
【6月更文挑战第3天】本文探索了使用Elasticsearch进行全文搜索的技术,它基于Lucene,是一款开源、分布式搜索引擎。核心原理在于倒排索引,实现快速查找。全文搜索涉及安装配置、创建索引、索引文档、执行查询及处理结果。为了优化性能,可以调整索引映射、选择合适分析器、利用缓存及优化硬件配置。Elasticsearch因其高效性和灵活性在大数据时代广泛应用。
503 62
|
设计模式 算法 编译器
【C/C++ PIMPL模式 】 深入探索C++中的PIMPL模式
【C/C++ PIMPL模式 】 深入探索C++中的PIMPL模式
967 0
|
存储 缓存 编解码
FFmpeg开发笔记(四):ffmpeg解码的基本流程详解
FFmpeg开发笔记(四):ffmpeg解码的基本流程详解
FFmpeg开发笔记(四):ffmpeg解码的基本流程详解
|
设计模式 网络协议 算法
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析(一)
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析(一)
398 1
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析(一)
|
开发框架 Dart 容器
Flutter 自定义渐变按钮 GradientButton
Flutter 自定义渐变按钮 GradientButton Flutter 是一种流行的跨平台移动应用开发框架。Flutter 提供了许多内置的小部件,但有时您可能需要创建自己的小部件以满足特定的需求。这个文档将介绍如何创建一个自定义渐变按钮小部件 GradientButton。
346 0