架构整洁之道 pdf

架构整洁之道

内容简介

《架构整洁之道》是创造“Clean神话”的Bob大叔在架构领域的登峰之作,围绕“架构整洁”这一重要导向,系统地剖析其缘起、内涵及应用场景,涵盖软件研发完整过程及所有核心架构模式。《架构整洁之道》分为6部分,第1部分纲领性地提出软件架构设计的终目标,描述软件架构设计的重点与模式;第2~4部分从软件开发中三个基础编程范式的定义和特征出发,进一步描述函数、组件、服务设计与实现的定律,以及它们是如何有效构建软件系统的整体架构的;第5部分从整洁架构的定义开始,详细阐述软件架构设计过程中涉及的方方面面,包括划分内部组件边界、应用常见设计模式、避开错误、降低成本、处理特殊情况等,并以实战案例将内容有机整合起来;第6部分讲述具体实现细节;附录则透过作者数十年的软件从业经历再次印证《架构整洁之道》的观点。

对于每一位软件研发从业人员——无论从事的是具体编码实现、架构设计,还是软件研发管理,《架构整洁之道》都是不可或缺的。

作者简介

Robert C. Martin,Object Mentor公司总裁,面向对象设计、模式、UML、敏捷方法学和极限编程领域的资深顾问。他是Designing Object-Oriented C++ Applications Using the Booch Method 以及 Jolt 获奖图书 Agile Software Development, Principles,Palterns,and Practices(中译版《敏捷软件开发:原则、模式与实践》)《代码整洁之道》等畅销书作者。

译者简介

孙宇聪:曾在谷歌工作多年,任谷歌高级SRE(Senior Site Reliblity Engineer),前Coding.net 技术负责人。

目录

第1部分 概述

第1章 设计与架构究竟是什么 3

目标是什么 4

案例分析 5

本章小结 11

第2章 两个价值维度 12

行为价值 13

架构价值 13

哪个价值维度更重要 14

艾森豪威尔矩阵 15

为好的软件架构而持续斗争 16

第2部分 从基础构件开始:编程范式

第3章 编程范式总览 21

结构化编程 22

面向对象编程 22

函数式编程 23

仅供思考 23

本章小结 24

第4章 结构化编程 25

可推导性 26

goto是有害的 28

功能性降解拆分 29

形式化证明没有发生 29

科学来救场 29

测试 30

本章小结 31

第5章 面向对象编程 32

封装 33

继承 36

多态 38

本章小结 44

第6章 函数式编程 45

整数平方 46

不可变性与软件架构 47

可变性的隔离 48

事件溯源 49

本章小结 51

第3部分 设计原则

第7章 SRP:单一职责原则 56

反面案例2:代码合并 59

解决方案 60

本章小结 61

第8章 OCP:开闭原则 62

思想实验 63

依赖方向的控制 67

信息隐藏 67

本章小结 67

第9章 LSP:里氏替换原则 68

继承的使用指导 69

正方形/长方形问题 70

LSP与软件架构 70

违反LSP的案例 71

本章小结 73

第10章 ISP:接口隔离原则 74

ISP与编程语言 76

ISP与软件架构 76

本章小结 77

第11章 DIP:依赖反转原则 78

稳定的抽象层 79

工厂模式 80

具体实现组件 82

本章小结 82

第4部分 组件构建原则

第12章 组件 84

组件发展史 85

重定位技术 88

链接器 88

本章小结 90

第13章 组件聚合 91

复用/发布等同原则 92

共同闭包原则 93

共同复用原则 94

组件聚合张力图 95

本章小结 97

第14章 组件耦合 98

无依赖环原则 99

自上而下的设计 105

稳定依赖原则 106

稳定抽象原则 112

本章小结 117

第5部分 软件架构

第15章 什么是软件架构 120

开发(Development) 122

部署(Deployment) 123

运行(Operation) 123

维护(Maintenance) 124

保持可选项 124

设备无关性 126

垃圾邮件 128

物理地址寻址 129

本章小结 130

第16章 独立性 131

用例 132

运行 133

开发 133

部署 134

保留可选项 134

按层解耦 135

用例的解耦 136

解耦的模式 136

开发的独立性 137

部署的独立性 137

重复 138

再谈解耦模式 139

本章小结 141

第17章 划分边界 142

几个悲伤的故事 143

FitNesse 146

应在何时、何处画这些线 148

输入和输出怎么办 151

插件式架构 152

插件式架构的好处 153

本章小结 154

第18章 边界剖析 155

跨边界调用 156

令人生畏的单体结构 156

部署层次的组件 158

线程 159

本地进程 159

服务 160

本章小结 161

第19章 策略与层次 162

层次(Level) 163

本章小结 166

第20章 业务逻辑 167

业务实体 168

用例 169

