跳转到内容

附录 B 61 个手法速查表

按第 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 章