Clean Architecture:软件架构与设计匠艺(英文版)
  • 推荐1
  • 收藏5
  • 浏览1.1K

Clean Architecture:软件架构与设计匠艺(英文版)

Robert C. Martin (作者)  Robert C. Martin(罗伯特·C·马丁) (译者)

  • 丛  书:原味精品书系
  • 书  号:978-7-121-34261-5
  • 出版日期:2018-07-01
  • 页  数:
  • 开  本:
  • 出版状态:正在印刷
  • 原书名: Clean Architecture: A Craftsman's Guide to Software Structure and Design
  • 原书号:9780134494166
  • 维护人:刘佳禾
马丁的简介代码不仅仅是提供选项。在半个世纪的软件环境中,每一种可以想象的类型,马丁告诉你做出什么选择,以及为什么它们对你的成功至关重要。正如你所渴望的,这本书中充斥着直接的、不复杂的解决方案,你将面对那些能使你的项目成败的真正挑战。
通过应用软件体系结构的通用规则,在任何软件系统的整个生命周期中显著地提高开发人员的生产率。
前言


软件架构(Architecture)究竟指的是什么呢?
正向比喻是一种修辞手法,试图用架构的语言来描述某个软件,结果可粗可细,可能会过度描述,也可能会表达不足。
用架构来描述软件的明显优势是可以清晰地描绘其内在的组织结构(structure)。不管是在讨论组件、类、函数、模块(module)、还是层级、服务、微观与宏观的软件开发过程,组织结构都是一个主要关注点。但是真实世界中的许多软件项目并不是按我们的信念和理解生长的——它们底层层层嵌套,顶层则往往是一团乱麻,相互纠缠。有的时候真的很难让人相信,软件项目的组织结构性也能像物理建筑那样一目了然,层次清晰。
物理建筑,不管地基是石头还是水泥,高大还是宽阔,宏伟还是渺小,其组织结构都一目了然。物理建筑的组织结构必须被“重力”这个自然规律以及建筑材料自身的物理特性所约束。用砖头、水泥、木头、钢铁或者玻璃造就的物理建筑与软件项目相比,最大的不同点就是,大型软件项目由软件组件构成,而这些软件组件又由更小的软件组件构成,层层嵌套。
当我们讨论软件架构时,尤其要注意软件项目是具有递归(recursive)和分形(fractal)特点的,最终都要由一行行的代码组成。脱离了一行行的代码,脱离了具体的细节(detail)设计,架构问题就无从谈起。大型物理建筑的组织架构常常是由其中一个个细节设计共同决定的,如果细节设计太多,那么组织架构就会更复杂,反之亦然。但是软件项目的复杂程度却不一定能用物理尺度来衡量。软件项目也有组织结构,不论从数量上还是种类多样性上都远远超过物理建筑。我们可以很明确地说,软件开发比修建物理建筑需要更多、更专注的设计过程,软件架构师比建筑架构师更懂架构!
虽然人类已经习惯了使用物理尺度来衡量和理解现实世界,但这些却不适用于软件项目。不管某个PowerPoint图表中的彩色方块多么好看、多么简单易懂,也无法完全代表一个软件的架构。它只能是某个软件架构的某种展现形式。软件架构并没有一个固定的展现形式,每一种展现形式都建立在背后的层层抉择之上,例如,哪些部分要包含其中,哪些则应该被排除;哪些部分用特殊形状和颜色进行强调,哪些部分则一笔带过,甚至直接忽略。每种表现形式都是对的,它们往往没有任何内在的联系。
虽然软件可能是人凭空编造出来的,但还是要在现实世界中运行。虽然在设计软件架构的过程中物理定律和物理尺度可能并不是主要考虑的对象,但我们还是要理解和遵循某些约束条件。CPU速度和网络带宽往往直接决定了系统的性能。内存和存储的大小限制也会影响代码的设计。
这就是爱的不幸,期待是无穷的,但行动却是有限的,欲望是无止境的,体验却如奴隶般受限。
——William Shakespeart
无论如何,我们和我们的公司,乃至于整个经济活动都存在于现实世界中,我们可以利用现实世界的一些准则来衡量和推理软件开发过程中那些不好量化和物化的因素。
软件架构是系统设计过程中所有重要设计决定的集合,其中每个设计决定的重要程度则通过变更成本来衡量。
——Grady Booch
时间、金钱以及努力是软件架构中区分规模大小的衡量标准,也是架构和细节的区分标准。通过对这些要素的衡量,我们可以判断某个特定架构是好或坏:一个好的架构,不仅要在某一特定时刻满足软件用户、开发者和所有者的需求,更需要在一段时间以内持续满足他们的后续要求。
如果你觉得好架构的成本太高,那你可以试试差的架构加上返工重来的成本。
——Brian Foote,Joseph Yoder
一个系统的常规变更需求成本不应该是昂贵的,也不应该伴随着难以决策的大型设计而调整,更不应该需要一个独立的项目来单独完成。这些常规变更应该可以归入每日或者每周的日常系统维护中去。
要解决这个问题,还有一个不小的物理难题:时间旅行。我们怎么能够知道某个系统未来的变更需求,以便提前做准备呢?我们怎么能在没有水晶球与时间旅行机的情况下,未卜先知,降低未来的变更成本呢?
所谓架构,就是你希望能在项目一开始就做对,但是却不一定能够做对的决策的集合。
——Ralph Johnson
了解历史已经够难了,我们对现实的掌握最多也只有七八成,预言未来就更加困难。
我们架构师们每天都站在这样拥有无穷选择的交叉路口。

