架构整洁之道-读书总结

1 概述

1.1 关于本书

《架构整洁之道》(Clean Architecture: A Craftsman’s Guide to Software Structure and Design)是由著名的软件工程师Robert C. Martin(又称为Uncle Bob)所著。这本书提供了软件开发和架构设计的指导原则,旨在帮助开发者构建更加稳定、可维护和灵活的软件系统。
架构本质上解决软件复杂度问题,即解决控制和逻辑分离问题;所谓的控制就是对程序的流转的与业务无关的代码或者系统控制(如多线程、异步、服务发现、部署、弹性伸缩等);逻辑就是业务逻辑,解决用户问题的逻辑。控制和逻辑构成了整体的软件复杂度,有效分离控制和逻辑会让系统得到简化。

1.2 设计与架构

“架构”这个词往往使用于”高层级”的讨论中。这类讨论一般都把”底层”的实现细节排除在外。而”设计”一词,往往用来指代具体的系统底层组织结构和实现的细节。
在软件设计中,底层设计细节和高层架构信息是不可分割的。它们组成在一起,共同定义了整个软件系统,缺一不可。架构图里实际包含了所有的底层设计细节,这些细节信息共同支撑了顶层的架构设计,底层设计信息和顶层架构设计共同组成了整个软件系统的架构文档。

1.3 软件价值
  • 行为价值,软件所提供的功能;也是我们常说的业务逻辑
  • 架构价值,软件系统必须有足够的灵活性;灵活性则取决于系统整体状况、组件布置以及组件之间的连接方式。
    问题:那么哪个维度更重要呢?
    可以用艾森豪威尔矩阵来从不同阶段来回答这个问题,业务发展早期架构属于重要但是不紧急,但是如果因为架构导致业务迭代效率越来越慢,那么架构就变得重要且紧急了。
1.4 架构目标

软件架构的终极目标:用最小的人力成本来满足构建和维护该系统的需求。也是衡量软件架构优劣的标准。

2 设计原则-SOLID

SOLID 原则的主要作用就是告我们如何将数据和函数组织成“类”(这里类不是面向对象中的类),以及如何将这些类链接成未程序。SOLID原则用于指导我们如何将砖块砌成墙与房间。

  • 单一职责原则(SRP):任何一个软件模块都应该只对某一类行为负责。
  • 开闭原则(OCP):软件应该是易于扩展的,同时抗拒修改的。
  • 里氏替换原则(LSP):子类应该能够替换掉它们的基类并且不破坏程序的正确性。
  • 接口隔离原则(ISP):客户端不应该被迫依赖于它们不使用的接口。
  • 依赖倒置原则(DIP):高层模块不应该依赖于低层模块,二者都应该依赖于抽象。

3 组件原则

组件是软件的部署单元,它们是作为系统部署一部分的最小的实体。(Components are the units of deployment. They are the smallest entities that can be deployed as part of a system.)。如java jar包,C++ DLL文件等。可以将多个组件链接成一个可独立可执行的文件,又或者,可以被打包成.jar、.dll或者.exe文件,并以动态加载的插件形式实现独立部署。组件原则用于指导我们将房间等合并成房子。
组件聚合原则:

  • REP(he Reuse/Release Equivalence Principle)复用/发布等同原则;复用的组件能够被独立地跟踪和升级,它们应该与发布(版本控制)的单元相等同。
  • CCP(The Common Closure Principle)共同闭包原则;因为相同的原因而变化的类放在一起。
  • CRP(The Common Reuse Principle)共同复用原则;不要依赖不需要的东西。

在这里插入图片描述

案例
在这里插入图片描述

不拆分:
common library对于A组件而言都符合CCP和CRP原则,但是对于B组件而言,不满足CRP原则。
拆分(拆分成3个lib):
对于A组违反CCP和CRP原则,对于B组件则符合CRP原则好处。

组组件依赖问题的三原则:

  • 无依赖环原则:在组件依赖关系图中不应该存在循环依赖。
  • 稳定依赖原则:组件之间的依赖关系应该是从不稳定的向稳定的方向。
  • 稳定抽象原则:越是稳定的组件,应该越是抽象;而不稳定的组件,则可以是更具体的。

4 整洁架构

