《架构整洁之道》架构笔记(架构整洁之道电子书)
csdh11 2025-01-26 21:48 29 浏览
本文首发:公众号「架构精进」
花了一个多月读完了这本《架构整洁之道》,跟《代码整洁之道》、《程序员的职业素养》算是一个 Clean 系列,每一本读来都很有启发。这本《架构整洁之道》有些地方看得还挺迷糊,值得一读再读。
概述、编程范式
设计与架构没有任何区别。一丁点区别都没有!软件架构的终极目标是,用最小的人力成本来满足构建和维护该系统的需求。
三种编程范式(结构化编程、面向对象编程和函数式编程)与软件架构的三大关注重点不谋而合:功能性、组件独立性以及数据管理。
面向对象编程到底是什么?对一个软件架构师来说,其含义应该是非常明确的:面向对象编程就是以多态为手段来对源代码中的依赖关系进行控制的能力,这种能力让软件架构师可以构建出某种插件式架构,让高层策略性组件与底层实现性组件相分离,底层组件可以被编译成插件,实现独立于高层组件的开发和部署。
软件架构师应该着力于将大部分处理逻辑都归于不可变组件中,可变状态组件的逻辑应该越少越好。
设计原则
- SRP: 单一职责原则。任何一个软件模块都应该只对某一类行为者负责。
- OCP: 开闭原则。一个设计良好的软件系统应该在不需要修改的前提下就可以轻易被扩展。
- LSP: 里氏替换原则。(没看明白,开头的定义和后面紧跟着的 License 类的例子似乎是矛盾的,疑似翻译错误,https://www.zhihu.com/question/22839841)
- ISP: 接口隔离原则。在一般情况下,任何层次的软件设计如果依赖于不需要的东西,都会是有害的。
- DIP: 依赖反转原则
- 应在代码中多使用抽象接口,尽量避免使用那些多变的具体实现类
- 不要在具体实现类上创建衍生类
- 不要覆盖(override)包含具体实现的函数
- 应避免在代码中写入与任何具体实现相关的名字,或者是其他容易变动的事物的名字
组件构建原则
组件是软件的部署单元,是整个软件系统在部署过程中可以独立完成部署的最小实体。
与构建组件相关的三个基本原则
- REP:复用/发布等同原则 软件复用的最小粒度应等同于其发布的最小粒度。
- CCP:共同闭包原则 我们应该将那些会同时修改,并且为相同目的而修改的类放到同一个组件中,而将不会同时修改,并且不会为了相同目的而修改的那些类放到不同的组件中。
- CRP:共同复用原则 不要强迫一个组件的用户依赖他们不需要的东西。
三个原则之间彼此存在着竞争关系。软件架构师的任务就是要在着三个原则中间进行取舍。一个项目在组件结构设计上的重心是根据该项目的开发时间和成熟度不断变动的,我们对组件结构的安排主要与项目开发的进度和它被使用的方式有关,与项目本身功能的关系其实很小。
优秀的架构师应该能在上述三角形张力区域中定位一个最适合目前研发团队状态的位置,例如在项目早起,CCP比REP更重要,随着项目的发展,这个最合适的位置也要不停调整。
组件耦合相关的原则
- 无依赖环原则。组件依赖关系图中不应该出现环。
- 自上而下的原则。组件结构图必须随着软件系统的变化而变化和扩张,而不可能在系统构建的最初就被完美设计出来。
- 稳定依赖原则。依赖关系必须要指向更稳定的方向。
- 稳定抽象原则。一个组件的抽象化程度应该与其稳定性保持一致。如果一个组件想要成为稳定组件,那么它就应该由接口和抽象类组成,以便将来扩展。
软件架构
软件架构师自身需要是程序员,并且必须一直坚持做一线程序员。
在软件系统的所有方面中,维护所需的成本是最高的。
所有的软件系统都是一组策略语句的集合。软件架构设计的工作重点之一就是,将这些策略彼此分离,然后将他们按照变更的方式进行重新分组。其中变更原因、时间和层次相同的策略应该被分到同一个组件中。优秀的架构师会小心地将软件的高层策略与其底层实现隔离开,让高层策略与实现细节脱钩,使其策略部分完全不需要关心底层细节,当然也不会对这些细节有任何形式的依赖。另外,优秀的架构师所设计的策略应该允许系统尽可能地推迟与实现细节相关的决策,越晚做决策越好。
层次、边界
一个软件系统可以被解耦成若干个水平分层——UI界面、应用独有的业务逻辑、领域普适的业务逻辑、数据库等。而系统的用例是系统水平分层的一个个垂直切片。
软件架构设计本身就是一门划分边界的艺术。边界的作用是将软件分割成各种元素,以便约束边界两侧之间的依赖关系。系统的核心业务逻辑必须和其他组件隔离,保持独立,而这些其他组件要么是可以去掉的,要么是有多种实现的。
业务逻辑应该保持纯净,不要掺杂用户界面或者所使用的数据库相关的东西。在理想情况下,这部分代码业务逻辑的代码应该是整个系统的核心,其他底层概念的实现应该以插件形式接入系统种。业务逻辑应该是系统中最独立、复用性最高的代码。
软件架构师必须仔细权衡成本,决定哪里需要设计架构边界,以及这些地方需要的是完整的边界,还是不完全的边界,还是可以忽略的边界。我们的目标是找到设置边界的优势超过其成本的拐点,那就是实现该边界的最佳时机。
整洁架构
按照现有的一些优秀架构(六边形架构、DCI 架构、BCE 架构)设计出来的系统,通常都具有以下特点:
- 独立于框架
- 可被测试
- 独立于 UI
- 独立于数据库
- 独立于任何外部机构
以几个同心圆画出来的整洁架构示意图,从里到外,各层分别是
- 业务实体(系统级业务逻辑)
- 用例(应用级业务逻辑)
- 控制器、展示器、网关(接口适配器)
- Web、用户界面、数据库、设备、外部接口(框架与驱动程序)
实现细节
数据库并不是数据模型。数据库只是一款软件,是用来存取数据的工具。一个优秀的架构师是不会让实现细节污染整个系统架构的。数据本身很重要,但数据库系统仅仅是一个实现细节。
GUI 只是一个实现细节。而 Web 则是 GUI 的一种,所以也是一个实现细节。
框架并不等同于系统架构——尽管有些框架确实以此为目标。我们应该将框架作为架构最外圈的一个实现细节来使用,不要让它们进入内圈。不要让框架污染我们的核心代码,应该依据依赖关系原则,将它们当作核心代码的插件来管理。
相同的架构方式,可能有多种不同的代码组织方式,好的组织方式能够利用编译器来维护架构设计原则,而不依赖个人自律和编译过程之后的工具。
微信扫描下方二维码(手机端可以长按两次),添加小助理就能领取(价值2180)Java架构班之BATJ企业面试课。
同时进入架构精进微信群(技术交流,技术课程分享)。
相关推荐
- 知名软件变“木马”:2小时感染10万电脑
-
近日,腾讯电脑管家监测发现,一款通过“驱动人生”升级通道,并同时利用“永恒之蓝”高危漏洞传播的木马突然爆发,仅2个小时受攻击用户就高达10万。腾讯电脑管家可精准拦截该病毒攻击,管家团队也将持续跟踪该款...
- 腾讯电脑管家发布病毒预警:“驱动人生木马”爆发,2小时感染10万台电脑
-
新华网天津12月15日电(记者周润健)腾讯电脑管家15日紧急发布病毒预警,14日下午,腾讯电脑管家监测发现,一款通过“驱动人生”升级通道,并同时利用“永恒之蓝”高危漏洞传播的木马突然爆发,仅2个小时受...
- 全新“撒旦”勒索病毒来袭 瑞星推出独家解密工具
-
新华社北京7月26日电瑞星威胁情报平台近日发现多起国内用户感染“撒旦”勒索病毒事件。据瑞星安全研究人员介绍,该病毒运行后会加密受害者计算机文件,加密完成后会用中英韩三国语言索取1个比特币作为赎金,并...
- 新勒索病毒“WannaCry”疯狂来袭 乌克兰副总理电脑中招
-
据外媒报道,从6月27日开始,一种新勒索病毒再次疯狂来袭,已席卷欧洲多个国家,连乌克兰副总理的电脑都已中招。报道称,这轮病毒足以与五月席卷全球的勒索病毒“WannaCry”的攻击性相提并论。该病毒代号...
- 蠕虫病毒利用“永恒之蓝”漏洞传播 单位局域网受威胁最大
-
日前,火绒安全团队通过“火绒威胁情报系统”发现蠕虫病毒“Worm/Sharp”正在全网传播,其中在政府、企业、学校、医院等单位的局域网具有非常强的传播能力。该病毒通过“永恒之蓝”漏洞、多个电脑常用端口...
- 新病毒爆发:利用“永恒之蓝”传播,2小时感染10万台电脑挖矿
-
驱动人生发布的声明。据腾讯安全专家介绍,通过追溯病毒传播链发现,该病毒自12月14日约14点,利用“驱动人生”、“人生日历”等软件最早开始传播,另有约30%的传播通过“永恒之蓝”漏洞在局域网内进行主动...
- 逍遥安卓模拟器定制手游电脑版 手机电脑账号完全互通
-
从今年起大量回合制端游转向手游方向,无论是《梦幻西游》、《大话西游》、《神武》还是刚刚发行的《问道》手游,都是非常重度需要大量时间来做任务挂机升级的游戏。很多人习惯了端游的时候一个电脑可以多开的玩法,...
- 安卓模拟器绿色U盘移动版 公司玩游戏无痕迹
-
安卓模拟器已经不稀奇了!随着安卓手游的盛行,特别是《梦幻西游手游》之类的重度手游发布,玩手游花的时间也越来越多。用手机玩这些游戏存在着屏幕小、点量少、费流量还有容易被电话打断,在电脑上用安卓模拟器玩游...
- 苹果推出 iCloud 照片和视频转移服务:可转移至谷歌相册
-
IT之家3月4日消息据MacRumors今日报道,苹果公司本周推出了一项新服务,帮助iCloud用户方便快捷的将其存储的照片和视频转移到谷歌照片上。苹果在其支持文档中表示,用户可以登...
- NAS PK台,4核带m.2的威联通TS-264C vs 双核TS-462C
-
因为618年中大促看到威联通TS-264C和TS-462C这两机型售价差不多,就做个比较以供参考。毕竟作为自2007年以来就一直卖威联通的NAS老油来说,对威联通各NAS机型的识别还是相当全面的,对不...
- 前端学AI(七):构造 RAG 系统评估测试数据集
-
引言在基于DeepSeek+Chroma+LangChain开发一个简单RAG系统...
- 惨重教训!调查显示挪威“英斯塔”号宙斯盾舰撞油轮后本不必“丧命”
-
最新公布的调查报告显示,挪威皇家海军“英斯塔”号护卫舰2018年11月与油轮相撞后,如果其舰员接受了更好的损管训练,并且对舰艇的稳定特性更加熟悉的话,这艘宙斯盾型战舰本来是可以挽救的。↑挪威“英斯塔”...
- 「必买」盘点2021年男人们的败家清单,越“败”越香
-
心里总想买点啥?看看《必买》,全网最有料的场景种草指南。草原割不尽,春风吹又生。在过去的2021年,不断被各种数码产品种草,一直在买买买,剁手不停。大部分产品都经过详细的对比做足了功课,也有部分是一时...
- 实现浏览器播放rtsp视频流的解决方案
-
有同学问道:需要实时播放摄像头rtsp视频流,而浏览器不能直接播放,怎样解决?实现这个需求可以通过插件或者转码来实现。要实现这个目的,可以采用的方案非常得多,有商业的也有开源的,这里主要列举一些开源的...
- ISO9000你知道多少?
-
1ISO9000族标准是什么?ISO9000族标准是指由国际标准化质量管理和质量保证技术委员会(ISO/TC176)制订的所有国际标准。ISO9000族标准可帮助各种类型和规模的组织实施并有效运行质...
- 一周热门
- 最近发表
- 标签列表
-
- mydisktest_v298 (34)
- document.appendchild (35)
- 头像打包下载 (61)
- acmecadconverter_8.52绿色版 (39)
- word文档批量处理大师破解版 (36)
- server2016安装密钥 (33)
- mysql 昨天的日期 (37)
- parsevideo (33)
- 个人网站源码 (37)
- centos7.4下载 (33)
- mysql 查询今天的数据 (34)
- intouch2014r2sp1永久授权 (36)
- 先锋影音源资2019 (35)
- jdk1.8.0_191下载 (33)
- axure9注册码 (33)
- pts/1 (33)
- spire.pdf 破解版 (35)
- shiro jwt (35)
- sklearn中文手册pdf (35)
- itextsharp使用手册 (33)
- 凯立德2012夏季版懒人包 (34)
- 冒险岛代码查询器 (34)
- 128*128png图片 (34)
- jdk1.8.0_131下载 (34)
- dos 删除目录下所有子目录及文件 (36)