目录

PART I Introduction 1
Chapter 1 What Is Design and Architecture? 3
The Goal? 4
Case Study 5
Conclusion 12
Chapter 2 A Tale of Two Values 13
Behavior 14
Architecture 14
The Greater Value 15
Eisenhower’s Matrix 16
Fight for the Architecture 18
PART II Starting with the Bricks: Programming Paradigms 19
Chapter 3 Paradigm Overview 21
Structured Programming 22
Object-Oriented Programming 22
Functional Programming 22
Food for Thought 23
Conclusion 24
Chapter 4 Structured Programming 25
Proof 27
A Harmful Proclamation 28
Functional Decomposition 29
No Formal Proofs 30
Science to the Rescue 30
Tests 31
Conclusion 31
Chapter 5 Object-Oriented Programming 33
Encapsulation? 34
Inheritance? 37
Polymorphism? 40
Conclusion 47
Chapter 6 Functional Programming 49
Squares of Integers 50
Immutability and Architecture 52
Segregation of Mutability 52
Event Sourcing 54
Conclusion 56
PART III Design Principles 57
Chapter 7 SRP: The Single Responsibility Principle 61
Symptom 1: Accidental Duplication 63
Symptom 2: Merges 65
Solutions 66
Conclusion 67
Chapter 8 OCP: The Open-Closed Principle 69
A Thought Experiment 70
Directional Control 74
Information Hiding 74
Conclusion 75
Chapter 9 LSP: The Liskov Substitution Principle 77
Guiding the Use of Inheritance 78
The Square/Rectangle Problem 79
LSP and Architecture 80
Example LSP Violation 80
Conclusion 82
Chapter 10 ISP: The Interface Segregation Principle 83
ISP and Language 85
ISP and Architecture 86
Conclusion 86
Chapter 11 DIP: The Dependency Inversion Principle 87
Stable Abstractions 88
Factories 89
Concrete Components 91
Conclusion 91
PART IV Component Principles 93
Chapter 12 Components 95
A Brief History of Components 96
Relocatability 99
Linkers 100
Conclusion 102
Chapter 13 Component Cohesion 103
The Reuse/Release Equivalence Principle 104
The Common Closure Principle 105
The Common Reuse Principle 107
The Tension Diagram for Component Cohesion 108
Conclusion 110
Chapter 14 Component Coupling 111
The Acyclic Dependencies Principle 112
Top-Down Design 118
The Stable Dependencies Principle 120
The Stable Abstractions Principle 126
Conclusion 132
PART V Architecture 133
Chapter 15 What Is Architecture? 135
Development 137
Deployment 138
Operation 138
Maintenance 139
Keeping Options Open 140
Device Independence 142
Junk Mail 144
Physical Addressing 145
Conclusion 146
Chapter 16 Independence 147
Use Cases 148
Operation 149
Development 149
Deployment 150
Leaving Options Open 150
Decoupling Layers 151
Decoupling Use Cases 152
Decoupling Mode 153
Independent Develop-ability 153
Independent Deployability 154
Duplication 154
Decoupling Modes (Again) 155
Conclusion 158
Chapter 17 Boundaries: Drawing Lines 159
A Couple of Sad Stories 160
FitNesse 163
Which Lines Do You Draw, and When Do You Draw Them? 165
What About Input and Output? 169
Plugin Architecture 170
The Plugin Argument 172
Conclusion 173
Chapter 18 Boundary Anatomy 175
Boundary Crossing 176
The Dreaded Monolith 176
Deployment Components 178
Threads 179
Local Processes 179
Services 180
Conclusion 181
Chapter 19 Policy and Level 183
Level 184
Conclusion 187
Chapter 20 Business Rules 189
Entities 190
Use Cases 191
Request and Response Models 193
Conclusion 194
Chapter 21 Screaming Architecture 195
The Theme of an Architecture 196
The Purpose of an Architecture 197
But What About the Web? 197
Frameworks Are Tools, Not Ways of Life 198
Testable Architectures 198
Conclusion 199
Chapter 22 The Clean Architecture 201
The Dependency Rule 203
A Typical Scenario 207
Conclusion 209
Chapter 23 Presenters and Humble Objects 211
The Humble Object Pattern 212
Presenters and Views 212
Testing and Architecture 213
Database Gateways 214
Data Mappers 214
Service Listeners 215
Conclusion 215
Chapter 24 Partial Boundaries 217
Skip the Last Step 218
One-Dimensional Boundaries 219
Facades 220
Conclusion 220
Chapter 25 Layers and Boundaries 221
Hunt the Wumpus 222
Clean Architecture? 223
Crossing the Streams 226
Splitting the Streams 227
Conclusion 228
Chapter 26 The Main Component 231
The Ultimate Detail 232
Conclusion 237
Chapter 27 Services: Great and Small 239
Service Architecture? 240
Service Benefits? 240
The Kitty Problem 242
Objects to the Rescue 244
Component-Based Services 245
Cross-Cutting Concerns 246
Conclusion 247
Chapter 28 The Test Boundary 249
Tests as System Components 250
Design for Testability 251
The Testing API 252
Conclusion 253
Chapter 29 Clean Embedded Architecture 255
App-titude Test 258
The Target-Hardware Bottleneck 261
Conclusion 273
PART VI Details 275
Chapter 30 The Database Is a Detail 277
Relational Databases 278
Why Are Database Systems So Prevalent? 279
What If There Were No Disk? 280
Details 281
But What about Performance? 281
Anecdote 281
Conclusion 283
Chapter 31 The Web Is a Detail 285
The Endless Pendulum 286
The Upshot 288
Conclusion 289
Chapter 32 Frameworks Are Details 291
Framework Authors 292
Asymmetric Marriage 292
The Risks 293
The Solution 294
I Now Pronounce You … 295
Conclusion 295
Chapter 33 Case Study: Video Sales 297
The Product 298
Use Case Analysis 298
Component Architecture 300
Dependency Management 302
Conclusion 302
Chapter 34 The Missing Chapter 303
Package by Layer 304
Package by Feature 306
Ports and Adapters 308
Package by Component 310
The Devil Is in the Implementation Details 315
Organization versus Encapsulation 316
Other Decoupling Modes 319
Conclusion: The Missing Advice 321
PART VII Appendix 323
Appendix A Architecture Archaeology 325
Index 375

