读书笔记:《重构 改善既有代码的设计》

读书笔记:《重构 改善既有代码的设计》

第1章 重构,第一个案例

第2章 重构原则

2.3 何时重构

三次法则:添加功能时重构、修补错误时重构、复审代码时重构

第3章 代码的坏味道

3.1 Duplicated Code(重复代码)

3.2 Long Method(过长函数)

3.3 Large Class (过大的类)

3.4 Long Parameter List (过长参数列)

3.5 Divergent Change (发散式变化)

一个类受多种变化的影响

3.6 Shotgun Surgery (霰弹式修改)

一种变化引发多个类相应修改

3.7 Feature Envy (依恋情结)

函数对某个类的兴趣高过对自己所处类的兴趣

3.8 Data Clumps (数据泥团)

两个类相同的字段、许多函数签名中相同的参数

3.9 Primitive Obession (基本类型偏执)

3.10 Switch Statements (switch 惊悚现身)

3.11 Paralle Inheritance Hierarchies (平行继承体系)

每当为一个类添加一个子类,必须也为另一个类相应添加一个子类

3.12 Lazy Class (冗赘类)

3.13 Speculative Generality (夸夸其谈未来性)

3.14 Temporary Field (令人迷惑的暂时字段)

3.15 Message Chains (过度耦合的消息链)

3.16 Middle Man (中间人)

3.17 Inappropriate (狎昵关系)

两个类过分关注彼此private成分

3.18 Alternative Classes with Different Interfaces (异曲同工的类)

3.19 Incomplete Library Class (不完美的库类)

3.20 Data Class (纯粹的数据类)

3.21 Refused Bequest (被拒绝的馈赠)

子类不需要继承超类的函数和数据

3.22 Comments (过多的注释)

第4章 构建测试体系

第5章 重构列表

第6章 重新组织函数

6.1 Extract Method (提炼函数)

你有一段代码可以被组织在一起并独立出来。

将这段代码放进一个独立函数中,并让函数名称解释该函数的用途。

6.2 Inline Method (内联函数)

一个函数的本体与名称同样清楚易懂。

在函数调用点插入函数本体, 然后移除该函数。

6.3 Inline Temp (内联临时变量)

你有一个临时变量,只被一个简单表达式赋值一次,而它妨碍了其他重构手法。

将所有对该变量的引用动作, 替换为对它賦值的那个表达式自身。

6.4 Replace Temp with Quert (以查询取代临时变量)

局部变量会使代码难以提炼。

将这个表达式提炼到一个独立函数中。将这个临时变量的所有引用点替换为对新函数的调用。此后,新函数就可被其他函数使用。

6.5 Introduce Explaining Variable (引入解释性变量)

你有一个复杂的表达式。

将这个表达式提炼到一个独立函数中。将这个临时变量的所有引用点替换为对新函数的调用。此后,新函数就可被其他函数使用。

6.6 Split Temporary Variable (分解临时变量)

你的程序有某个临时变量被赋值超过一次, 它既不是循环变量,也不被用于收集计算结果。

针对每次賦值,创造一个独立、对应的临时变置。

6.7 Remove Assignments to Parameters (移除对参数的赋值)

代码对一个参数进行赋值。

以一个临时变量取代该参数的位置。

6.8 Replace Method with Method Object (以函数对象取代函数)

你有一个大型函数,其中对局部变量的使用使你无法采用Extract Method(6.1)

将这个函数放进一个单独对象中,如此一来局部变置就成了对象内的字段。然后你可以在同一个对象中将这个大型函数分解为多个小型函数。

6.9 Substitude Algorithm (替换算法)

你想要把某个算法替换为另一个更清晰的算法。

将函数本体替换为另一个算法。

第7章 在对象之间搬移特性

7.1 Move Method (搬移函数)

你的程序中,有个函数与其所驻类之外的另一个类进行更多交流,调用后者,或被后者调用。

在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或是将旧函数完全移除。

7.2 Move Field ( 搬移字段 )

你的程序中,某个字段被其所驻类之外的另一个类更多地用到。

在目标类新建一个字段,修改源字段的所有用户,令它们改用新字段。

7.3 Extract Class (提炼类)

某个类做了应该由两个类做的事。

建立一个新类,将相关的字段和函数从旧类搬移到新类。

7.4 Inline Class (将类内联化)

某个类没有做太多事情。

将这个类的所有特性搬移到另一个类中,然后移除原类。

7.5 Hide Delegate (隐藏“委托关系”)

客户通过一个委托类来调用另一个对象。

在服务类上建立客户所需的所有函数,用以隐藏委托关系。

7.6 Remove Middle Man (移除中间人)

某个类做了过多的简单委托动作。

让客户直接调用受托类。

7.7 Introduce Foreign Method (引入外加函数)

你需要为提供服务的类增加一个函数,但你无法修改这个类。

在客户类中建立一个函数,并以第一参数形式传入一个服务类实例。

7.8 Introduce Local Extension (引入本地扩展)

你需要为服务类提供一些额外函数,但你无法修改这个类。

建立一个新类,使它包含这些额外函数。让这个扩展品成为源类的子类或包装类。