架构整洁之道笔记3

组件构建原则

设计原则指导我们如何用砖块砌成房间,组件构建原则指导我们如何将房间组合成房子。

组件

组件是软件的部署单元,是完成部署的最小实体。

我本来以为这一章讲的是划分软件设计层面的抽象组件,结果真的是编译器层面的部署单元。

组件是一组二进制文件的集合,多个组件可以链接成一个独立可执行文件。可以独立部署,也可以独立开发。

最开始的时候,编译器效率比较低下,存取缓慢。那么代码越多,占用的内存越多,编译过程就越长。那么程序员就将库函数的源代码单独编译,指定一个内存中的加载地址,编译好就放在这里。之后编译应用程序文件的时候,可以先加载二进制形式的库文件过来,再加载应用程序。

后来,函数库的函数不断增加的时候,就要重新划分加载的上限了。随着内存扩大,程序的碎片化程度会随之不断增加。这就出现了重定位技术:可以指定编译出的二进制格式文件加载到任意地址。

再后来,程序员将加载过程和链接过程分离。链接器输出一个完成了外部链接、可以重定位的二进制文件。

程序规模的墨菲定律:程序规模会一直增长下去,直到将有限的编译和链接时间填满为止。

组件聚合

三个描述组件之间关系的原则。

REP:复用/发布等同原则

:软件复用的最小粒度应等同于其发布的最小粒度。

就是说,组件中的类与模块必须是紧密相关的,要有一个共同的主题或大方向。

而且,一个组件中包含的类和模块应该可以一起发布,用一条版本线跟踪。

CCP:共同闭包原则

:要把可能会同时修改、为相同目的修改的类放在一个组件中。

即,SRP原则的组件层面版本。

CRP:共同复用原则

不要强迫一个组件的用户依赖他们不需要的东西。

和ISP原则类似,就是不要依赖不需要的东西。

三个原则综合考虑:组件聚合张力

太多不必要的发布
太多组件变更
复用困难
复用发布等同原则
共同闭包原则
共同复用原则

REP、CCP原则是黏合性原则(组件变大),CRP是排除性原则(组件变小)。

一个软件的开发过程中,它的组件结构会在这个三角区域中不断变动。

组件耦合

无依赖环原则

:组件依赖关系中不应该出现环。

组件依赖关系应该可以转换成一个有向无环图DAG。

消除循环依赖

将依赖图转化为DAG。应用以下两种机制:

  1. 应用依赖反转原则DIP。将一个依赖改为依赖接口,通过实现接口来倒置依赖。
  2. 创建一个新组件。

自上而下的设计

组件结构图不可能从上而下地设计出来。这里的上是指抽象,下是指具体。

组件依赖结构图主要是针对构建性、维护性方面的设计图,用来指导如何隔离软件频繁的变更。所以在项目开始不会被设计出来,是因为开始的时候不需要被构建和维护。

SDP:稳定依赖原则

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

按照我的想法,稳定是相对的、是有“历史局限性”的。我们要做的是尽可能识别到自己所见范围内最稳定的地方,作为我们依赖的对象。

看看另一个好落实的稳定依赖方案:

量化一个组件的稳定性:稳定性指标(I)。I=0表示最稳定。
$$
I={Fanout}\div{(Fanin + Fanout)},I\in[0,1]\
Fanout=出度依赖,Fanin=入度依赖
$$
稳定依赖原则要求让每个组件的I指标都大于其所依赖的组件的I指标。

SAP:稳定抽象原则

:一个组件的抽象化程度应该与其稳定性保持一致。

意思就是说,在这个原则当中,组件的稳定性与抽象化程度被关联起来了——一个稳定的组件同时也应该是抽象的,这样这个组件就可以被灵活地扩展且不需修改。

所以SAP让SDP有了落实的方法。两个结合起来就是:依赖关系应该指向更抽象的方向。也就是组件版的DIP原则。

量化抽象程度:A。A=0表示最具体。
$$
A=Na\div{Nc}, A\in[0,1]\
Na=组件中类的数量,Nc=组件中抽象类和接口的数量。
$$

稳定与抽象的讨论

I与A在实现软件的时候应该成反比,就是说稳定的应当写为抽象(所以方便扩展)、不稳定的写的是具体的实现(它依赖的是抽象)。软件越靠近这个反比的线条,在稳定和抽象的程度上就把握得越合理。

如果一个组件处于又稳定又具体的位置,那么写代码就很痛苦,因为他不好修改、不好扩展。如果组件处于不稳定又抽象的地方,那他就没有什么好扩展的,没用。

书里的这部分,感觉作者本人觉得自己发明了两个概念很了不起,叭叭地延展了一堆,等我耐心看完他那一堆概念和公式,觉得自己好像被耍了,因为他也没讲出什么有趣的道理。

posted @   lcz111  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示