读者评论

推荐用户

同系列书

  • Clean Architecture:软件架构与设计匠艺(英文版)

    Robert C. Martin (作者) Robert C. Martin(罗伯特·C·马丁) (译者)

    马丁的简介代码不仅仅是提供选项。在半个世纪的软件环境中,每一种可以想象的类型,马丁告诉你做出什么选择,以及为什么它们对你的成功至关重要。正如你所渴望的,这本书中...

     
  • Effective Java(第2版)英文版

    (美)Joshua Bloch(约书亚·布洛赫) (作者) 无 (译者)

    本书通过78个有效案例,旨在帮助读者深入理解Java,以写出更加清楚、健壮、可重复使用的代码。书中每个章节均包含小论文,针对Java平台和杰出的代码样例,提供了...

    ¥65.00
  • C11编程导论英文版

    (美)Paul Deitel(保罗·戴特尔),(美) Harvey Deitel(哈维·戴特尔) (作者) (译者)

    本书沿用了Deitel特色的“程序实况解说”,深入探讨了C语言和C标准库。通过完整的语法着色、代码高亮、代码演练和程序输出,全面地介绍了测试程序的概念。本书汇集...

    ¥89.00
  • Effective Javascript:编写高质量JavaScript代码的68个有效方法 英文版

    (美)David Herman(大卫·赫尔曼) (作者) 无 (译者)

    本书由资深 JavaScript 技术专家 David Herman 所著。书中基于 JavaScript 标准的新版本前所未有地阐明了 JavaScript ...

    ¥65.00
  • Effective Python:编写高质量Python代码的59个有效方法 英文版

    (美)Brett Slatkin(布雷特·斯拉特金) (作者) 无 (译者)

    本书不是要讲述 Python 的基础编程,而是要帮你掌握 Python 独特的优势和魅力。书中总结了 59个 Python 编程的优秀实践、贴士和捷径,并用真实...

    ¥65.00

