重构总结(TODO)

简介

1.什么是重构

重构是对软件的内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高代码可理解性,降低维护成本。

关键:

  • 更好的可读性
  • 更好的可扩展性
  • 功能保持一致

为什么要重构

  • 改进软件设计
    整理代码,使代码结构回到最初设计,维持代码该有的形态,避免软件腐烂变质。
  • 使软件更容易理解
    代码是人与及其交互的语言。保持语言的简洁有助于:
    (1)理解代码
    (2)后来者维护代码
  • 帮助找到Bug
    重构过程可以重新梳理逻辑,找到潜在的Bug。
  • 提高编程速度
    良好的设计师快速开发的根本。

何时进行重构

事不过三,三则重构

  • 添加功能时重构
    添加功能时,理解需要修改的代码,使添加功能更加轻松。
  • 修改错误时候重构
    好的代码是足够清晰以至于能够肉眼观察bug,所以当遇到bug时,说明设计不够清晰,因而需要重构
  • 复审代码时重构

重构的期望

  • 容易阅读
  • 所有的逻辑都只在唯一地点指定
  • 新的改动不会危及现有行为
  • 尽可能简单的表达条件逻辑

代码的坏味道(什么样的代码需要重构)

  1. 重复代码(Duplicated Code)
  • 同一个类中的两个函数具有相同的代码,可以使用Extract Method提炼吃重复代码
  • 两个兄弟子类具有相同的代码,则提炼相同代码(Extract Method),再将提炼出来的函数推送给父类(Pull up method)
  • 对于部分相同的情况,则分离出相似部分和差异部分,使用模板设计模式。
  • 两个不相关类出现重复代码,则将重复代码提取到一个独立类。
  1. 过长的函数(Long method)
  • 小型函数作为“间接层”具有解释能力、共享能力、选择能力
  • 当需要用注释来描述代码的时候,就应该对函数进行分解,把需要说明的部分放入独立的函数,以其用途来命名
  • 函数传参里有过多的参数和临时变量,应该尽量消除临时变量,使参数列表更加简洁。
  1. 过大的类(Large Class)
  2. 过长的参数列(Long Paramenter List)
  3. 发散式变化(Divergent Change)
  4. 散弹式修改(Shotgun Surgery)
  5. 依恋情节(Feature Envy)
  6. 数据泥团(Data Clumps)
  7. 基本类型偏执(Primitive Obsession)
  8. Switch现身(Switch Statement)
  9. 平行继承体系(Parallel Inheritance Hierarchies)
  10. 冗赘类(Lazy Class)
  11. 夸夸其谈未来性(Speculative Generality)
  12. 令人迷惑的临时字段(Temporary Field)
  13. 过度耦合的消息链(Message Chains)
  14. 中间人(Middle Man)
  15. 狎昵关系(Inappropriate Intimacy)
  16. 异曲同工的类(Alternative Classes with Different Interfaces)
  17. 不完美的库类(Incomplete Library Class)
  18. 纯稚的数据类(Data Class)
  19. 被拒绝的遗赠(Refused Bequest)
  20. 过多的注释(Comments)

重构列表

重新组织函数

  1. 提炼函数(Extract Method)
    适用场景