重构三:代码的坏味道
重复代码
- 同一个类的两个函数含有相同的表达式,提取出独立函数
- 互为兄弟的子类含有相同的表达式,提取到父类
- 代码只是类似,并非完全相同,则将相似部分和差异部分割开。
过长函数
- 积极分解函数
- 起一个好名字,见名知义
- 出现注释的地方就是有可能提取函数的地方
- 就算只有一行,也值得提炼出独立函数
过大的类
过长参数列
发散式变化
霰弹式修改
- 一种变化引发多个类的修改,移动方法,字段,将需要修改的点放在同一个类中
依恋情节
- 判断哪个类拥有最多被刺函数使用的数据,然后就把这个函数和那些数据摆在一起
- 将总是一起变化的东西放在一块儿
数据泥团
- 两个类中有相同该字段、函数签名中相同的参数,都可以使用Extract class提取为一个新对象。
- 只要新对象能取代两个及以上字段就是有意义的
基本类型偏执
- 对于基本数据类型的偏执,而不愿意将有关联的参数封装成对象。
- 提取类;以对象代替多个参数
Switch Statements
平行继承体系
- 当为某个类增加一个子类,也必须给另一个类增加一个子类,或是发现两个继承体系类名称前缀相同
- 消除:让一个继承体系的实例引用另一个继承体系的实例
冗赘类
- 类的作用不值身价,使用Collapse Hierarchy 或 Inline Class
夸夸其谈未来性
令人迷惑的暂时字段
- 某个实例变量仅为某个特定情况而设。
- 使用Extract Class
过度耦合的消息链
- 用户请求一个对象得到另一个对象,再使用后者得到另一个对象。。。这就是消息链
中间人
- 没有直接调用,而是通过接口委托给了其他类
- 有必要remove调无用的中间调用
狎昵关系
异曲同工的类
- 两个函数做同一件事,却有着不同的签名
- 根据用途重新命名,Move Method, Extract Superclass
不完美的类库
纯稚的数据类
被拒绝的遗赠
- 所有超类都应该是抽象的
- 当子类只需要父类的部分功能时,可给子类创建兄弟类,在运用Push down Method ,Push Down Field
过多的注释
- 注释是一种除臭剂,但是会掩盖代码写的烂
- 最好的做法是,提取方法,rename Method,见名知义。