相关图书

亿级流量系统架构设计与实战

李琛轩 (作者)

本书涵盖了亿级用户应用后台通用的技术和系统架构设计思路,在内容结构上分为三大篇:架构知识篇(第1~3章),作为全书的基础知识篇,首先介绍后台的关键组件构成以及机...

 

算法笔记(第2版)

刁瑞 谢妍 (作者)

ChatGPT掀起了现象级的风暴,赶超ChatGPT潮流,算法突破是关键。 本书介绍了若干常见算法,涉及排序、哈希、动态规划与近似算法、高斯消去法、图论与线性...

 

看漫画学Python:有趣、有料、好玩、好用(全彩修订版)

关东升 赵大羽 (作者)

ython是一门既简单又强大的编程语言,被广泛应用于数据分析、大数据、网络爬虫、自动化运维、科学计算和人工智能等领域。Python也越来越重要,成为国家计算机等...

 

Linux从入门到精通

张启玉 (作者)

本书以CentOS 7.8为演示系统,以阿里云为演示服务器,从Linux常用命令入手,从一毕业就要入职公司的上手要求出发,重实战、轻原理,目的就是要带领读者从一...

 

看漫画学Python 2:有趣、有料、好玩、好用(全彩进阶版)

关东升 ,赵大羽 (作者)

本书是《看漫画学Python》的进阶版本,继续秉承有趣、有料、好玩、好用的理念,并继续采用《看漫画学Python》一书中3个不同的漫画人物角色,通过这3个角色之...

 

趣玩Python:自动化办公真简单(双色+视频版)

本书以数据收集→数据清洗→数据分析→数据可视化→根据数据可视化结果(即图表)做决策为脉络,介绍Python在实际工作场景中的应用,侧重于用Python解决工作中...