以下取自重构改善代码的既有设计
- 重新组织函数
- Extract Method 提炼函数
将需要修改的代码放到一个独立函数中,并让函数名解释该函数的用法。
- Inline Method内联函数
在函数调用点插入函数本体,然后移除该函数。
- Inline Temp 内联临时变量
将所有对该变量的引用动作,替换为对它赋值的那个表达式自身。
- Replace Temp with Query 以查询取代临时变量
将表达式提炼到一个独立函数中。将这个临时变量的所有引用点替换为对新函数的调用。此后,新函数就可以被其他函数使用。
- Introduce Explaining Variable 引入解释性变量
将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量的名称来解释表达式的用途。
- Split Temporary Variable分解临时变量
针对每次赋值,创造一个独立、对应的临时变量。
- Remove Assignments to Parameters移除对参数的赋值
以一个临时变量取代该参数的位置
- 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以类取代枚举
以一个新的class替换该枚举类型
- Replace Type COde with Subclasses以子类取代枚举
以一个子类取代这个枚举变量
- Replace Type Code with State/Strategy
- Replace Subclass with Fields以值域取代子类
如果你的各个subclasses的唯一差别只在返回常量数据的函数身上,修改这些函数,使它返回superclass中的某个新增值域,然后销毁subclasses
- 简化条件表达式
- Decompose Conditional分解条件式
从if 、else 的段落中分别提炼出独立函数
- Consolidate Conditional Expression合并表达式
合并可以合并的条件式,并将这个条件式提炼成为一个独立函数。
- Consolidate Duplicate Conditional Fragments 合并重复的条件片段
将重复的代码搬移到条件式之外。
- Remove Control Flag 移除控制标记
以break语句或者return语句取代控制标记。
- Replace Nested Conditional with Guard Clauses以卫语句取代嵌套条件式
使用卫语句表现所有的特殊情况。
- Replace Conditional with Polymorphism以多态取代表达式
如果有一个条件式,会根据对象类型的不同而选择不同的行为,将这个表达式每个分支放进一个subclass内的覆写函数中,然后将原始函数声明为抽象函数。
- Introduce Null Object引入Null对象
将null value替换为null object
- Introduce Assertion引入断言
如果某一段代码需要对程序状态做出某种假设。那么请以assertion明确表现这种假设。
- 简化函数调用
- Rename Method
- Add Parameter
- Remove Parameter
- Separate Query from Modifier将查询函数和修改函数分离
- Parameterize Method令函数携带参数
- Replace Parameter with Explicit Methods 以明确函数取代参数
- Preserve Whole Object保持对象完整。
如果需要从某个对象中取出若干值,将它们作为某一次函数调用时的参数。那么应该改成传递整个对象。
- Replace Parameter with Methods 以函数取代参数
对象调用某个函数,并将所得结果作为参数,传递给另一个函数。而接受该参数的函数也可以调用前一个函数,那么让参数接受者去除该项参数,并直接调用前一个函数。
- Introduce Parameter Object引入参数对象
某些参数总是很自然的同时出现,那么以一个对象取代这些参数。
- Remove Setting Method移除设值函数
如果对象里的某些成员变量在对象初创时被设值,然后就不再改变,那么去掉该成员变量的设值函数。
- Hide Method 隐藏某个函数
- Replace Constructor with Factory Method 以工厂函数取代构造函数
如果你希望在创建对象时不仅仅是对它做简单的构建动作,那么用工厂函数取代构造函数
- Encapsulate Downcast 封装向下转型动作。
将向下转型的动作移到函数中。
- Replace Error Code with Exception以异常取代错误码
- Replace Exception with Test以测试取代异常
在调用函数之前先检查
- 处理概括关系
- Pull Up Field 值域上移
两个子类有相同的成员变量,那么将成员变量移动到父类中。
- Pull Up Method函数上移
- Pull Up Constructor Body
- Push Down Field
- Push Down Method
- Extract Subclass 提炼子类
- Extract Superclass 提炼父类
- Extract Interface提炼接口
- Collapse Hierarchy折叠继承体系
- Form Template Method 塑造模板函数
- Replace Inheritance with Delegation 以委托取代继承
- Replace Delegation with Inheritance
- 大型重构、重构、复用与现实
- Tease Apart Inheritance 梳理并分解继承体系
- Convert Procedural Design to Objects将过程化设计转化为对象设计
- Separate Domain from PRESENTATION 将领域和表述/显示分离
- Extract Hierarchy提炼继承体系