《修改代码的艺术》PDF下载

  • 购买积分:12 如何计算积分?
  • 作  者:(美)MichaelC·Feathers著
  • 出 版 社:北京:机械工业出版社
  • 出版年份:2014
  • ISBN:9787111466253
  • 页数:312 页
图书介绍:修改代码是每一位软件开发人员的日常工作。开发人员常常面对的现实是,即便是最训练有素的开发团队也会写出混乱的代码,而且系统的腐化程度也会日积月累。本书是一部里程碑式的著作,针对大型的、无测试的遗留代码基,提供了从头到尾的方案,让你能够更有效地应付它们,将你的遗留代码基改善得具有更高性能、更多功能、更好的可靠性和可控性。本书还包括了一组共24项解依赖技术,它们能帮助你单独对付代码中的问题片段,并实现更安全的修改。

第一部分 修改机制 2

第1章 修改软件 2

1.1 修改软件的四大原因 2

1.1.1 增加特性和修正缺陷 2

1.1.2 改善设计 4

1.1.3 优化 4

1.2 组合在一起 4

第2章 利用反馈 7

2.1 什么是单元测试 9

2.2 高层次测试 11

2.3 测试覆盖 11

2.4 遗留代码修改方法 14

2.4.1 确定变更点 14

2.4.2 找到测试点 14

2.4.3 打破依赖关系 14

2.4.4 编写测试 15

2.4.5 做出修改并重构 15

2.5 本书其他部分 15

第3章 感知和分离 16

3.1 伪协作程序 17

3.1.1 伪对象 17

3.1.2 伪对象的两面 20

3.1.3 伪对象总结 20

3.1.4 模拟对象 21

第4章 接缝模型 22

4.1 大片的文本 22

4.2 接缝 23

4.3 接缝类型 25

4.3.1 预处理接缝 26

4.3.2 链接接缝 28

4.3.3 对象接缝 31

第5章 工具 36

5.1 自动化重构工具 36

5.2 模拟对象 38

5.3 单元测试用具 38

5.3.1 JUnit 39

5.3.2 CppUnitLite 40

5.3.3 NUnit 41

5.3.4 其他xUnit框架 42

5.4 一般测试用具 42

5.4.1 集成测试框架(Framework for Integrated Test,FIT) 42

5.4.2 Fitnesse 43

第二部分 修改软件 46

第6章 时间很紧张,但还需要修改 46

6.1 新生方法(Sprout Method) 48

6.2 新生类(Sprout Class) 50

6.3 包装方法 54

6.4 包装类 57

6.5 小结 61

第7章 永远都无法完成的修改 62

7.1 理解 62

7.2 延迟时间 63

7.3 打破依赖关系 63

7.4 构建依赖关系 64

7.5 小结 67

第8章 如何添加新特性 68

8.1 测试驱动开发 68

8.1.1 编写失败的测试案例 69

8.1.2 对其进行编译 69

8.1.3 使其通过 69

8.1.4 去除重复的内容 70

8.1.5 编写失败的测试案例 70

8.1.6 对其进行编译 70

8.1.7 使其通过 71

8.1.8 去除重复的内容 71

8.1.9 编写失败的测试案例 71

8.1.10 对其进行编译 71

8.1.11 使其通过 72

8.1.12 去除重复的内容 73

8.2 根据差异编程 74

8.3 小结 81

第9章 无法把类放到测试用具中 82

9.1 恼人的参数 82

9.2 具有隐藏依赖的情况 88

9.3 构造Blob的情况 90

9.4 恼人的全局依赖 92

9.5 可怕的Include依赖 99

9.6 洋葱皮参数 102

9.7 别名参数 104

第10章 无法在测试用具中运行方法 107

10.1 隐藏方法的情况 107

10.2 “有帮助的”语言特性 110

10.3 检测不到的副作用 112

第11章 我需要修改代码,应该测试哪些方法 119

11.1 推断影响 119

11.2 正向推理 124

11.3 影响传播 128

11.4 推理影响的工具 129

11.5 从影响分析中学习 131

11.6 简化影响草图 132

第12章 我需要在一个地方做多处变更,需要为所有涉及的类打破依赖关系吗 134

12.1 拦截点 135

12.1.1 简单的情况 135

12.1.2 更高层次的拦截点 137

12.2 使用夹点来判断设计 140

12.3 夹点陷阱 141

第13章 我需要修改代码,但不知道要编写哪些测试 142

13.1 鉴定测试 142

13.2 鉴定类 145

13.3 定向测试(Targeted Testing) 146

13.4 编写鉴定测试的启示 150

第14章 对库的依赖让我快要崩溃了 151

第15章 应用全是API调用 153

第16章 对代码理解不够,所以无法修改 160

16.1 做笔记,画草图 160

16.2 列表标记 161

16.2.1 分离职责 162

16.2.2 理解方法结构 162

16.2.3 提取方法 162

16.2.4 理解变更的影响 162

16.3 临时重构 162

16.4 删除没有用的代码 163

第17章 应用没有结构 164

17.1 讲述系统的故事 165

17.2 裸CRC 167

17.3 对话审查(Conversation Scrutiny) 170

第18章 测试代码挡路了 171

18.1 类命名规范 171

18.2 测试位置 172

第19章 项目并非面向对象,如何才能够安全地修改 174

19.1 简单的案例 174

19.2 困难的案例 175

19.3 增加新行为 178

19.4 充分利用面向对象 180

19.5 完全面向对象 183

第20章 类太大了,我不想让它继续膨胀 186

20.1 查看职责 188

20.2 其他技术 199

20.3 继续前进 199

20.3.1 策略 199

20.3.2 战术 200

20.4 提取类之后 201

第21章 在各个地方修改的都是同样的代码 202

第22章 我需要修改一个巨兽方法,但无法为其编写测试 218

22.1 巨兽的种类 218

22.1.1 无序方法 218

22.1.2 缠结的方法 219

22.2 使用自动重构支持来对付巨兽 221

22.3 手动重构挑战 224

22.3.1 引入检测变量 224

22.3.2 提取你所知道的内容 227

22.3.3 收集依赖 228

22.3.4 打破方法对象 229

22.4 策略 229

22.4.1 记下方法的概要 230

22.4.2 找到序列 230

22.4.3 首先提取到当前类 231

22.4.4 提取小段代码 231

22.4.5 准备好重做提取 231

第23章 如何知道没有造成任何破坏 232

23.1 超感编辑(Hyperaware Editing) 232

23.2 单一目标编辑 233

23.3 保留签名 234

23.4 依赖于编译器 236

23.5 结对编程 238

第24章 我要崩溃了,它不会再有任何改进 239

第三部分 打破依赖的技术 242

第25章 打破依赖的技术 242

25.1 调整参数 242

25.2 分解方法对象 245

25.3 完善定义 251

25.4 封装全局引用 252

25.5 暴露静态方法 257

25.6 提取并重写调用 259

25.7 提取并重写工厂方法 261

25.8 提取并重写getter方法 262

25.9 提取实现器 265

25.10 提取接口 269

25.11 引入实例委托器 274

25.12 引入静态设置器 275

25.13 链接替换 280

25.14 参数化构造函数 280

25.15 参数化方法 284

25.16 原始化参数(Primitivize Parameter) 285

25.17 上推特性 287

25.18 下推依赖 290

25.19 使用函数指针替换函数 293

25.20 使用getter方法替换全局引用 295

25.21 创建子类并重写方法 297

25.22 替代实例变量 299

25.23 模板重定义 302

25.24 文本重定义 305

附录 重构 307

术语表 311