重构总结(TODO)
简介
1.什么是重构
重构是对软件的内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高代码可理解性,降低维护成本。
关键:
- 更好的可读性
- 更好的可扩展性
- 功能保持一致
为什么要重构
- 改进软件设计
整理代码,使代码结构回到最初设计,维持代码该有的形态,避免软件腐烂变质。 - 使软件更容易理解
代码是人与及其交互的语言。保持语言的简洁有助于:
(1)理解代码
(2)后来者维护代码 - 帮助找到Bug
重构过程可以重新梳理逻辑,找到潜在的Bug。 - 提高编程速度
良好的设计师快速开发的根本。
何时进行重构
事不过三,三则重构
- 添加功能时重构
添加功能时,理解需要修改的代码,使添加功能更加轻松。 - 修改错误时候重构
好的代码是足够清晰以至于能够肉眼观察bug,所以当遇到bug时,说明设计不够清晰,因而需要重构 - 复审代码时重构
重构的期望
- 容易阅读
- 所有的逻辑都只在唯一地点指定
- 新的改动不会危及现有行为
- 尽可能简单的表达条件逻辑
代码的坏味道(什么样的代码需要重构)
- 重复代码(Duplicated Code)
- 同一个类中的两个函数具有相同的代码,可以使用Extract Method提炼吃重复代码
- 两个兄弟子类具有相同的代码,则提炼相同代码(Extract Method),再将提炼出来的函数推送给父类(Pull up method)
- 对于部分相同的情况,则分离出相似部分和差异部分,使用模板设计模式。
- 两个不相关类出现重复代码,则将重复代码提取到一个独立类。
- 过长的函数(Long method)
- 小型函数作为“间接层”具有解释能力、共享能力、选择能力
- 当需要用注释来描述代码的时候,就应该对函数进行分解,把需要说明的部分放入独立的函数,以其用途来命名
- 函数传参里有过多的参数和临时变量,应该尽量消除临时变量,使参数列表更加简洁。
- 过大的类(Large Class)
- 过长的参数列(Long Paramenter List)
- 发散式变化(Divergent Change)
- 散弹式修改(Shotgun Surgery)
- 依恋情节(Feature Envy)
- 数据泥团(Data Clumps)
- 基本类型偏执(Primitive Obsession)
- Switch现身(Switch Statement)
- 平行继承体系(Parallel Inheritance Hierarchies)
- 冗赘类(Lazy Class)
- 夸夸其谈未来性(Speculative Generality)
- 令人迷惑的临时字段(Temporary Field)
- 过度耦合的消息链(Message Chains)
- 中间人(Middle Man)
- 狎昵关系(Inappropriate Intimacy)
- 异曲同工的类(Alternative Classes with Different Interfaces)
- 不完美的库类(Incomplete Library Class)
- 纯稚的数据类(Data Class)
- 被拒绝的遗赠(Refused Bequest)
- 过多的注释(Comments)
重构列表
重新组织函数
- 提炼函数(Extract Method)
适用场景