重构:模式、方法与遗留代码处理
1. 模式可作为重构目标
部分重构操作实际上是以其最终形成的模式命名的,例如“形成模板方法(Form Template Method)”和“用状态/策略替换类型代码(Replace Type Code with State/Strategy)”。模式代表着优秀设计的范例,而重构则是将现有设计转变为更优设计的过程。如果模式和重构之间没有某种交汇,那我们就得怀疑其中一方可能存在问题。
即使那些并非专门与特定模式相关的重构,也可用于在现有设计中发现模式。Josh Kerievsky 在其著作中很好地阐述了这一点,值得一读。
2. 避免重构:预重构
了解如何进行重构极为有用,将其作为一门学科来学习,在设计的演进过程中尤为重要。然而,重构既耗时,也并非总是那么有趣,所以能避免时,我们应尽量避免。
例如,遵循按意图编程的实践,若程序员一开始就采用这种方式,某些重构(如提取方法)后的代码形态可能在初始编程时就已实现。再如,封装构造函数的实践能使设计后期出现多态时,改动范围大幅受限,从而减少重构需求。另外,如果在设计时始终考虑模式,像“形成模板方法”这类重构操作或许就无需进行。
不过,我们仍需掌握重构操作,除非满足以下条件:
- 你是完美无缺的。
- 你无需处理他人的代码。
- 你明天才开始编写第一段代码。
- 你永远不会遇到完全打乱设计的需求变更。
显然,这些条件很难全部满足,所以重构技能必不可少。
3. 重构的机制
Fowler 的书中提供了一份重构目录,针对每个重构操作都给出了具体步骤。以常见