软件设计大师 Martin Fowler 是这样定义重构的:重构是一种对软件内部结构的改善,目的是在不改变软件的可视行为的情况下,使其更容易理解,修改成本更低。

其中,“重构不改变外部的可见行为”值得强调。也就是说,在保持软件功能不变的前提下,利用设计思想、原则、模式、编程规范等理论来优化代码,修改设计上的不足,提高代码的质量。

目的:为什么要重构(why)?

首先,重构是时刻保持代码质量的一个极其重要的手段,不至于让代码腐化到无可救药的地步。

其次,优秀的代码或架构不是一开始就是完全设计好的,而是一步步迭代出来的,随着系统的演进,重构代码也是不可避免的。

最后,重构是避免过度设计的有效手段。在维护代码的过程中,真正遇到问题的时候,再对代码进行重构,能有效避免前期投入太多时间做过度设计,做到有的放矢。

同时,重构也是对经典设计思想、设计原则、设计模式、编程规范的一种应用,能够锻炼一个人的代码能力。

对象:到底重构什么(what)?

根据重构的规模,可以笼统地将重构分为大规模高层次的重构小规模低层次的重构

大重构指的是,对顶层代码设计的重构,包括:系统、模块、代码结构、类与类之间的关系等的重构,重构的手段有:分层、模块化、解耦、抽象可复用组件等等。这类重构的工具就是设计思想、原则和模式。

小重构指的是,对代码细节的重构,主要是针对类、函数、变量等代码级别的重构,比如规范命名、规范注释、消除超大类或函数、提取重复代码等等。小重构更多的是利用编码规范。

时机:什么时候重构(when)?

重构不是要等到代码烂到一定程度之后才去进行的。而是要使用一条可持续、可演进的方式。也就是重构策略应该是持续重构

应当将持续重构作为开发的一部分,成为一种开发习惯,就像把单元测试、Code Review 作为开发的一部分一样,这样对项目、对自己都很有好处和帮助。

重构的能力很重要,而持续重构意识更为重要。要正确地看待代码质量和重构,要时刻具备持续重构意识,树立正确的代码质量观、持续重构意识。

方法:如何重构(how)?

在进行大重构的时候,要提前做好完善的重构计划,有条不紊地分阶段来进行。每个阶段完成一小部分代码的重构,然后提交、测试、运行,发现没有问题之后,再继续进行下一阶段的重构,保证代码仓库中的代码一直处于可运行、逻辑正确的状态。大规模高层次的重构一定是有组织、有计划,并且非常谨慎的,需要有经验、熟悉业务的资深同事来主导。

小规模低层次的重构,影响范围小,改动耗时短,所有,只要愿意并且有时间,随时都可以做。同时还可以借助成熟的静态代码分析工具(CheckStyle、FindBugs、PMD),来自动发现代码中的问题,然后针对性地进行重构优化。