按第 1 章的七个分类排列。每个手法给出中文名、英文名、一句话和所在章,方便按名字查找;流行度和典型场合见第 1 章的总表,坏味道到手法的对应见附录 A。
| 中文名 |
英文名 |
一句话 |
章 |
| 提炼函数 |
Extract Function |
把一段代码提成有名字的函数 |
第 4 章 |
| 内联函数 |
Inline Function |
把函数体放回调用处 |
第 4 章 |
| 提炼变量 |
Extract Variable |
给表达式的一部分起名字 |
第 5 章 |
| 内联变量 |
Inline Variable |
用表达式替掉变量 |
第 5 章 |
| 改变函数声明 |
Change Function Declaration |
改函数名或参数 |
第 6 章 |
| 变量改名 |
Rename Variable |
给变量一个说明用途的名字 |
第 7 章 |
| 封装变量 |
Encapsulate Variable |
用函数包住对变量的读写 |
第 8 章 |
| 引入参数对象 |
Introduce Parameter Object |
把总是一起出现的参数合成一个对象 |
第 9 章 |
| 函数组合成类 |
Combine Functions into Class |
把操作同一数据的函数收进一个类 |
第 10 章 |
| 函数组合成变换 |
Combine Functions into Transform |
用一个变换函数把派生数据一次算好 |
第 10 章 |
| 拆分阶段 |
Split Phase |
把一段做两件事的代码拆成两个阶段 |
第 11 章 |
| 中文名 |
英文名 |
一句话 |
章 |
| 封装记录 |
Encapsulate Record |
把字典或对象字面量换成类 |
第 13 章 |
| 封装集合 |
Encapsulate Collection |
不直接暴露集合,提供增删方法 |
第 14 章 |
| 以对象取代基本类型 |
Replace Primitive with Object |
把字符串、数字换成有行为的类 |
第 15 章 |
| 以查询取代临时变量 |
Replace Temp with Query |
把临时变量换成函数 |
第 16 章 |
| 提炼类 |
Extract Class |
把一个类里的一组数据和方法拆出去 |
第 17 章 |
| 内联类 |
Inline Class |
把一个类并回使用它的类 |
第 17 章 |
| 隐藏委托关系 |
Hide Delegate |
在对象上加方法,不让调用方穿透到内部对象 |
第 18 章 |
| 移除中间人 |
Remove Middle Man |
删掉只转发的方法,让调用方直接访问 |
第 18 章 |
| 替换算法 |
Substitute Algorithm |
整个换成更清楚的算法 |
第 19 章 |
| 中文名 |
英文名 |
一句话 |
章 |
| 搬移函数 |
Move Function |
把函数搬到更合适的类或模块 |
第 21 章 |
| 搬移字段 |
Move Field |
把字段搬到更合适的类 |
第 22 章 |
| 搬移语句到函数 |
Move Statements into Function |
把每次调用前后都做的事搬进函数 |
第 23 章 |
| 搬移语句到调用者 |
Move Statements to Callers |
把函数里只有部分调用方需要的事搬出去 |
第 23 章 |
| 以函数调用取代内联代码 |
Replace Inline Code with Function Call |
用已有函数替掉手写的同样逻辑 |
第 24 章 |
| 移动语句 |
Slide Statements |
把相关的语句挪到一起 |
第 25 章 |
| 拆分循环 |
Split Loop |
一个循环只做一件事 |
第 26 章 |
| 以管道取代循环 |
Replace Loop with Pipeline |
用 map、filter 这类操作替掉循环 |
第 27 章 |
| 移除死代码 |
Remove Dead Code |
删掉不再用的代码 |
第 28 章 |
| 中文名 |
英文名 |
一句话 |
章 |
| 拆分变量 |
Split Variable |
一个变量只做一件事 |
第 30 章 |
| 字段改名 |
Rename Field |
给字段一个准确的名字 |
第 31 章 |
| 以查询取代派生变量 |
Replace Derived Variable with Query |
能算出来的值不要存 |
第 32 章 |
| 将引用对象改为值对象 |
Change Reference to Value |
让对象不可变,比较按内容 |
第 33 章 |
| 将值对象改为引用对象 |
Change Value to Reference |
同一个实体只有一个对象 |
第 33 章 |
| 中文名 |
英文名 |
一句话 |
章 |
| 分解条件表达式 |
Decompose Conditional |
把条件和分支各提成函数 |
第 35 章 |
| 合并条件表达式 |
Consolidate Conditional Expression |
把结果相同的几个条件合成一个 |
第 36 章 |
| 以卫语句取代嵌套条件表达式 |
Replace Nested Conditional with Guard Clauses |
特殊情况先返回 |
第 37 章 |
| 以多态取代条件表达式 |
Replace Conditional with Polymorphism |
按类型分支改成子类各自实现 |
第 38 章 |
| 引入特例 |
Introduce Special Case |
用一个特例对象替掉到处检查 null |
第 39 章 |
| 引入断言 |
Introduce Assertion |
把假设写成断言 |
第 40 章 |
| 中文名 |
英文名 |
一句话 |
章 |
| 将查询函数和修改函数分离 |
Separate Query from Modifier |
返回值的函数不改状态 |
第 42 章 |
| 函数参数化 |
Parameterize Function |
几个只差一个值的函数合成一个 |
第 43 章 |
| 移除标记参数 |
Remove Flag Argument |
用两个函数替掉布尔参数 |
第 44 章 |
| 保持对象完整 |
Preserve Whole Object |
传整个对象而不是它的几个字段 |
第 45 章 |
| 以查询取代参数 |
Replace Parameter with Query |
函数自己能算的值不要传 |
第 46 章 |
| 以参数取代查询 |
Replace Query with Parameter |
让函数不依赖外部状态 |
第 46 章 |
| 移除设值函数 |
Remove Setting Method |
不该改的字段不提供修改方法 |
第 47 章 |
| 以工厂函数取代构造函数 |
Replace Constructor with Factory Function |
用有名字的函数创建对象 |
第 48 章 |
| 以命令取代函数 |
Replace Function with Command |
把函数变成一个对象 |
第 49 章 |
| 以函数取代命令 |
Replace Command with Function |
把只有一个方法的对象变回函数 |
第 49 章 |
| 中文名 |
英文名 |
一句话 |
章 |
| 函数上移 |
Pull Up Method |
把子类里相同的方法搬到父类 |
第 51 章 |
| 字段上移 |
Pull Up Field |
把子类里相同的字段搬到父类 |
第 51 章 |
| 构造函数本体上移 |
Pull Up Constructor Body |
把子类构造函数里相同的部分搬到父类 |
第 51 章 |
| 函数下移 |
Push Down Method |
把只有一个子类用的方法搬下去 |
第 51 章 |
| 字段下移 |
Push Down Field |
把只有一个子类用的字段搬下去 |
第 51 章 |
| 以子类取代类型码 |
Replace Type Code with Subclasses |
用子类替掉类型字段 |
第 52 章 |
| 移除子类 |
Remove Subclass |
把没什么用的子类换回类型字段 |
第 53 章 |
| 提炼超类 |
Extract Superclass |
把两个类的共同部分提成父类 |
第 54 章 |
| 折叠继承体系 |
Collapse Hierarchy |
把父类和子类合并 |
第 55 章 |
| 以委托取代超类 |
Replace Superclass with Delegate |
继承改成持有 |
第 56 章 |
| 以委托取代子类 |
Replace Subclass with Delegate |
子类改成委托对象 |
第 56 章 |
英文名按字母排序,方便从英文资料(Fowler 原书、refactoring.com)对照过来。
| 英文名 |
中文名 |
章 |
| Change Function Declaration |
改变函数声明 |
第 6 章 |
| Change Reference to Value |
将引用对象改为值对象 |
第 33 章 |
| Change Value to Reference |
将值对象改为引用对象 |
第 33 章 |
| Collapse Hierarchy |
折叠继承体系 |
第 55 章 |
| Combine Functions into Class |
函数组合成类 |
第 10 章 |
| Combine Functions into Transform |
函数组合成变换 |
第 10 章 |
| Consolidate Conditional Expression |
合并条件表达式 |
第 36 章 |
| Decompose Conditional |
分解条件表达式 |
第 35 章 |
| Encapsulate Collection |
封装集合 |
第 14 章 |
| Encapsulate Record |
封装记录 |
第 13 章 |
| Encapsulate Variable |
封装变量 |
第 8 章 |
| Extract Class |
提炼类 |
第 17 章 |
| Extract Function |
提炼函数 |
第 4 章 |
| Extract Superclass |
提炼超类 |
第 54 章 |
| Extract Variable |
提炼变量 |
第 5 章 |
| Hide Delegate |
隐藏委托关系 |
第 18 章 |
| Inline Class |
内联类 |
第 17 章 |
| Inline Function |
内联函数 |
第 4 章 |
| Inline Variable |
内联变量 |
第 5 章 |
| Introduce Assertion |
引入断言 |
第 40 章 |
| Introduce Parameter Object |
引入参数对象 |
第 9 章 |
| Introduce Special Case |
引入特例 |
第 39 章 |
| Move Field |
搬移字段 |
第 22 章 |
| Move Function |
搬移函数 |
第 21 章 |
| Move Statements into Function |
搬移语句到函数 |
第 23 章 |
| Move Statements to Callers |
搬移语句到调用者 |
第 23 章 |
| Parameterize Function |
函数参数化 |
第 43 章 |
| Preserve Whole Object |
保持对象完整 |
第 45 章 |
| Pull Up Constructor Body |
构造函数本体上移 |
第 51 章 |
| Pull Up Field |
字段上移 |
第 51 章 |
| Pull Up Method |
函数上移 |
第 51 章 |
| Push Down Field |
字段下移 |
第 51 章 |
| Push Down Method |
函数下移 |
第 51 章 |
| Remove Dead Code |
移除死代码 |
第 28 章 |
| Remove Flag Argument |
移除标记参数 |
第 44 章 |
| Remove Middle Man |
移除中间人 |
第 18 章 |
| Remove Setting Method |
移除设值函数 |
第 47 章 |
| Remove Subclass |
移除子类 |
第 53 章 |
| Rename Field |
字段改名 |
第 31 章 |
| Rename Variable |
变量改名 |
第 7 章 |
| Replace Command with Function |
以函数取代命令 |
第 49 章 |
| Replace Conditional with Polymorphism |
以多态取代条件表达式 |
第 38 章 |
| Replace Constructor with Factory Function |
以工厂函数取代构造函数 |
第 48 章 |
| Replace Derived Variable with Query |
以查询取代派生变量 |
第 32 章 |
| Replace Function with Command |
以命令取代函数 |
第 49 章 |
| Replace Inline Code with Function Call |
以函数调用取代内联代码 |
第 24 章 |
| Replace Loop with Pipeline |
以管道取代循环 |
第 27 章 |
| Replace Nested Conditional with Guard Clauses |
以卫语句取代嵌套条件表达式 |
第 37 章 |
| Replace Parameter with Query |
以查询取代参数 |
第 46 章 |
| Replace Primitive with Object |
以对象取代基本类型 |
第 15 章 |
| Replace Query with Parameter |
以参数取代查询 |
第 46 章 |
| Replace Subclass with Delegate |
以委托取代子类 |
第 56 章 |
| Replace Superclass with Delegate |
以委托取代超类 |
第 56 章 |
| Replace Temp with Query |
以查询取代临时变量 |
第 16 章 |
| Replace Type Code with Subclasses |
以子类取代类型码 |
第 52 章 |
| Separate Query from Modifier |
将查询函数和修改函数分离 |
第 42 章 |
| Slide Statements |
移动语句 |
第 25 章 |
| Split Loop |
拆分循环 |
第 26 章 |
| Split Phase |
拆分阶段 |
第 11 章 |
| Split Variable |
拆分变量 |
第 30 章 |
| Substitute Algorithm |
替换算法 |
第 19 章 |