重构 是一种有纪律的技术,用于重构现有的代码体,改变其内部结构而不改变其外部行为。
它的核心是一系列小的行为保留转换。每次转换(称为“重构”)都做得很少,但这些转换的顺序可以产生重大的重构。由于每次重构都很小,所以出错的可能性较小。系统在每次重构后都保持完全工作状态,从而降低了系统在重构过程中严重损坏的可能性。
当一个软件系统成功时,总是需要不断地对其进行增强,以修复问题并添加新功能。毕竟,它被称为软件是有原因的!但是代码库的性质对进行这些更改的难易程度有很大影响。通常,增强功能会以一种使进行更改越来越困难的方式叠加在一起。随着时间的推移,新工作会变得越来越慢。为了对抗这种变化,重要的是要重构代码,以便添加的增强功能不会导致不必要的复杂性。
重构不是项目计划中会出现的特殊任务。如果做得好的话,它就是编程活动中的一部分。当我需要向代码库添加新功能时,我会查看现有代码,并考虑它是否以一种使新更改变得简单的方式进行结构化。如果不是,那么我会重构现有代码以使这个新添加变得容易。通过这种方式先进行重构,我通常会发现它比没有先进行重构要快。
完成更改后,我就会添加新功能。添加功能并使其工作后,我经常会注意到,生成的代码虽然可以工作,但并不像它应该的那样清晰。然后我会将其重构为更好的形状,这样当我(或其他人)在几周后返回此代码时,就不必花时间弄清楚这段代码是如何工作的。
修改程序时,我经常会查看代码中的其他地方,因为我需要做的很多事情可能已经编码在程序中。这段代码可能是我可以轻松调用的函数,或者隐藏在更大的函数中。如果我难以理解这段代码,我会对其进行重构,这样下次我查看它时就不必再费力了。如果那里有一些我需要的功能,我会进行重构,以便我可以轻松地使用它。
当我写第一版重构时,在 90 年代后期,很少有自动化工具支持重构。现在许多语言都有 IDE,可以自动化许多常见的重构。这些工具是我工具箱中非常有价值的一部分,使我能够更快地进行重构。但是这些工具并不是必需的 - 我经常在没有工具支持的编程语言中工作,在这种情况下,我依赖于采取小步骤,并使用频繁的测试来检测错误。
本网站的主要内容是 在线重构目录。它列出了第二版中的重构,以及关于重构的摘要信息。
要了解更多关于重构的信息,自然起点是我的 重构书籍,现在已经是第二版了。我在 1997-9 年写了第一版,当时重构还是一种鲜为人知的技术。当我 18 年后更新它时,重构已经成为任何熟练程序员的常用工具。然而,新人经常进入我们的行业,需要学习重构。这本书帮助他们学习,并帮助经验丰富的开发人员传授他们的技能。
第二版中的示例是用 JavaScript 编写的,但重构适用于任何语言。对于原始书籍(其示例是用 Java 编写的),许多开发人员发现很容易将示例应用到他们使用的任何语言。
如果您有这本书,您可以 访问这本书的网络版,它是规范版本。它包含一些书中没有的重构,以及一个扩展的示例。
在书中,我对“重构”做出了以下定义
名词: 对软件内部结构进行的更改,以使其更容易理解和更便宜地修改,而不改变其可观察的行为
动词: 通过应用一系列重构来重构软件,而不改变其可观察的行为。
重构不是清理代码的另一个词 - 它专门定义了一种用于改善代码库健康状况的技术。我使用“重构”作为更通用的术语,用于指可能包含其他技术的代码重组。