第2章 重构的原则

定义

  • 名词定义:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
  • 动词定义:使用一系列重构手法,在不改变软件可观察行为的前提下,调整期结构。

重构的关键在于运用大量微小且保持软件行为的步骤,一步步达成大规模的修改。每个单独的重构要么很小,要么由若干小步骤组合而成。因此,在重构过程中,不应该出现代码不可工作的状态。换句话说,如果代码在重构过程中有一两天的时间不可用,基本上可以确定,他们在做的不是重构

重构与性能优化

相同点:

  • 都需要修改代码,并且两者不会改变程序的整体功能

不同:

  • 重构是为了让代码"更容易理解,更易于修改"。可能是程序运行得更快,也有可能更慢
  • 性能优化则只关心让程序运行得更快,最终得到的代码可能更难理解和维护

开发时需要遵守的准则

  • 添加新功能时,不应该修改既有代码,只管添加新功能并通过测试。
  • 重构时不再添加新功能,只管改进程序结构,并通过已有测试。

为何重构

  • 重构改进软件设计(Design)
  • 重构使软件更容易理解(Maintain)
  • 重构帮助找到BUG(Debug)
  • 重构提高编程速度(Efficiency)

何时重构

  • 三次法则:事不过三,三则重构
  • 添加功能时重构(New Feature)
  • 修补错误时重构(Bug Fix)
  • 复审代码时重构(Code Review)

何时不该重构

  • 既有代码太混乱,且不能正常工作,需要重写而不是重构。
  • 项目接近最后期限时,应该避免重构。

重构的目标

情况描述 目标
难以阅读的程序,难以修改 容易阅读
逻辑重复的程序,难以修改 所有逻辑都只在唯一地点指定
添加新行为时需要修改已有代码的程序,难以修改 新的改动不会危及现有行为
带复杂条件逻辑的程序,难以修改 尽可能简单表达条件逻辑

间接层和重构

间接层的作用:

  • 允许逻辑共享(避免重复代码)
  • 分开解释意图和实现(方法越短小,越容易起好名字揭示意图,单一职责)
  • 隔离变化(软件需要根据需求的变化不断修改,隔离缩小修改的范围)
  • 封装条件逻辑(多态消息)