重构--在不改变软件外部行为的前提下,对其内部结构进行改变,使之更容易理解并便于修改
原因:
1、代码重复
2、冗长的子程序
3、循环过长或嵌套过深
4、内聚性太差的类
5、类的接口未能提供层次一致的抽象
6、拥有太多参数的参数列表
7、类的内部修改往往最局限于某部分
8、变化导致对多个类的相同修改
9、对继承体系的同样修改
10、case语句需要做相同的修改
11、同时使用的相关数据并未以类的方式进行组织
12、成员函数使用其它类的特征比使用自身类的特征还要多
13、过多使用基本数据类型
14、某个类无所事事
15、一系列传递流浪数据的子程序
16、中间人对象无事可做
17、某个类同其它类关系过于亲密
18、子程序命命不恰当
19、数据成员被设置为公用
20、某个派生类仅使用基类的很少一部分成员函数
21、注释被用于解释难懂的代码
22、使用了全局变量
23、在了程序调用前使用了设置代码,或在调用后使用了收尾代码
24、程序中的代码似乎是在将来的某个时候才会用到
数据级的重构:
用具名常量代替神秘数值
使变量名字更为清晰,传递更多的信息
将表达式内联化
用函数来代替表达式
引入中间变量
用多个单一用途变量代替某个多用途变量
在局部用途中使用局部变量而不是参数
将基础数据类型转化为类
将一组类型码转化为类或枚举类型
将一组类型码转换为一个基类及其相应派生类
将数据转换为对象
把群集封装起来
用数据类来代替传统记录
语句级重构:
分解布尔表达式
将得很要的布尔表达式转换成命名准确的布尔函数
合并条件语句不同部分中的重复代码片段
使用Break/return代替循环控件变量
在嵌套的If-then-else语句中一旦知道答案就立即返回,而不是去赋一个返回值
用多态来替代条件语句
创建和使用null对象而不是去检测空值
子程序级重构
提取子程序或者方法
将子程序的代码内联化
将冗长的子程序转换成类
用简单的算法代替复杂的算法
增加参数
删除参数
将查询操作从修改操作中独立出来
合并相似的子程序,通过参数区分它们的功能
将行为取决于参数的子程序拆分开来
传递整个对象而非特点成员
传递特点成员而非整个对象
包装向下转型的操作
类实现的重构:
将值对象转化为引用对象
将引用对象转化为值对象
用数据初始化替代虚函数
改变成员函数或成员数据的位置
将特殊代码提取为派生类
将相似的代码结合起来放置在基类中
类接口的重构:
将成员函数放到另一个类中
将一个类变成两个
删除类
去除委托关系
去掉中间人
用委托代替继承
用继承代替委托
引入外部的成员函数
引入扩展类
对暴露在外的成员变量进行封装
对于不能修改的类成员,删除相关的Set成员函数
隐藏那些不会在类之外被用到的成员函数
封装不使用的成员函数
合并那些实现非常类似的基类和派生类
系统级重构:
为无法控制的数据创建明确的索引源
将单向的类联系改为双向的类联系
将双向的类联系改为单向的类联系
用Factory method模式而不是简单的构造函数
用异常取代错误代码