本书中,享誉全球的软件开发专家和软件工程大师Robert C. Martin深入而生动地使用真实案例讲解了面向对象基本原则、重要的设计模式、UML和敏捷实践等程序员必备的知识。本书于2003年荣获第13届Jolt大奖,是C++和Java程序员提高自身水平的绝佳教材,也适于用作高校计算机、软件工程专业相关课程的教材或参考书。
目录
- 第一部分 敏捷开发
- 第1章 敏捷实践 3
- 1.1 敏捷联盟 4
- 1.1.1 人和交互重于过程和工具 4
- 1.1.2 可以工作的软件重于面面俱到的文档 5
- 1.1.3 客户合作重于合同谈判 5
- 1.1.4 随时应对变化重于遵循计划 6
- 1.2 原则 6
- 1.3 结论 8
- 1.4 参考文献 8
- 第2章 极限编程概述 9
- 2.1 极限编程实践 9
- 2.1.1 完整团队 9
- 2.1.2 用户故事 10
- 2.1.3 短交付周期 10
- 2.1.4 验收测试 10
- 2.1.5 结对编程 11
- 2.1.6 测试驱动开发 11
- 2.1.7 集体所有权 12
- 2.1.8 持续集成 12
- 2.1.9 可持续的开发速度 12
- 2.1.10 开放的工作空间 13
- 2.1.11 计划游戏 13
- 2.1.12 简单设计 13
- 2.1.13 重构 14
- 2.1.14 隐喻 14
- 2.2 结论 15
- 2.3 参考文献 15
- 第3章 计划 16
- 3.1 初始探索 17
- 3.2 发布计划 17
- 3.3 迭代计划 18
- 3.4 定义“完成” 18
- 3.5 任务计划 18
- 3.6 迭代 19
- 3.7 跟踪 19
- 3.8 结论 20
- 3.9 参考文献 21
- 第4章 测试 22
- 4.1 测试驱动开发 22
- 4.1.1 测试优先设计的例子 23
- 4.1.2 测试促使模块之间隔离 24
- 4.1.3 意外获得的解耦合 25
- 4.2 验收测试 26
- 4.3 意外获得的构架 27
- 4.4 结论 27
- 4.5 参考文献 28
- 第5章 重构 29
- 5.1 素数产生程序:一个简单的重构示例 30
- 5.1.1 单元测试 31
- 5.1.2 重构 32
- 5.1.3 最后审视 35
- 5.2 结论 38
- 5.3 参考文献 39
- 第6章 一次编程实践 40
- 6.1 保龄球比赛 40
- 6.2 结论 75
- 第二部分 敏捷设计
- 第7章 什么是敏捷设计 81
- 7.1 设计臭味 81
- 7.1.1 设计臭味——腐化软件的气味 82
- 7.1.2 僵化性 82
- 7.1.3 脆弱性 82
- 7.1.4 顽固性 82
- 7.1.5 粘滞性 82
- 7.1.6 不必要的复杂性 83
- 7.1.7 不必要的重复 83
- 7.1.8 晦涩性 83
- 7.2 软件为何会腐化 84
- 7.3 Copy程序 84
- 7.3.1 熟悉的场景 84
- 7.3.2 Copy程序的敏捷设计 87
- 7.4 结论 88
- 7.5 参考文献 88
- 第8章 SRP:单一职责原则 89
- 8.1 定义职责 90
- 8.2 分离耦合的职责 91
- 8.3 持久化 92
- 8.4 结论 92
- 8.5 参考文献 92
- 第9章 OCP:开放-封闭原则 93
- 9.1 OCP概述 94
- 9.2 Shape应用程序 95
- 9.2.1 违反OCP 95
- 9.2.2 遵循OCP 97
- 9.2.3 预测变化和“贴切的”结构 98
- 9.2.4 放置吊钩 99
- 9.2.5 使用抽象获得显式封闭 99
- 9.2.6 使用“数据驱动”的方法获取封闭性 100
- 9.3 结论 101
- 9.4 参考文献 101
- 第10章 LSP:Liskov替换原则 102
- 10.1 违反LSP的情形 103
- 10.1.1 简单例子 103
- 10.1.2 更微妙的违反情形 104
- 10.1.3 实际的例子 108
- 10.2 用提取公共部分的方法代替继承 111
- 10.3 启发式规则和习惯用法 113
- 10.4 结论 114
- 10.5 参考文献 114
- 第11章 DIP:依赖倒置原则 115
- 11.1 层次化 116
- 11.1.1 倒置的接口所有权 117
- 11.1.2 依赖于抽象 117
- 11.2 简单的DIP示例 117
- 11.3 熔炉示例 119
- 11.4 结论 121
- 11.5 参考文献 121
- 第12章 ISP:接口隔离原则 122
- 12.1 接口污染 122
- 12.2 分离客户就是分离接口 123
- 12.3 类接口与对象接口 124
- 12.3.1 使用委托分离接口 124
- 12.3.2 使用多重继承分离接口 125
- 12.4 ATM用户界面的例子 126
- 12.5 结论 131
- 12.6 参考文献 131
- 第13章 C#程序员UML概观 132
- 13.1 类图 134
- 13.2 对象图 135
- 13.3 顺序图 136
- 13.4 协作图 136
- 13.5 状态图 137
- 13.6 结论 137
- 13.7 参考文献 137
- 第14章 使用UML 138
- 14.1 为什么建模 138
- 14.1.1 为什么构建软件模型 139
- 14.1.2 编码前应该构建面面俱到的设计吗 139
- 14.2 有效使用UML 139
- 14.2.1 与他人交流 139
- 14.2.2 脉络图 141
- 14.2.3 项目结束文档 142
- 14.2.4 要保留的和要丢弃的 142
- 14.3 迭代式改进 143
- 14.3.1 行为优先 143
- 14.3.2 检查结构 144
- 14.3.3 想象代码 146
- 14.3.4 图的演化 147
- 14.4 何时以及如何绘制图示 147
- 14.4.1 何时要画图,何时不要画图 147
- 14.4.2 CASE 工具 148
- 14.4.3 那么,文档呢 149
- 14.5 结论 149
- 第15章 状态图 150
- 15.1 基础知识 150
- 15.1.1 特定事件 151
- 15.1.2 超状态 152
- 15.1.3 初始伪状态和结束伪状态 153
- 15.2 使用FSM图示 153
- 15.3 结论 154
- 第16章 对象图 155
- 16.1 即时快照 155
- 16.2 主动对象 156
- 16.3 结论 159
- 第17章 用例 160
- 17.1 编写用例 160
- 17.1.1 备选流程 161
- 17.1.2 其他东西呢 161
- 17.2 用例图 162
- 17.3 结论 162
- 17.4 参考文献 162
- 第18章 顺序图 163
- 18.1 基础知识 163
- 18.1.1 对象、生命线、消息及其他 164
- 18.1.2 创建和析构 164
- 18.1.3 简单循环 165
- 18.1.4 时机和场合 166
- 18.2 高级概念 168
- 18.2.1 循环和条件 168
- 18.2.2 耗费时间的消息 169
- 18.2.3 异步消息 171
- 18.2.4 多线程 174
- 18.2.5 主动对象 175
- 18.2.6 向接口发送消息 175
- 18.3 结论 175
- 第19章 类图 177
- 19.1 基础知识 177
- 19.1.1 类 177
- 19.1.2 关联 178
- 19.1.3 继承 179
- 19.2 类图示例 180
- 19.3 细节 181
- 19.3.1 类衍型 181
- 19.3.2 抽象类 182
- 19.3.3 属性 183
- 19.3.4 聚集 183
- 19.3.5 组合 184
- 19.3.6 多重性 185
- 19.3.7 关联衍型 186
- 19.3.8 内嵌类 187
- 19.3.9 关联类 187
- 19.3.10 关联修饰符 187
- 19.4 结论 188
- 19.5 参考文献 188
- 第20章 咖啡的启示 189
- 20.1 Mark IV型专用咖啡机 189
- 20.1.1 规格说明书 190
- 20.1.2 常见的丑陋方案 192
- 20.1.3 虚构的抽象 193
- 20.1.4 改进方案 194
- 20.1.5 实现抽象模型 198
- 20.1.6 这个设计的好处 209
- 20.2 面向对象过度设计 214
- 20.3 参考文献 214
- 第三部分 薪水支付案例研究
- 第21章 COMMAND模式和ACTIVE OBJECT模式:多功能与多任务 219
- 21.1 简单的Command 220
- 21.2 事务 221
- 21.2.1 实体上解耦和时间上解耦 222
- 21.2.2 时间上解耦 223
- 21.3 Undo()方法 223
- 21.4 ACTIVE OBJECT模式 224
- 21.5 结论 227
- 21.6 参考文献 228
- 第22章 TEMPLATE METHOD模式和STRATEGY模式:继承和委托 229
- 22.1 TEMPLATE METHOD模式 230
- 22.1.1 滥用模式 232
- 22.1.2 冒泡排序 232
- 22.2 STRATEGY模式 235
- 22.3 结论 239
- 22.4 参考文献 239
- 第23章 FACADE模式和MEDIATOR模式 240
- 23.1 FACADE模式 240
- 23.2 MEDIATOR模式 241
- 23.3 结论 243
- 23.4 参考文献 243
- 第24章 SINGLETON模式和MONOSTATE模式 244
- 24.1 SINGLETON模式 245
- 24.1.1 SINGLETON模式的好处 246
- 24.1.2 SINGLETON模式的代价 246
- 24.1.3 运用SINGLETON模式 246
- 24.2 MONOSTATE模式 247
- 24.2.1 MONOSTATE模式的好处 249
- 24.2.2 MONOSTATE模式的代价 249
- 24.2.3 运用MONOSTATE模式 249
- 24.3 结论 253
- 24.4 参考文献 253
- 第25章 NULL OBJECT模式 254
- 25.1 描述 254
- 25.2 结论 256
- 25.3 参考文献 256
- 第26章 薪水支付案例研究:第一次迭代开始 257
- 26.1 初步的规格说明 257
- 26.2 基于用例分析 258
- 26.2.1 增加新雇员 259
- 26.2.2 删除雇员 260
- 26.2.3 登记考勤卡 260
- 26.2.4 登记销售凭条 260
- 26.2.5 登记工会服务费 261
- 26.2.6 更改雇员明细 261
- 26.2.7 发薪日 263
- 26.3 反思:找出底层的抽象 264
- 26.3.1 雇员支付类别抽象 264
- 26.3.2 支付时间表抽象 265
- 26.3.3 支付方式 266
- 26.3.4 从属关系 266
- 26.4 结论 266
- 26.5 参考文献 267
- 第27章 薪水支付案例研究:实现 268
- 27.1 事务 268
- 27.1.1 增加雇员 269
- 27.1.2 删除雇员 273
- 27.1.3 考勤卡、销售凭条以及服务
- 费用 274
- 27.1.4 更改雇员属性 280
- 27.1.5 犯了什么晕 287
- 27.1.6 支付雇员薪水 290
- 27.1.7 支付领月薪的雇员薪水 292
- 27.1.8 支付钟点工薪水 294
- 27.2 主程序 302
- 27.3 数据库 303
- 27.4 结论 304
- 27.5 关于本章 304
- 27.6 参考文献 305
- 第四部分 打包薪水支付系统
- 第28章 包和组件的设计原则 308
- 28.1 包和组件 308
- 28.2 组件的内聚性原则:粒度 309
- 28.2.1 重用—发布等价原则 309
- 28.2.2 共同重用原则 310
- 28.2.3 共同封闭原则 311
- 28.2.4 组件内聚性总结 311
- 28.3 组件的耦合性原则:稳定性 311
- 28.3.1 无环依赖原则 311
- 28.3.2 稳定依赖原则 316
- 28.3.3 稳定抽象原则 319
- 28.4 结论 322
- 第29章 FACTORY模式 323
- 29.1 依赖问题 325
- 29.2 静态类型与动态类型 326
- 29.3 可替换的工厂 326
- 29.4 对测试支架使用对象工厂 327
- 29.5 工厂的重要性 328
- 29.6 结论 329
- 29.7 参考文献 329
- 第30章 薪水支付案例研究:包分析 330
- 30.1 组件结构和符号 330
- 30.2 应用CCP 332
- 30.3 应用REP 333
- 30.4 耦合和封装 335
- 30.5 度量 336
- 30.6 度量薪水支付应用程序 337
- 30.6.1 对象工厂 340
- 30.6.2 重新思考内聚的边界 342
- 30.7 最终的包结构 342
- 30.8 结论 345
- 30.9 参考文献 345
- 第31章 COMPOSITE模式 346
- 31.1 组合命令 347
- 31.2 多重性还是非多重性 348
- 31.3 结论 348
- 第32章 OBSERVER——演化至模式 349
- 32.1 数字时钟 350
- 32.2 OBSERVER模式 365
- 32.2.1 模型 365
- 32.2.2 面向对象设计原则的运用 366
- 32.3 结论 366
- 32.4 参考文献 367
- 第33章 ABSTRACT SERVER模式、 ADAPTER模式和BRIDGE模式 368
- 33.1 ABSTRACT SERVER模式 369
- 33.2 ADAPTER模式 370
- 33.2.1 类形式的ADAPTER模式 370
- 33.2.2 调制解调器问题、适配器以及LSP 370
- 33.3 BRIDGE模式 374
- 33.4 结论 375
- 33.5 参考文献 376
- 第34章 PROXY模式和GATEWAY模式:管理第三方API 377
- 34.1 PROXY模式 377
- 34.1.1 实现PROXY模式 381
- 34.1.2 小结 391
- 34.2 数据库、中间件以及其他第三方接口 392
- 34.3 TABLE DATA GATEWAY 394
- 34.3.1 测试和内存TDG 399
- 34.3.2 测试DbGateWay 400
- 34.4 可以用于数据库的其他模式 403
- 34.5 结论 404
- 34.6 参考文献 404
- 第35章 VISITOR模式 405
- 35.1 VISITOR模式 406
- 35.2 ACYCLIC VISITOR模式 409
- 35.3 DECORATOR模式 418
- 35.4 EXTENSION OBJECT模式 423
- 35.5 结论 432
- 35.6 参考文献 432
- 第36章 STATE模式 433
- 36.1 嵌套switch/case语句 434
- 36.1.1 内部作用域的状态变量 436
- 36.1.2 测试动作 436
- 36.1.3 代价和收益 436
- 36.2 迁移表 437
- 36.2.1 使用表解释 437
- 36.2.2 代价和收益 438
- 36.3 STATE模式 439
- 36.3.1 STATE模式和 STRATEGY模式 441
- 36.3.2 代价和收益 442
- 36.4 状态机编译器 442
- 36.4.1 SMC生成的Turnstile.cs以及其他支持文件 443
- 36.4.2 代价和收益 448
- 36.5 状态机应用的场合 448
- 36.5.1 作为GUI中的高层应用策略 448
- 36.5.2 GUI交互控制器 450
- 36.5.3 分布式处理 450
- 36.6 结论 451
- 36.7 参考文献 451
- 第37章 薪水支付案例研究:数据库 452
- 37.1 构建数据库 452
- 37.2 一个代码设计缺陷 453
- 37.3 增加雇员 455
- 37.4 事务 464
- 37.5 加载Employee对象 468
- 37.6 还有什么工作 478
- 第38章 薪水支付系统用户界面:Model-View-Presenter 479
- 38.1 界面 480
- 38.2 实现 481
- 38.3 构建窗口 489
- 38.4 Payroll窗口 495
- 38.5 真面目 504
- 38.6 结论 505
- 38.7 参考文献 505
- 附录A 双公司记 506
- Rufus公司:“日落”项目 506
- Rupert工业公司:“朝晖”项目 506
- 附录B 什么是软件 516
-
索引 524