重构

网站地址

重构的主要目的是应对技术债,它将混乱转化为清晰的代码和简洁的设计。

重构是什么

清晰的代码(Clean code)

  1. 不包含重复代码,减少重复修改的负担
  2. 包含最少数量的类和其他可移动部分,减少维护工作和错误
  3. 通过所有测试

技术债(Technical debt)

  1. 业务压力,平常打的临时补丁
  2. 缺乏对技术债的理解,管理层看不到它的价值
  3. 未能应对组件的严格一致性?
  4. 缺乏测试
  5. 缺乏文档
  6. 团队成员缺乏互动,知识库没有共享,流程和信息过时
  7. 多分枝长期并行开发
  8. 延迟重构
  9. 缺乏合规性监控,每个人都按照上个项目的风格写代码
  10. 无能,不知道怎么写像样的代码

何时重构

  1. 三分法则:第一次做某件事时,只需要完成。第二次做类似的事情时,虽然有重复,但也还是做了。第三次就需要重构了
  2. 当前添加功能时:新代码更容易进行重构
  3. 当修复一个bug时
  4. 在进行代码审查时

如何重构

  1. 代码应该更清晰
  2. 重构期间不应该创建新功能
  3. 重构后所有测试都要通过

代码异味(Code Smells)

肥胖者(Bloaters)

  1. 长方法:一个方法包含太多行。超过十行,应该考虑抽到新方法中
  2. 大类:一个类包含太多字段、方法、代码行。应该提取类和接口出来
  3. 痴迷于原始类型(Preimtive Obsession):使用基本类型而不是小型对象。当基本字段过多时,可以考虑把字段和行为都移到单独的类里
  4. 长参数列表:一个方法超过三、四个参数。可以引入参数对象
  5. 数据块(Data Clumps):这些数据块应该放到自己的类中

滥用面向对象

  1. 巨大的switch和if:用多态来解决
  2. 临时字段:很多时候都是空的,也是提取类来处理
  3. 拒绝继承:父类中的很多方法和属性用不上,不需要继承或者把子类才用的字段和方法放到子类
  4. 不同接口的替代类:两个类的功能一样但是方法名不一样,可能是有人不知道已经实现了,应该保留一个