重构手法

一、重新组织函数


Extract Method (提炼函数)

  • 过长函数,或需要注释才能让人理解用途的代码
  • 将这段代码放进一个独立函数中,并让函数名称解释该函数的用途。
  • 局部变量的处理

Inline Method (内联函数)

  • 函数内部代码和函数名称清晰易读,许多不合理的函数,函数之间委托
  • 在函数调用点插入函数本体,然后移除该函数

Inline Temp (内联临时变量)

  • 将所有对变量的引用动作,替换为对它赋值的那个表达式自身
  • 临时变量被赋予某个函数调用的返回值,妨碍了其他的重构手法

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

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

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

  • 将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解释表达式用途
  • 在提取函数花费较大工作量时

分解临时变量

  • 针对每次赋值,创造一个独立、对应的临时变量
  • 临时变量承担多个责任

Remove Assignment to Parameters (移除对函数的赋值)

  • 以一个临时变量取代该参数的位置
  • Java按值传递

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

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

Substitute Algorithm (替换算法)

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

二、在对象之间搬移特性


Move Method(搬移函数)

  • 在该函数最常引用的类中建立了一个有着类似行为的新函数。将就函数编程一个单纯的委托函数,或将就函数完全移除。

Move Field (搬移字段)

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

Extract Class (提炼类)

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

Inline Class(将类内联化)

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

Hide Delegate (隐藏委托关系)

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

Remove Middle Man (移除中间人)

  • 让客户直接调用委托类

Introduce Foreign Method (引入外加函数)

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

Introduce Local Extension (引入本地扩展)

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

## 三、重新组织函数

Self Encapsulate Field (自封装字段)

  • 为这个字段建立取值/设置函数,并且只以这些函数来访问字段

Replace Data Value with Object(以对象取代数据值)

  • 将数据项变成对象

Change Value to Reference (将值对象改为引用对象)

  • 将这个值对象编程引用对象

Change Reference to Value (将引用对象改为值对象)

  • 将它变成一个值对象

Replace Array with Object(以对象取代数组)

  • 以对象取代数组。对数组中的每个元素,以一个字段来表示

Duplicate Observed Data(赋值被监视数据)

  • 该数据复制到一个领域对象中。建立一个Observer模式,用以同步领域对象和GUI对象内的重复数据

Change Unidirectional Association to Bidirectional(将单向关联改为双向关联)

  • 添加一个反向指针,并使修改函数能够同时更新两条连接

Change Bidirectional Association to Unidirectional(将双向关联改为单向关联)

  • 去除不必要的关联

Replace Magic Number with Symbolic Constant(以字面常量取代魔法数)

  • 创造一个常量,根据其意义为它命名,并将上述的字面数值替换为这个常量

Encapsulate Field(封装字段)

  • 将它声明为private,并提供相应的访问函数

Encapsulate Collection(封装集合)

  • 让这个函数返回该集合的一个只读副本,并在这个类中提供添加/移除集合元素的函数

Replace Record with Data Class(以数据类取代记录)

  • 为该记录创建一个哑数据的对象

Replace Type Code with Class(以类取代类型码)

  • 以一个新的类替换该数值类型码

Replace Type Code with State/Strategy(以State/Strategy取代类型码)

  • 以状态对象取代状态吗

Replace Subclass with Fields(以字段取代子类)

  • 修改这些函数,使他们返回超类中的某个(新增)字段,然后销毁子类