目录
第 1 章 重构-入门示例 1
1.1 示例介绍 2
1.2 对示例代码的评价 4
1.3 重构的前提:单元测试用例 5
1.4 分解statement函数 5
1.5 阶段性展示:大量函数嵌套 18
1.6 模块化拆分:计算模块与输出模块 19
1.7 阶段性展示:两阶段文件隔离 26
1.8 多态:按类型封装计算逻辑 28
1.9 阶段性展示:多态下的计算模块 34
1.10 本章小结 35
第 2 章 重构的原则 37
2.1 什么是重构 38
2.2 重构:身兼双职 39
2.3 重构的意义 39
2.4 重构的时机 41
2.5 重构的挑战 45
2.6 重构、架构和Yagni 49
2.7 重构与更广泛的软件开发过程 50
2.8 重构与性能 51
2.9 重构的起源 53
2.10 自动化重构 54
2.11 延伸阅读 56
第 3 章 代码中的“异味”(重构的信号) 57
3.1 神秘的命名 58
3.2 重复代码 59
3.3 函数过长 59
3.4 参数列表过长 60
3.5 全局数据 60
3.6 可变数据 61
3.7 发散性变化 62
3.8 霰弹式修改 62
3.9 依恋情结 63
3.10 数据泥团 63
3.11 基本类型偏执 64
3.12 重复的switch语句 64
3.13 循环 65
3.14 冗赘的元素 65
3.15 夸夸其谈通用性 65
3.16 临时字段 65
3.17 过长的调用链 66
3.18 中间人 66
3.19 内幕交易 66
3.20 大类 67
3.21 异曲同工的类 67
3.22 数据类 67
3.23 被拒绝的馈赠 68
3.24 注释 68
第 4 章 构建测试用例 69
4.1 测试用例的价值 70
4.2 待测试的示例代码 71
4.3 第一个测试 74
4.4 继续添加测试 76
4.5 修改测试数据 78
4.6 边界用例(极端用例) 78
4.7 测试远不止于此 81
第 5 章 重构手法清单 82
5.1 重构的讲解格式 83
5.2 重构手法的选择 84
第 6 章 第一组重构手法 85
6.1 提炼函数法(extract function) 86
6.2 内联函数法(inline function) 93
6.3 提炼变量法(extract variable) 95
6.4 内联变量法(inline variable) 98
6.5 修改函数声明法(change function declaration) 99
6.6 封装变量法(encapsulate variable) 105
6.7 修改变量名称法(rename variable) 109
6.8 参数对象引入法(introduce parameter object) 110
6.9 函数组合成类法(combine functions into class) 114
6.10 函数组合成转换法(combine functions into transform) 117
6.11 阶段拆分法(split phase) 121
第 7 章 封装 127
7.1 封装记录法(encapsulate record) 128
7.2 封装集合法(encapsulate collection) 134
7.3 对象替代基本类型法(replace primitive with object) 138
7.4 函数替代临时变量法(replace temp with query) 141
7.5 提炼新类法(extract class) 143
7.6 内联类法(inline class) 146
7.7 隐藏委托法(hide delegate) 148
7.8 移除中间人(remove middle man) 150
7.9 算法替换法(substitute algorithm) 151
第 8 章 迁移特性 153
8.1 函数迁移法(move function) 154
8.2 字段迁移法(move field) 161
8.3 代码迁移至函数法(move statements into function) 165
8.4 代码迁移至调用者法(move statements to callers) 168
8.5 函数调用替换内联代码法(replace inline code with function call) 172
8.6 移动语句法(slide statements) 173
8.7 拆分循环法(split loop) 176
8.8 管道替代循环法(Replace Loop with Pipeline) 179
8.9 移除无用代码(remove dead code) 183
第 9 章 组织数据 185
9.1 拆分变量法(split variable) 186
9.2 修改字段名称(rename field) 188
9.3 查询替代衍生变量法(replace nested conditional with guard clauses) 191
9.4 引用对象转为值对象(change reference to value) 193
9.5 值对象转为引用对象(change value to reference) 196
第 10 章 简化条件逻辑 199
10.1 分解条件法(decompose conditional) 200
10.2 合并条件表达式法(consolidate conditional expression) 202
10.3 卫语句替代嵌套条件表达式法(replace nested conditional with guard clauses) 204
10.4 多态替代条件表达式法(replace conditional with polymorphism) 208
10.5 引入特例法(introduce special case) 220
10.6 引入断言法(introduce assertion) 230
第 11 章 重构API 232
11.1 查询函数—更新函数分离法(separate query from modifier) 233
11.2 函数参数化(parameterize function) 236
11.3 移除标志参数法(remove flag argument) 238
11.4 保留完整对象法(preserve whole object) 242
11.5 查询替代参数法(replace parameter with query) 245
11.6 参数替代查询法(replace query with parameter) 248
11.7 移除赋值函数法(remove setting method) 251
11.8 工厂函数替代构造函数法(replace constructor with factory function) 252
11.9 命令替代函数法(replace function with command) 254
11.10 函数替代命令法(replace command with function) 259
第 12 章 处理继承体系 263
12.1 函数上移法(pull up method) 264
12.2 字段上移法(pull up field) 266
12.3 构造函数本体上移法(pull up constructor body) 267
12.4 函数下移法(push down method) 270
12.5 字段下移法(push down field) 270
12.6 子类替代类型法(replace type code with subclasses) 271
12.7 移除子类法(remove subclass) 277
12.8 提炼父类法(extract superclass) 281
12.9 折叠继承法(collapse hierarchy) 284
12.10 委托替代子类法(replace subclass with delegate) 285
12.11 委托替代父类法(replace superclass with delegate) 298
