序言
本文是书籍《重构:改善既有代码的质量》的一个缩影。
定义
1.重构是对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
2.使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。
代码的坏味道
- 重复代码
- 过长函数:程序越长越难理解,函数应该以用途命名。
- 过大的类
- 过长参数列:太长的参数列难以理解,会造成前后不一致,不易使用
- 发散式变化:一个类受多种变化的影响
- 霰弹式修改:一种变化引发多个类相应修改
- 依恋情结:作者认为对象技术的全部要点在于,将数据和对数据的操作行为包装在一起
- 数据泥团:提倡以一个新对象,来取代两个或多个字段
- 基本类型偏执:提倡将关联的基本数据类型封装到对象中,例如起始值组成的range类
- switch惊悚现身:同样的switch散布在不同地点
- 平行继承体系:问题是当为某个类增加一个子类时,也必须为另一个类相应地增加一个子类
- 冗赘类:提倡如果一个类不值得花时间去理解维护,就应该消失
- 夸夸其谈未来性:认为如果用不到,就不值得。用户上的装置只会当你的路,所以把它搬开
- 令人迷惑的暂时字段:建议不要讲个例参数加入通用方法,以免难以理解
- 过度耦合的消息链:客户代码与函数链紧密耦合,函数链太长等,建议将需要的代码提取为独立函数,避免过度耦合
- 中间人:例如某个类接口有一半的函数都委托给其它类,这就是过度运用封装。
- 狎昵关系:因继承等原因造成过分亲密的类,应该提取共同点到一个新类,或者使用代理取代继承
- 异曲同工的类
- 不完美的库类:为了复用而建立的类库不够完美, 则需要完善它
- 纯稚的数据类型:作者认为java bean实体类不应该有public字段,不应该开放不要的setter方法,而且有一点个人不太认同:作者认为应该讲对象的行为也一起封装到java bean中,个人认为实际开发中,应该讲数据和行为分离,不然很容易出现过大的类。
- 被拒绝的遗赠:提倡超类就只持有所有子类共享的东西,不共享的东西应该移出超类;如果子类拒绝集成超类的全部接口,则应该用代理取代继承
- 过多的注释:提倡撰写注释时,先尝试重构,试着让所有注释都变得多余。注释只用来记录将来的打算,大概的设计思路和一些注意事项。
重构列表
- 添加参数
- 将双向关联改为单向关联
- 将引用对象改为值对象
- 将单向关联改为双向关联
- 将值对象改为引用对象
- 折叠继承体系
- 合并条件表达式
- 合并重复的条件片段
- 将过程化设计转化为对象设计
- 分解条件表达式
- 复制被监视数据
- 封装集合
- 封装向下转型
- 封装字段
- 提炼类
- 提炼集成体系
- 提炼接口
- 提炼函数
- 提炼子类
- 提炼超类
- 塑造模板函数
- 隐藏委托关系
- 隐藏函数
- 将类内联化
- 内联函数
- 内联临时变量
- 引入断言
- 引入解释性变量
- 引入外加函数
- 引入本地扩展
- 引入Null对象
- 引入参数对象
- 搬移字段
- 搬移函数
- 令函数携带参数
- 保持对象完整
- 构造函数本体上移
- 字段上移
- 函数上移
- 字段下移
- 函数下移
- 移除对参数的赋值
- 移除控制标记
- 移除中间人
- 移除参数
- 移除设值函数
- 函数改名
- 以对象取代数组
- 以多态取代条件表达式
- 以工厂函数取代构造函数
- 以对象取代数据值
- 以继承取代委托
- 以异常取代错误码
- 以测试取代异常
- 已委托取代继承
- 以字面常量取代魔法数
- 以函数对象取代函数
- 以卫语句取代嵌套条件表达式
- 以明确函数取代参数
- 以函数取代参数
- 以数据类取代记录
- 以字段取代子类
- 以查询取代临时变量
- 以类取代类型码
- 以State、Strategy取代类型码
- 以子类取代类型码
- 自封装字段
- 将领域和表述/显示分离
- 将查询函数和修改函数分离
- 分解临时变量
- 替换算法
- 梳理并分解集成体系
|