请求和响应模型 171

本章小结 172

第21章 尖叫的软件架构 173

架构设计的主题 174

架构设计的核心目标 175

那Web呢 175

框架是工具而不是生活信条 175

可测试的架构设计 176

本章小结 176

第22章 整洁架构 177

依赖关系规则 179

一个常见的应用场景 183

本章小结 184

第23章 展示器和谦卑对象 185

谦卑对象模式 186

展示器与视图 186

测试与架构 187

数据库网关 188

数据映射器 188

服务监听器 189

本章小结 189

第24章 不完全边界 190

省掉最后一步 191

单向边界 192

门户模式 193

本章小结 193

第25章 层次与边界 194

基于文本的冒险游戏:Hunt The Wumpus 195

可否采用整洁架构 196

交汇数据流 199

数据流的分割 199

本章小结 201

第26章 Main组件 203

最细节化的部分 204

本章小结 208

第27章 服务:宏观与微观 209

面向服务的架构 210

服务所带来的好处 210

运送猫咪的难题 212

对象化是救星 213

基于组件的服务 215

横跨型变更 216

本章小结 216

第28章 测试边界 217

测试也是一种系统组件 218

可测试性设计 219

测试专用API 220

本章小结 221

第29章 整洁的嵌入式架构 222

“程序适用测试”测试 225

目标硬件瓶颈 228

本章小结 238

第6部分 实现细节

第30章 数据库只是实现细节 240

关系型数据库 241

为什么数据库系统如此流行 242

假设磁盘不存在会怎样 243

实现细节 243

但性能怎么办呢 244

一段轶事 244

本章小结 246

第31章 Web是实现细节 247

无尽的钟摆 248

总结一下 250

本章小结 251

第32章 应用程序框架是实现细节 252

框架作者 253

单向婚姻 253

风险 254

解决方案 255

不得不接受的依赖 255

本章小结 256

第33章 案例分析:视频销售网站 257

产品 258

用例分析 258

组件架构 260

依赖关系管理 261

本章小结 262

第34章 拾遗 263

按层封装 264

按功能封装 266

端口和适配器 268

按组件封装 270

具体实现细节中的陷阱 274

组织形式与封装的区别 275

其他的解耦合模式 277

本章小结:本书拾遗 279

后序 280

附录A 架构设计考古 283

感悟与笔记

1. 设计与架构

软件架构的终极目标是,用最小的人力成本来满足构建和维护该系统的需求。

一个软件架构的优劣,可以用它满足用户需求所需要的成本来衡量。如果该成本很低,且在系统的生命周期内始终很低,那么这个系统的设计就是优良的。反之,就是不好的设计。

胡乱编写代码的工作速度,其实比循规蹈矩更慢。要想跑得快,先要跑得稳。

2. 两个价值维度

  • 行为价值:程序按照需求文档要求的方式工作
  • 架构价值:软件的“软”,即软件的灵活性

艾森豪威尔矩阵

重要且紧急 重要不紧急
不重要但紧急 不重要且不紧急
  • 紧急的事情往往没那么重要,而重要的事情似乎永远也排不上优先级。
  • 第一个价值维度:系统行为,是紧急的,但是并不总是特别重要。
  • 第二个价值维度:系统架构,是重要的,但是并不总是特别紧急。
  • 应有的排序:
    • 重要且紧急
    • 重要不紧急
    • 不重要但紧急
    • 不重要且不紧急
  • 常犯的错误:将第三优先级的事情提到第一优先级去做。导致重要的事情被忽略。
  • 平衡系统架构的重要性与功能的紧急程度,是软件研发人员自己的职责。

建议:为好的软件架构而持续斗争

研发团队必须从公司长远利益出发,与其他部门抗争,公司内部的抗争本来就是无止境的。

软件的可维护性需要由你来保护,这是你的职责,公司雇你的很大一部分原因就是需要有人来做这件事。

3. 编程范式

编程范式指的是程序的编写模式。一共只有三种编程范式,而且未来几乎不可能再出现新的(理由是,编程范式都是增加限制,Bob大叔的理解)。

一本谈软件架构的书,为什么要设计编程范式呢?Bob大叔如是说:

多态是我们跨越架构边界的手段,函数式编程是我们规范和限制数据存放位置与访问权限的手段,结构化编程则是各模块的算法实现的基础。

这和软件架构的三大关注重点不谋而合:功能性、组件独立性、数据管理。

结构化编程

  • 可推导性:可以用代码将一些已证明可用的结构串联起来,只要证明额外的代码是正确的,就可以推导出整个程序的正确性
  • goto语句的某些用法会导致某个模块无法被递归拆分成更小的、可证明的单元。
  • 如果某个结论经过一定的努力无法证伪,则认为它在当下是足够正确的。
  • 测试只能展示bug的存在,并不能证明不存在bug。