所有的软件系统可以降解为策略与细节两部主要元素。策略体现的是软件中所有的业务规则与操作过程,因此它是系统真正的价值所在;而细节则是指那些让操作该系统的人、与其他系统以及策略进行交互,但是又本身不会影响到策略的本身的行为,如I/O设备、数据库、Web系统、服务器、框架、交互协议等。一个良好的架构设计应该围绕用例来展开,同时应该尽可能推迟和延后决定采用什么框架、数据库、web服务等。

  • 关注点的分离:通过划分不同的组件和服务,使得每个部分专注于单一的职责。如分层解耦、用例解耦、源码层解耦、服务层解耦等。

  • 策略与机制分离:高层策略(如业务规则)应该与低层机制(如数据库访问)分离开,这使得策略的修改不会直接影响到底层实现,反之亦然。

  • 业务逻辑与UI/外部设备的分离:用户界面、数据库、Web服务器和其他外部设备或接口,它们不应该影响到核心业务逻辑的实现,这样即使外部设备发生变化,核心逻辑也能保持不变。

  • 组件独立性:架构应该促成组件间独立性,同时降低组件间的耦合,以便于独立于开发、测试、部署、维护和演进。

  • 架构界限:定义清晰的界限来分隔系统的不同部分,比如使用接口或抽象类创建边界,这有助于控制系统的不同部分之间的交互方式。层与层之间应该通过抽象来进行交互,避免直接依赖具体实现,以减少组件间的耦合
    如下图所示,作者提出了整洁架构设计理念,有以下特点:独立于框架、可被测试、独立于UI、独立与数据库、独立于任何外部机构。
    在这里插入图片描述

  • 业务实体这一层封装整个系统的关键逻辑,一个业务实体既可以是一个带有方法的对象,也可以是一组数据结构和函数的集合。

  • 用例层通常包含的是特定应用场景下的业务逻辑,这里封装并实现了整个系统的所有用例。

  • 接口适配器层中通常是一组数据转换器,它们负责将数据从用例和业务实体而言最方便操作的格式,转换成外部系统(比如数据库以及Web)最方便的操作方式。

  • 最外层一般由工具、数据库、Web框架等组成的。
    值得说明的是:这个图只是示例,不是说架构只能分四层。

5 最后

架构师没有速成班,架构师的成功主要靠思考力提升。也就是思维提升,只有这样,才能提升你在未知环境中判断和取舍的质量,最终通过架构设计为你所在的团队或企业带来竞争优势。

参考文献
[1] 架构整洁之道-图书(中英文版)
[1] https://blog.51cto.com/xxdeelon/2506276

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/771453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

绘图技巧 | 双变量映射地图可视化绘制方法

本期推文我们绘制不常见的双变量主题地图,该类地图可以很好的在地图上用颜色展示两个变量的信息,相较于单一变量映射地图,此类地图表达的信息更加丰富和全面。本期推文主要涉及的内容如下: 双变量映射地图(Bivariate Choropleth M…

PPT录制视频保存在哪?我来告诉你答案

在如今的信息化时代,ppt已经成为了工作中必不可少的工具。而ppt录制视频能够更好地展示ppt内容,方便观众随时随地观看。可是很多人不知道ppt录制视频保存在哪,本文将为您介绍ppt录制视频的保存位置,为读者提供关于ppt录屏的实用技…

[Linux]知识整理(持续更新)

前言 Linux的目录结构 Linux的目录结构是一个树型结构 Windows 系统可以拥有多个盘符, 如 C盘、D盘、E盘 Linux没有盘符这个概念, 只有一个根目录 /, 所有文件都在它下面 Linux路径的描述方式 第一章 基本命令 命令格式 例:ls –la /etc 说明: 1)个别命令使用不遵循…

ELMOS

where L W o L_{Wo} LWo​() is the o-th softmax classifer, L U o L_{Uo} LUo​() is the o-th projector 辅助信息 作者未提供代码

16:00面试,16:06就出来了,问的问题有点变态。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…

使用LLaVA模型实现以文搜图和以图搜图

本文将会详细介绍如何使用多模态模型——LLaVA模型来实现以文搜图和以图搜图的功能。本文仅为示例Demo,并不能代表实际的以文搜图和以图搜图的技术实现方案。 1、实现原理 使用多模态模型获取图片的标题和详细描述以文搜图功能:使用ES实现查询匹配&…

Qt 计算两条直线QLineF的重叠部分,如何存在则返回该直线

