重构三:代码的坏味道

264 阅读3分钟

重复代码

  • 同一个类的两个函数含有相同的表达式,提取出独立函数
  • 互为兄弟的子类含有相同的表达式,提取到父类
  • 代码只是类似,并非完全相同,则将相似部分和差异部分割开。

过长函数

  • 积极分解函数
  • 起一个好名字,见名知义
  • 出现注释的地方就是有可能提取函数的地方
  • 就算只有一行,也值得提炼出独立函数

过大的类

  • 提取类
  • 提取子类
  • 提取接口

过长参数列

  • 使用参数对象

发散式变化

  • 一个类受到多种变化影响,针对不同点提取类

霰弹式修改

  • 一种变化引发多个类的修改,移动方法,字段,将需要修改的点放在同一个类中

依恋情节

  • 判断哪个类拥有最多被刺函数使用的数据,然后就把这个函数和那些数据摆在一起
  • 将总是一起变化的东西放在一块儿

数据泥团

  • 两个类中有相同该字段、函数签名中相同的参数,都可以使用Extract class提取为一个新对象。
  • 只要新对象能取代两个及以上字段就是有意义的

基本类型偏执

  • 对于基本数据类型的偏执,而不愿意将有关联的参数封装成对象。
  • 提取类;以对象代替多个参数

Switch Statements

  • 少用switch
  • 使用多态来替换它

平行继承体系

  • 当为某个类增加一个子类,也必须给另一个类增加一个子类,或是发现两个继承体系类名称前缀相同
  • 消除:让一个继承体系的实例引用另一个继承体系的实例

冗赘类

  • 类的作用不值身价,使用Collapse Hierarchy 或 Inline Class

夸夸其谈未来性

  • 预留一些用不到的功能,用不到就砍掉

令人迷惑的暂时字段

  • 某个实例变量仅为某个特定情况而设。
  • 使用Extract Class

过度耦合的消息链

  • 用户请求一个对象得到另一个对象,再使用后者得到另一个对象。。。这就是消息链

中间人

  • 没有直接调用,而是通过接口委托给了其他类
  • 有必要remove调无用的中间调用

狎昵关系

  • 两个类过分亲密
  • 划清界限,共同点提取

异曲同工的类

  • 两个函数做同一件事,却有着不同的签名
  • 根据用途重新命名,Move Method, Extract Superclass

不完美的类库

  • 库不完美,需要自己修改

纯稚的数据类

  • 其实就是一些没有私有化的字段

被拒绝的遗赠

  • 所有超类都应该是抽象的
  • 当子类只需要父类的部分功能时,可给子类创建兄弟类,在运用Push down Method ,Push Down Field

过多的注释

  • 注释是一种除臭剂,但是会掩盖代码写的烂
  • 最好的做法是,提取方法,rename Method,见名知义。