概念
a.重构是一种以可控的方式整理代码的艺术,在不改变软件可观察行为的前提下改善结构,让软件始终可维护,保证开发效率
- 什么时候开始
1. 添加新功能,当添加起来比较麻烦时,如历史代码完全无法理解和修改;
2. 修复bug的过程中,如果bug难以定位
3.事不过三:在经常需要修改的烂代码上做重构才有最大收益。
4.代码评审时
- 什么时候停止
直到符合四条原则停止:通过测试,没有重复,表达意图,最少元素
大型系统可选择性重构
- 不会被执行的烂代码 -删除
- 运行稳定,基本不会改动的烂代码
- 经常发现 Bug 的烂代码
- 经常需要变更的烂代码
- 流程
1.测试保护-识别味道(22)-采用手法(66)-测试,提交代码
2.测试-修改-测试:所以任意一个重构点,都能做到切换到新增功能,而不需要回滚已做的重构;
- 随时终止,断点续传
- 如重命名一个方法,共100个调用点,改到50个时,停下来切换feature开发时,
- 另外50个调用点仍能使用旧的方法名
- 一般的做法是旧函数去调用新函数;
先不改动旧的结构,直接创建新的结构,当新结构完成时,再一个个切换,当确认所有的都切换后,再删除旧的
- 过程可逆
1.不能保证重构后更好或者更好
2.但能够保证1分钟就重构会回来,因为所有的重构方法都是双向的
- 始终工作,持续集成
在不改变软件可观察行为的前提下,不需要为重构单构建分支,重构过程可以做到feature开发在同一分支上持续集成交付
- 消除坏味道
1.开始:识别一个坏味道(bad smell)
2.结束:消灭一个坏味道
不以消除坏味道为目标的重构都是耍流氓
坏味道
22种常见坏味道:
1.通过增加编码经验获取判断直觉
2.更快的方式是大量阅读优秀的开源代码
分为5类
-
膨胀剂
- 太长的方法【小函数拥有好名字更容易被理解】
- 太大的类
- 基本类型偏执
- 太多参数
- 数据泥团
-
滥用oo
- switch语句
- 临时字段
- 被拒绝的馈赠
- 异曲同工的类
-
难以修改
- 发散式变化
- 散弹式变化
- 平行继承体系
-
可有可无
- 注释
- 重复代码
- 冗杂类
- 数据类
- 死代码
- 夸夸其谈未来性
-
耦合
- 🍎特性依恋
- 狎昵关系
- 消息链
- 中间人
- 不完整的类库
常用手法
共66种常用手法,可以分为6大类:http://www.jianshu.com/p/ffd89d5df276
http://www.jianshu.com/p/94dc3a2f8598
-
重组函数
- 抽取方法
- 内联方法
- 抽取变量
- 内联临时变量
- 查询取代临时变量
- 分解临时变量
- 移除对参数赋值
- 以函数对象取代函数
- 替换算法
-
搬移特性
- 搬移函数
- 搬移字段
- 提炼类
- 内联类
- 隐藏委托关系
- 移除中间人
- 引入外加函数
- 引入本地拓展
-
组织数据
- 自封装字段
- 以对象取代数组
- 以对象取代数据值
- 复制被监视数据
- 将值对象改为引用对象
- 引用对象改为值对象
- 单向关联到双向关联
- 双向关联到单向关联
- 字面常量取代魔法数
- 封装字段
- 封装集合
- 数据类取代记录
- 字段取代子类
- 子类取代类型码
- 类型取代类型码
- state/Strategy取代类型码
-
简化条件
- 分解条件表达式
- 合并条件表达式
- 多态取代条件
- 卫语句取代条件
- 合并重复条件片段
- 引入null对象
- 移除控制标记
- 引入断言
-
简化函数调用
- 函数改名
- 添加参数
- 移除参数
- 引入参数对象
- 零函数携带参数
- 用函数取代参数
- 保留完整对象
- 移除设值函数
- 隐藏函数
- 以测试取代异常
- 封装向下转型
- 以异常取代错误码
- 以工厂函数取代构造函数
- 将查询函数和修改函数分离
-
处理概括函数
- 字段上移
- 字段下移
- 函数上移
- 函数下移
- 构造函数本体上移
- 抽取字类
- 抽取超类
- 抽取接口
- 塑造函数模版
- 折叠继承体系
- 以委托取代继承
- 以继承取代委托
网友评论