计算两条直线QLineF的重叠部分 效果 使用示例 QLineF intersection;bool isSuccess GetOverlapSegment(line1, line2, intersection);源码 // 判断两个QLineF对象在斜率相同时是否存在重叠部分 bool DoLineOverlapWithSameSlope(const QLineF& line1, const QLineF&…

为什么说用了10年C++的程序员也不敢说自己精通C++?

在编程领域,C无疑是一门具有极高复杂度和深度的语言,它以其卓越的性能、灵活性和广泛的应用范围赢得了众多开发者青睐。然而,一个现象令人深思:即使有程序员使用C长达十年之久,他们仍可能谦逊地表示自己并未真正“精通…

Cartoon FX Remaster

“卡通FX重制”是一个风格化的粒子系统预制件集合。您可以使用附带的“卡通FX简易编辑器”轻松自定义每个效果的颜色和其他属性。 卡通FX Remaster是卡通FX包1的新版本,从头开始重新制作了全新的效果。 ⭐新:通过卡通FX重制捆绑包,以20%的折扣获得所有4个卡通FX重制包! 50多…

python.类

1.类用class定义 name等是属性 是成员变量 定义完类了要定义对象 class Student: #定义了一个Student的类nameNoneageNonegenderNonesdu1Student() #创建了一个Student类的对象 sdu1.nameleo sdu1.age20 sdu1.gendermaleprint(sdu1.name) print(sdu1.age) print(sdu1.…

【数据分享】1929-2023年全球站点的逐月平均海平面压力(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 有关气象指标的监测站点数据,之前我们分享过1929-2023年全球气象站…

Vue.js 3.4的新特性

Vue.js 3.4的新特性 目前,Vue.js的版本已经更新到3.4,这次更新不仅带来了性能上的飞跃,还引入了许多新特性,进一步优化了开发效率。 1. 性能提升 在性能方面,Vue.js 3.4 全新重写了模板解析器。与之前基于正则表达式…

Matlab从入门到精通课程

教程介绍 MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 学习地址 链接:https://pan.baidu.com/s/1PxGarBwQusMzwPVqcE…

RAG笔记:常见问题以及解决方法

1 内容缺失 知识库中缺少必要的上下文信息。当知识库没有包含正确答案时,RAG 系统可能会给出一个貌似合理但实际上错误的回答,而不是明确表示它不知道答案。 1.1 解决方法 1.1.1 设置阈值 在回答问题前先设定一个质量标准。如果召回内容达不到标准或…

Vulnhub:DR4G0N B4LL: 1

目录 信息收集 1、arp 2、nmap WEB web信息收集 gobuster 隐藏目录发现 图片隐写 ssh登录 提权 get user 系统信息收集 get root 信息收集 1、arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l …

基于yolov8安全帽检测的系统

基于yolov8安全帽检测的系统 项目描述: 安全头盔检测(计算机视觉) 1.自训练数据集1538张数据图片,进行标注,并进行100轮的训练,准确率达0.966 2.使用 Flask 和 Ultralytics YOLOv8 模型开发了一个 Web 应…

打造高效自动化渗透测试系统:关键步骤与实践

随着当前网络安全威胁的不断扩展与升级,开展渗透测试工作已经成为广大企业组织主动识别安全漏洞与潜在风险的关键过程。然而,传统的人工渗透测试模式对测试人员的专业能力和经验水平有很高的要求,企业需要投入较大的时间和资源才能完成。在此…

免费客服系统大揭秘!有什么好用的免费客服系统推荐?

贵的不一定是好的,合不合适才最重要!有什么好用的免费客服系统吗?现下服务经济的发展的风潮已经席卷到了各行各业。 企业不仅要提供好的产品,还需要好的服务。客服系统作为企业与客户重要的沟通渠道,越来越多的企业正在…

Java版AI人工智能源码 Chat GPT智能AI源码

Java版AI人工智能源码 Chat GPT智能AI源码 技术框架 基于前后端分离架构以及Vue3、uni-app、SpringBoot2.5技术栈开发, 包含PC端、H5端、小程序端、APP端。 AI人工智能系统介绍 Chat GPT AI人工智能系统聚合对接国内外知名主流大语言模型接口及中转平台&#x…

2024深圳国际冲压自动化设备及技术展览会

2024深圳国际冲压自动化设备及技术展览会 2024 Shenzhen International Press Automation Equipment and Technology Exhibition 时间:2024年08月28-30日 地点:深圳国际会展中心(新馆) 预订以上展会详询陆先生 I38&#xff0…