软件架构师需要定义可方便证伪(测试)的模块、组件及服务。为了达到这个目的,要将类似结构化编程的限制方法应用在更高的层面上。

面向对象编程

以多态为手段来对源代码中的依赖关系进行控制的能力。这种能力让软件架构师可以构建出某种插件式架构,让高层策略组件与底层实现组件相分离。

函数式编程

架构设计良好的程序,应该将状态修改的部分与不需要修改状态的部分隔离成单独的组件,然后用合适的机制来保护可比量。

4. 设计原则

SRP:单一职责原则

人们对单一指责原则的理解,是逐步发展的

  • 每个模块都应该只做一件事。
  • 任何一个软件模块都应该有且仅有一个被修改的原因。
  • 任何一个软件模块都应该只对某一类行为者负责。

OCP:开闭原则

设计良好的计算机软件系统应该易于扩展,同时抗拒修改。换句话说,在不需要修改的前提下就可以轻易被扩展。

一个好的软件架构设计师会努力将旧代码的修改需求量降至最小,甚至为0。如何做到呢?可先将满足不同需求的代码分组(即SRP),然后再来调整这些分组之间的依赖关系(即DIP)。

LSP:里氏替换原则

任何基类可以出现的地方,子类一定可以出现。

在架构上的意义,可以理解为插件式的架构,插件之间、子服务之间的可替换性。

ISP:接口隔离原则

任何层次的软件设计如果依赖了它并不需要的东西,就会带来意料之外的麻烦。

DIP:依赖反转原则

如果想要设计一个灵活的系统,在源代码层次的依赖关系中就该多引用抽象类型,而非具体实现。

相对而言,接口比实现更稳定。如果想要在软件架构设计上追求稳定,就必须多使用稳定的抽象接口,少依赖多变的具体实现。

  • 应在代码中多使用抽象接口,尽量避免使用那些多变的具体实现类。
  • 不要在具体实现类上创建衍生类
    • 在静态类型的编程语言中,继承关系是所有源代码依赖关系中最强的、最难被修改的,所以应该格外小心。
  • 不要覆盖(override)包含具体实现的函数
  • 应避免在代码中写入与任何具体实现相关的名字,或者是其他容易变动的事物的名字。

5. 组件构建原则

组件聚合

  • REP:复用/发布等同原则
    • 软件复用的最小粒度应等同于其发布的最小粒度。
    • 一个组件内的类和模块之间,应该有一个共同的主题或大方向。
    • 一个组件内的类和模块还应该可以同时发布。
  • CCP:共同闭包原则
    • 单一职责原则在组件层面上的再度阐释。
    • 要将所有可能被一起修改的类集中在一处。
    • 将由于相同原因而修改,且需要同时修改的东西放在一起。
  • CRP:共同复用原则
    • 接口隔离原则的一个普适版本。
    • 不要强迫一个组件的用户依赖他们不需要的东西。
    • 将经常共同复用的类和模块放在同一个组件中。
  • 组件聚合原则张力图(TODO:再明确一些,原书第96页)

组件耦合

  • 无依赖环原则
    • 必须控制好组件之间的依赖结构,绝对不允许该结构中存在循环依赖关系。
    • 有向无环图(Directed Acyclic Graph, DAG)
    • 打破循环依赖的方法
      • 应用依赖反转原则
      • 创建一个新组件,让二者都依赖于它
  • 自上而下的设计
    • 组件结构图是不可能自上而下被设计出来的。它必须随着软件系统的变化而变化、扩张,而不可能在系统构建的最初就完美设计出来。
    • 组件结构图并不是用来描述应用程序功能的,它更像是应用程序在构建性与维护性方面的一张地图。
    • 组件结构图的一个重要目标是指导如何隔离频繁的变更。
  • 稳定依赖原则
    • 依赖关系必须要指向更稳定的方向。
  • 稳定抽象原则
    • 一个组件的抽象化程度应该与其稳定性保持一致。

会员免费下载

链接:https://pan.baidu.com/s/1y_Go0U5tZLG5RW9BU5yxnA

提取码: ****** 查看

¥69/年 开通VIP会员

成为本站VIP会员即可无限下载。 请先点击百度网盘,看资源是否还在,不在请点击链接通知站长补资源。

资源标签点击标签可查看对应分类的资源

其他软件架构

资源推荐

免费 图解数据结构:使用Java

C++ 程序设计语言:第4部分 标准库(原书第4版)

C++编程思想(两卷合订本)

CSS世界

JavaScript DOM编程艺术(第2版)

C++ Primer Plus(第6版) 中文版

Vue.js快速入门

Java编程思想(第4版) [thinking in java]

Copyright © 2021-2022 知识猫. All Rights Reserved.