架构整洁之道-读书总结

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原则。
拆分:
对于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.mfbz.cn/a/483001.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

查看文件信息:ls,pwd,操作文件:cd,touch,mkdir,rmdir,rm,cp,mv

目录 ls 选项 -l -a 隐藏文件存在的意义 -F -d -R pwd cd 选项 ​编辑 touch 选项 mkdir 选项 -p rmdir 选项 -p rm 选项 cp 选项 -r -R (和-r的区别) mv 移动目录 改名 选项 rm改为mv ls 显示当前目录下的文件 选项 (可以合并使用,有的也可以写…

linux centos 安装jenkins,并构建spring boot项目

首先安装jenkins,使用war包安装,比较简单,注意看下载的版本需要的JDK版本,官网下载https://www.jenkins.io/download/ 把下载好的war包放到服务器上,然后运行,注意8080端口的放行 # 前台运行并指定端口 ja…

目标检测的指标评估

目标检测模型的评价指标主要用于衡量模型的性能,特别是它在定位和识别目标方面的准确性。以下是一些常见的评价指标: 1. 精确度 (Precision): 表示检测到的目标中,正确检测到的目标所占的比例。精确度高意味着模型产生的误报(错误…

rabbitmq 3.9.29 docker mac 管理员页面无法打开

SyntaxError: Unexpected token ‘catch’ SyntaxError: Unexpected token ‘catch’ at EJS.Compiler.compile (http://127.0.0.1:15672/js/ejs-1.0.min.js:1:6659) at new EJS (http://127.0.0.1:15672/js/ejs-1.0.min.js:1:1625) at format (http://127.0.0.1:15672/js/main…

图床项目实战:从零搭建一个简易图床

项目背景与需求分析 随着互联网的发展,图片分享、存储和管理的需求日益增长。图床作为一种专门用于存储和分享图片的服务,受到了广大用户的欢迎。本项目旨在搭建一个简易的图床系统,满足用户上传、查看和删除图片的基本需求。 技术选型 本项…

微光图像增强算法学习记录(一)

微光图像增强(LLIE)旨在恢复照明并提高微光图像的可见性,本文对阅读的文献进行记录和分享,帮助回顾和大家建立学习资料。 文献一摘要及前沿摘选主要贡献网络结构实验结论 文献二摘要 文献三摘要主要贡献网络架构实验 文献四摘要实…

AGV|机器人导航识别二维码视觉传感器TDCS-0100与上位机PLC联机实例说明

目前二维码视觉导航的AGV出货量非常大,几乎都是仓储型AGV使用的导航方式。在地面或者天花板等位置标贴二维码作为标记点,通过扫描读取二维码信息和二维码相对相机的角度来确定当前位置。 本文重点介绍AGV|机器人导航识别二维码视觉传感器TDCS-0100与上位…

linux下线程分离属性

linux下线程分离属性 一、线程的属性---分离属性二、线程属性设置2.1 线程创建前设置分离属性2.2 线程创建后设置分离属性 一、线程的属性—分离属性 什么是分离属性? 首先分离属性是线程的一个属性,有了分离属性的线程,不需要别的线程去接合…

测试ALPHA开发板CAN1的设备树文件

一. 简介 前面一篇文章学习了 ALPHA开发板上的 CAN接口的设备节点信息,文章如下: ALPHA开发板修改CAN的设备树节点信息-CSDN博客 本文对设备树文件进行测试,即开发板加载 .dtb设备树文件。 二. 加载测试 CAN的设备树文件 1. 拷贝设备树…

认识String类

认识String类 前面我们学习了类和对象,这一小节咱们来谈String类 目录 认识String类前言一、String类的创建方式二、String引用类型的特点及方法1.存储内容2.String对象的比较3.字符串查找在这里插入图片描述4.转换(一)数字转为为字符串&…

Swift 结构化并发之全局 Actor 趣谈

概览 在 Swift 结构化并发构成的体系中,一个称为“演员”(Actor)的成员扮演了非常重要的角色,它被用来隔离和同步执行中的数据。 除了普通 Actor 以外,还有一个全局“演员”(Global Actor)的概念,它是做什么的?又有什么与众不同的长处呢? 在本篇博文中,您将学到如…

【Swagger】接口文档生成

文章目录 一、前后端分离开发流程二、YApi导入接口文档三、Swagger3.1 介绍3.2 使用步骤3.2.1 导入 knife4j 的maven依赖3.2.2 在配置类中加入 knife4j 相关配置3.2.3 配置类中设置静态资源映射3.2.4 访问测试 3.3 常用注解3.4 全局参数设置 四、YApi 与 Swagger 一、前后端分离…

网络安全实训Day8

写在前面 网络工程终于讲完了。这星期到了网络安全技术部分。 网络安全实训-网络安全技术 网络安全概述 信息安全:所有保障计算机硬件、系统、软件、数据不因有意或无意的行为导致的服务中断、数据损坏或丢失等安全事件的保障技术 网络安全:基于计算机…

Spark Stage

Spark Stage 什么是Stage Spark中的一个Stage只不过是物理执行计划其中的一个步骤,它是物理执行计划的一个执行单元。一个Job会被拆分为多组Task,每组任务被称为一个Stage,可以简单理解为MapReduce里面的Map Stage, Reduce Stag…

Oracle 使用OGG(Oracle GoldenGate) 实现19c PDB与MySQL5.7 数据同步

OGG 是一种基于日志的结构化数据复制软件,它通过解析源数据库在线日志或归档日志获得数据的增删改变化。 OracleMysqlIP address192.168.80.100192.168.80.16DB version19.2.05.7host nametempmysql OS version: CentOS 7.9 一,Oracle 服务…

文件上传二—WEB攻防-PHP应用文件上传中间件CVE解析第三方编辑器已知CMS漏洞

演示案例: PHP-中间件-上传相关-Apache&NginxPHP-编辑器-上传相关-第三方处理引用PHP-CMS源码-上传相关-已知识别到利用 #PHP-中间件-上传相关-Apache&Nginx 复现漏洞环境:vulhub (部署搭建看打包视频) 由于PHP搭建常用中…

深度学习(过拟合 欠拟合)

过拟合: 深度学习模型由于其复杂性,往往容易出现过拟合的问题。以下是一些深度学习中常见的过拟合原因和解决方法: 1. 数据量不足:深度学习模型通常需要大量的数据来进行训练,如果数据量不足,模型容易过度…

Python界面库Flet(1)介绍和快速使用

Python界面库Flet(1)快速上手使用 Author:Once Day Date:2024年3月19日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: Pyt…

Collection与数据结构 数据结构预备知识(二):包装类与泛型

1.包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类.可以把包装类理解为基本数据类型所对应的引用数据类型. 1.1基本数据类型与对应的包装类 基本数据类型包装类byteByteshortShortintIntegerlongLong…

基于springboot+vue的旅游网站

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…
最新文章