首页 > 代码库 > 重构-----改善既有代码的设计
重构-----改善既有代码的设计
1重构原则
1.1 定义:
1).调整软件内部结构,目的是在不改变软件软件可查行为前提下,提高其可理解性,降低其修改成本。
2).使用一系列重构准则,在不改变软件可查行为前提下,调整其结构
1).调整软件内部结构,目的是在不改变软件软件可查行为前提下,提高其可理解性,降低其修改成本。
2).使用一系列重构准则,在不改变软件可查行为前提下,调整其结构
1.2 何时重构
1).三次法则
2).添加功能时
3).修补错误时
4).复审代码时
1).三次法则
2).添加功能时
3).修补错误时
4).复审代码时
1.3 何时不该重构
1).代码太乱,重构效率低于重写效率时
2).项目接近期限时停止重构
1).代码太乱,重构效率低于重写效率时
2).项目接近期限时停止重构
2.代码的坏味道
2.1 Duplicated Code
2.2 Long Method
2.3 Large Class
2.4 Long Parameter List
2.5 Divergent Change
既因为某些原因,需要不断的重复修改已有函数
既因为某些原因,需要不断的重复修改已有函数
2.6 Shotgun Surgery
既因一种变化,需要很多小的修改,且难以找到,将他们整合到一个类中
既因一种变化,需要很多小的修改,且难以找到,将他们整合到一个类中
2.7 Feature Envy
既函数需要调用其它类中的取值函数多于本类中的函数时,将该函数移至该去的地方。
既函数需要调用其它类中的取值函数多于本类中的函数时,将该函数移至该去的地方。
2.8 Data Clumps
既多个地方看到相同的三四笔数据项,在两个类内的值域相同,将这些数据提取到新的对象中
既多个地方看到相同的三四笔数据项,在两个类内的值域相同,将这些数据提取到新的对象中
2.9 Primitive Obsession
2.10 Switch Statements
既少用switch和case语句,用多态去替代
既少用switch和case语句,用多态去替代
2.11 Parallel Inheritance Hierarchies
既每当为一个类增加一个子类时,必须也为另一个类增加相应的子类,让一个继承体系的实体(参考,引用,refer to)另一个体系的实体。
2.12 Lazy Class
既对于没有体现其价值的类来说,可用innerClass替代
既每当为一个类增加一个子类时,必须也为另一个类增加相应的子类,让一个继承体系的实体(参考,引用,refer to)另一个体系的实体。
2.12 Lazy Class
既对于没有体现其价值的类来说,可用innerClass替代
2.13 Speculative Generality
2.14 Temporary Field
如果class中有一个复杂算法,需要好几个变量,应该把与算法有关的提取到独立的class中。
如果class中有一个复杂算法,需要好几个变量,应该把与算法有关的提取到独立的class中。
2.15 Message Chains
既对象之间互相依赖索求
既对象之间互相依赖索求
2.16 Middle Man
2.17 Inappropriate Intimacy
既如果两个classes过于亲密,花费太多时间去探究彼此的private成份,请拆分他们,降低耦合度。
既如果两个classes过于亲密,花费太多时间去探究彼此的private成份,请拆分他们,降低耦合度。
2.18 Alternative Classes with Different Interfaces
既两个函数做同一件事,却有着不同的签名,重命名并协调他们到一致为止。
既两个函数做同一件事,却有着不同的签名,重命名并协调他们到一致为止。
2.19 Incomplete Library Class
2.20 Data Class
1)移除该移除的set方法
2)将get和set方法尽量搬到该类来
1)移除该移除的set方法
2)将get和set方法尽量搬到该类来
2.21 Refused Bequest
既subclass复用了superclass的行为实现,却又不愿意支持superclass的接口
既subclass复用了superclass的行为实现,却又不愿意支持superclass的接口
2.22 Comments
既过多的注释
既过多的注释
3.构筑测试体系
4.重构名录
4.1 重构的记录格式
Name
Summer
Motivation
Mechanics
Example
Name
Summer
Motivation
Mechanics
Example
4.2 寻找引用点
5.重新组织你的函数
5.1 Extract Method
大函数小化,精准函数名称和函数本体之间的语义距离。
大函数小化,精准函数名称和函数本体之间的语义距离。
5.2 Inline Method
在函数调用点插入函数本体,然后移除该函数
在函数调用点插入函数本体,然后移除该函数
5.3 Inline Temp
5.4 Replace Temp with Query
提炼表达式为新函数,将所有引用点替换为对新的函数的调用,
提炼表达式为新函数,将所有引用点替换为对新的函数的调用,
5.5 Intruduce Explaining Variable
将复杂函数表达式放到临时变量中,以此表达式名称来解释表达式的用途。
将复杂函数表达式放到临时变量中,以此表达式名称来解释表达式的用途。
5.6 Split Temporay Variable
针对每次赋值,创造一个独立的、对应的临时变量。
针对每次赋值,创造一个独立的、对应的临时变量。
5.7 Remove Assignments to Parameters
以一个临时变量,取代参数的位置。
以一个临时变量,取代参数的位置。
5.8 Replace Method with Method Object
将大型函数放入一个单独的对象,如此一来局部变量就成了对象的值域。然后你可以在同一个对象中将这个大型函数分解为数个小型函数。
将大型函数放入一个单独的对象,如此一来局部变量就成了对象的值域。然后你可以在同一个对象中将这个大型函数分解为数个小型函数。
5.9 Substitute Algorithm
将函数本体替换为另一个算法
将函数本体替换为另一个算法
6.在对象之间搬移特性
6.1 Move Method
你的程序中,有个函数与其所驻class之外的另一个class进行更多交流:调用后者或被后者调用。
你的程序中,有个函数与其所驻class之外的另一个class进行更多交流:调用后者或被后者调用。
6.2 Move Field
6.3 Extract Class
6.4 Inline Class
6.5 Hide Delegate
在server端(某个class)建立客户所需的所有函数,用以隐藏委托关系。
在server端(某个class)建立客户所需的所有函数,用以隐藏委托关系。
6.6 Remove Middle Man
6.7 Introduce Foreign Method
6.8 Introduce Local Extension
7.重新组织数据
7.1 Self Encapsulate Field
7.2 Replace Data Value with Object
7.3 Change Value to Referrence
7.4 Change Referrence to Value
7.5 Replace Array with Object
7.6 Duplicate Observed Data
7.7 Change Unidirectional Association to Bidirectional
7.8 Change Bidirectional to Unidirectional Association
7.9 Replace Magic Number with Symbolic Constant
7.10 Encapsulate Field
7.11 Encapsulate Collection
7.12 Replace Record with Data Class
7.13 Replace Type Code with Class
7.14 Replace Type Code with Subclasses
7.15 Replace Type Code with State/Stratgy
7.16 Replace Subclass with Field
8.简化条件表达式
8.1 Docompose Conditional
从if、then 、else 三个段落中分别提取独立的表达式
8.2 Consolidate Conditional Expression
8.3 Consolidate Duplicate Conditional Fragments
8.4 Remove ControlFlag
8.5 Replace Nested Conditional with Guard
8.6 Introduce Null Object
将null value 替换为 null object
8.7 Introduce Assertion
9.简化函数调用
9.1 Rename Method
9.2 Add Parameter
9.3 Remove Paremeter
9.4 Separate Query from Modifier
9.5 Param enterize Method
9.6 Replace Parameter with Explicit Methods
9.7 Preserve Whole Object
9.8 Replace Parameter with Methods
9.9 Introduce Parameter Object
9.10 Remove Setting Methods
9.11 Hide Method
9.12 Replace Constructor with Factory Method
9.13 Encapsulate Downcast
9.14 Repalce Error Code with Exception
9.15 Replace Exception with Test
10.处理概括关系
10.1 Pull Up Field
10.2 Pull Up Method
10.3 Pull Up Constractor Body
10.4 Push Down Method
10.5 Push Down Field
10.6 Extract Subclass
10.7 Extract SuperClass
10.8 Extract Interface
10.9 Collapse Hierarchy
10.10 From Template Method
10.11 Replace Inheritance with Delegation
10.12 Replace Delegation with Inheritance
11.大型重构
12.重构,复用与实现
14.重构工具
15.集成
上午1:29:57
重构-----改善既有代码的设计