- 重构:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构,即在代码写好之后改进它的设计
第一章 《重构,第一个案例》
- 这是一个重构的案例
第二章 《重构原则》
1.何谓重构
- 名词形式:对软件内部结构的一种调整,目的是在不改变【软件之可察行为】前提下,提高其理解性,降低其修改成本
- 动词形式:使用一系列重构准则,在不改变【软件之可察行为】前提下,调整其结构
- 重构的目的是使软件更容易被理解和修改
2.为何重构
- 改进软件设计
- 使软件更易被理解
- 助你找到bug
- 助你提高编程速度
3.何时重构
- 添加功能时一并重构
- 修补错误时一并重构
- 复审代码时一并重构
4.怎么对经理说
- 不要告诉经理
5.重构的难题
- 数据库
- 修改接口
- 难以通过重构手法完成的设计改动
6.重构与设计
7.重构与性能
- 短程来看,重构的确会使软件变慢,但它使优化阶段中的软件性能调整更容易
8.重构起源何处
第三章 《代码的坏味道》
1.重复的代码
2.过长函数
3.过大类
4.过长参数列
5.发散式变化
6.霰弹式修改
7.依恋清洁
8.数据泥团
9.基本型别偏执
10.switch语句
11.平行继承体系
12.冗赘类
13.夸夸其谈未来性
14.令人迷惑的暂时值域
15.过渡耦合的消息链
16.中间转手人
17.狎昵关系
18.异曲同工类
19.不完美的程序类库
20.纯稚的数据类
21.被拒绝的遗赠
22.过多的注释
第四章 《构筑测试体系》
1.自我测试代码的价值
- 修复bug很快,找bug很难
2.JUnit测试框架
- 测试有助于实现重构
3.添加更多测试
第五章 《重构名录》
1.重构的记录格式
- 名称、概要、动机、作法和范例
2.寻找引用点
3.这些重构准则有多成熟
- 重构的基本技巧:小步前进,频繁测试
- 设计模式为你的重构提供了目标
第六章 《重新组织你的函数》
1.Extract Method
- 提取代码,满足一个函数只做一件事的原则
- 命名主要根据“怎么做”,而不是“做什么”
2.Inline Method
- 在函数调用点插入函数本体,然后移除函数
3.Inline Temp
- 将所有对该变量的引用动作,替换为对它赋值的那个表达式本身
4.Replace Temp with Query
- 将这个表达式提炼到一个独立函数中,将这个临时变量的所有【被引用点】替换为【对新函数的调用】,新函数可被其他函数使用
5.Introduce Explaining Variable
- 将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名来解释表达式用途
- 帮助理解代码
6.Split Temporary Variable
- 针对每次赋值,创造一个独立的、对应的临时变量
7.Remove Aassignments Parameters
- 以一个临时变量取代该变量的位置
8.Replace Method with Object
- 将这个函数放进一个单独对象中,如此依赖局部变量就成了对象内的值域,然后你可以在同一个对象中将这个大型函数分解为数个小型函数了
9.Substitute Algorithm
- 将函数本体替换为另一个算法
第七章 《在对象之间搬移特效》
1.Move Method
- 你的程序中,有个函数与其所驻class之外的另一个class进行更多交流:调用后者,或者被后者调用
2.Move Field
- 在target class 建立一个new field,修改source field 的所有用户,令他们改用new field
3.Extract Class
- 建立一个新class,将相关的值域和函数从旧class搬移到新class
4.Inline Class
- 将class所有特性搬移到另一个class中,然后移除原class
5.Hide Delegate
- 在sever端建立客户所需的所有函数,用以隐藏委托关系
6.Remove Middle Man
- 让客户直接调用delegate
7.Introduce Foreign Method
- 在client class中建立一个函数,并以一个server class实体作为第一引数
8.Introduce Local Extension
- 建立一个新class,使它包含这些额外函数,让这个扩展品成为source class的subclass或wrapper
第八章 《重新组织数据》
1.Self Encapsulate Field
- 为这个值域建立取值/设值函数,并且只以这些函数来访问值域
2.Replace Data Value with Object
- 将这笔数据项变成一个对象
3.Change Value to Reference
- 将这个value object变成一个reference object
4.Change Reference to Value
- 将它变成一个value object
5.Replace Array with Object
- 以对象替代数组,对于数组中的每个元素,以一个值域表示之。
6.Duplicate Observed Data
- 将该笔数据拷贝到一个domain object中,建立一个Observer模式,用以对domain object和GUI object内的重复数据进行同步控制
7.Change Unidirectional Association to Bidirectional
- 添加一个反向指针,并使修改函数能够同时更新两条连接
8.Change Bidirectional Association to Unidirectional
- 去除不必要的关联
9.Replace Magic Number with Symbolic Constant
- 创造一个常量,根据其意义为它命名,并将上述的字面数值替换为这个常量
10.Encapsulate Field
- 将它声明为private,并提供相应的访问函数
11.Encapsulate Collection
- 让这个函数返回该群集的一个只读映件,并在这个class中提供【添加/移除】群集元素的操作
12.Replace Record with Data Class
- 为该record创建一个【哑】数据对象
13.Replace Type Code with Class
- 以一个新的class替换该数值型别码
14.Replace Type Code with Subclasses
- 以一个subclass取代这个type class
15.Replace Type Code with State/Strategy
- 以state object取代type code
16.Replace Subclass with Fields
- 修改这些函数,使它们返回superclass中的某个值域,然后销毁subclasser
第九章 《简化条件表达式》
1.Decompose Conditional
- 从if、then、else三个段落中分别提炼出独立函数
2.Consolidate COnditional Expression
- 将这些测试合并为一个表达式,并将这个条件式提炼成为一个独立函数
3.Consolidate Duplicate Conditional Fragements
- 将这段重复代码搬移到条件式之外
4.Remove Control Flag
- 以break语句或return语句取代控制标记
5.Replace Nested Conditional with Guard
- 使用卫语句表现所有特殊情况
6.Replace Conditional with Polymorpyism
- 将这个条件式的每个分支放进一个subclass内的覆写函数中,然后将原始函数声明为抽象函数
7.Introduce Null Object
- 将null value 替换为null object
8.Introduce Assertion
- 以assertion明确表现这种假设
第十章 《简化函数调用》
1.Rename Method
- 修改函数名称
2.Add Parameter
- 为此函数添加一个对象参数,让该对象带进函数所需信息
3.Remove Parameter
- 将该参数去除
4.Separate Query from Modifier
- 建立两个不同的函数,其中一个负责查询,另一个负责修改
5.Parameterize Method
- 建立单一函数,以参数表达那么不同的值
6.Replace Parameter with Explict Methods
- 针对该参数的每一个可能值,建立一个独立函数
7.Preserve Whole Object
- 改使用整个对象
8.Replace Parameter with Methods
- 让参数接受者去除该项参数,并直接调用前一个函数
9.Introduce Parameter Object
- 以一个对象取代这些参数
10.Remove Setting Method
- 去掉该值域所有设值函数
11.Hide Method
- 将这个函数修改为private
12.Replace Consatructor with Factory Method
- 将构造函数替换为工厂函数
13.Encapsulate Downcast
- 将向下转型动作移到函数中
14.Replace Error Code with Exception
- 改用异常
15.Replace Exception with Test
- 修改调用者。使它在调用函数之前先做检查
第十一章 《处理概括关系》
1.Pull up Field
- 将此一值域移至superclass
2.Pull up Method
- 将此函数移至superclass
3.Pull up Constructor Body
- 在superclass中新建一个构造函数,并在subclass构造函数中调用它
4.Pull Down Method
- 将这个函数移到相关的那些subclasses去
5.Push Down Field
- 将这个值域移到需要它的那些subclasses去
6.Extract Subclass
- 新建一个subclass,将上面所说的那一部分特效移到subclass中
7.Extract Superclass
- 为这两个classes建立一个superclass,将相同特性移至superclass
8.Extract Interface
- 将相同的子集提炼到一个独立接口中
9.Collapse Hierarchy
- 将它们合为一体
10.Form Template Method
- 将各个措施分别放进独立函数中,并保持它们都有相同的签名式,于是原函数也变得相同了,然后将原函数上移至superclass
11.Replace Inheritance with Delegation
- 在subclass中新建一个值域用以博村superclass,调整subclass函数,令它改而委托superclass,然后去掉两者的继承关系
12.Replace Delegation with Inheritance
- 让【请托】继承【受托】