在本指南中,您将了解重构源代码的所有内容:好处、挑战、工具和最佳实践,以及重构和技术债务之间的区别。
一个人在他的笔记本电脑上工作A man working on his laptop computer
我们都在寻找清理代码、降低复杂性和改进功能的方法。重构提供了前进的道路。
本指南将涵盖以下主题:
- 什么是重构?
- 重构有什么好处?
- 技术债务与重构
- 重构指标
- 代码重构示例
- 代码重构工具
- 重构和工程经理面临的挑战
- 高级管理层对重构的支持
- 团队支持和重构:冲刺还是马拉松?
- 文档和重构
根据两本关于重构的书籍的作者 Martin Fowler的说法
“重构是改变软件系统的过程,它不会改变代码的外部行为,但会改善其内部结构。这是一种清理代码的严格方法,可以最大限度地减少引入错误的机会。本质上,当你重构时,你是在改进编写代码后的设计。”
重构有什么好处?源代码重构提供了许多优势。它将混乱、不正确和/或重复的代码变成干净的代码。它解决了多个开发人员贡献自己的代码时可能出现的标准化问题。重构提供了更高的可读性并提高了源代码的可维护性以及整体结构和功能。重构可以使代码更容易扩展和添加新功能。删除不必要的部分(例如重复)也可以使代码使用更少的内存并更快地执行。
例如,在 2014 年,Kickstarter 工程师面临用户数量呈指数增长导致查询性能下降的挑战。作为回应,他们将 MySQL 查询重构为 Redis,并将典型的加载时间缩短了 100 毫秒以上,从而减少了加载时间的差异,并使网站整体速度更快。
技术债务与重构使用虚拟现实模拟器对抗窗户上的粘合剂的商人的全长Full length of businessman
简而言之,重构是消除或减少技术债务的一种方式。
重构对于保持长期的代码质量、安全性和性能至关重要。如果不定期进行保理,开发人员就会背负巨额的技术债务。随着错过更多代码重构的机会,这种债务会增加,因此,新的开发变得困难,尤其是基于遗留代码的开发。
重构指标使用指标可以让您确定您真正需要对代码执行的主要修复操作的优先级。它阻止您尝试一次完成所有事情,并首先专注于最重要的任务。
此外,您需要衡量源代码重构效果的指标——这不仅仅是改变低效代码,而是改变低效代码以增加价值。**要获得真正的价值,您需要进行单元测试(例如单元测试失败的数量)和功能测试。其他指标可能包括发现更少的错误和降低圈复杂度——重构应该旨在降低复杂度。具有高复杂度的方法或函数(例如超过 350 行的那些)是很好的重构目标。
在工作流和任务方面,重构如何与更广泛的团队目标或里程碑相适应也是值得考虑的。这应该包括更小的代码大小和更易于理解的代码。
代码重构示例代码重构的例子有很多,但为简洁起见,我们将重点介绍几个:
- 红色、绿色、重构
重构与单元测试密切相关。最常见的形式之一是敏捷方法固有的测试驱动开发 (TDD)。在编写代码之前编写测试。本质上,测试应该驱动程序,说明代码应该做什么。
Red、Green、Refactor 是 TDD 的一个例子:
- 红色:编写没有实现代码的测试套件,确保它失败。
- 绿色:编写实现代码,足以让测试套件通过。
- 重构:寻找优化和改进代码的方法。
- 提取方法又名提取函数
- 将现有方法中的一段代码移动到一个明确命名的新方法中,以解释其功能。这种技术有助于降低复杂性并提高代码的可读性。
- 提取变量
如果您遇到一个难以理解的表达式,或者它在整个代码中的多个位置重复,则提取变量重构可以将此类表达式的结果或其部分放入一个不太复杂且更易于理解的单独变量中。这降低了复杂性和代码重复。
- 抽象分支
抽象分支用于以渐进的方式对软件系统进行大规模更改,允许您在更改仍在进行时定期发布系统。这消除了在尝试合并代码时可能出现问题的分支上重构代码的复杂性。
- 组合方法
过长的代码难以理解且难以更改。Compose 方法是指可用于简化方法和删除代码重复的一系列操作。其中包括 Inline Method、Inline Temp、Replace Temp with Query、拆分临时变量和删除参数分配。
代码重构工具您需要专业的重构工具吗?Martin Fowler 说自动化工具很有帮助,但不是必不可少的。他指出:
*“许多语言都有可以自动执行许多常见重构的 IDE。这些是我的工具包中非常有价值的部分,可以让我更快地进行重构。但这些工具并不是必不可少的——我经常在没有工具支持的情况下使用编程语言工作,在这种情况下,我依赖于采取小步骤,并使用频繁的测试来检测错误。”
许多开发环境使重构的机械方面自动化。关键的代码重构工具是:
- Visual studio intellicode
- Eclipse IDE
- Spring Tool Suite 4
- Rider
- IntelliJ IDEA
- SonarQube
- Stepsize
要解决导致需要重构的问题,需要探索公司的运作方式。在开始重构过程之前,请回答几个问题:
- 哪些任务获得第一优先权?
- 发展速度如何?
- 开发人员是否感到快速发布代码的压力?
- 有哪些流程来处理技术债务?
- 进行了哪些类型的代码审查?
- 您的团队是否具备重构的适当技能?
- 公司的文件标准是什么?
如果不解决导致需要重构的潜在问题,问题只会激增。
高级管理层对重构的支持投资基础设施和维护在您的公司中可能并不受欢迎。
很容易争辩说,重构所花费的时间就是远离新工作所花费的时间。
但值得关注重构的更大好处以及它们与工作流、客户、收入和业务增长的关系。重构做得好,可以改进需要运行良好的代码,以提供吸引新客户和回头客的有效更新和趋势功能。这就是软件公司即使在产品成功发布很久之后仍然保持竞争力的方式。
更好的是通过量化团队当前花费多少时间来修复由于原始代码中的问题而导致的错误或错误,从而获得高级管理层对重构的支持。具体来说,是一天一小时吗?一天两小时?保持一周以上的记录,当您得知您的团队每年花费数周或数月来修复遗留代码时,您可能会感到震惊。
团队支持和重构:冲刺还是马拉松?计算机网络Computer network
重构对你的团队来说很难吗?一提到它,人们会呻吟吗?成功重构的最大标志是计划好的、有目的地和记录的操作。Ron Jeffries 是极限编程软件开发方法的三位创始人之一,他将重构比作清理领域:
“我们采用我们被要求构建的下一个功能,而不是绕过所有杂草和灌木,我们花时间清理其中一些路径。”
然而,他强调糟糕的代码需要很长时间才能清理干净,并支持一种比简单地深入研究更深思熟虑的方法:
“我们改进了我们工作的代码,而忽略了我们不需要工作的代码。很可能,我们会再次访问这个地方。
通常在同一个 Sprint 中,我们发现后续功能实际上使用了我们之前清理过的区域。我们立即开始从增量重构中受益。如果我们等到大批量进行,我们会付出更多努力,将任何福利推迟到更晚,并且可能会在尚未提供福利的地方浪费精力。”
产品工程师兼首席技术官Andreas Klinger是 Fix-it Friday 的粉丝。
“Fix-it Friday 的规则很简单:除非您当前的项目着火了,否则请利用周五来投资进行一些小的改进。让工程师选择他们的工作。尽量不要通过微观管理从中获取“乐趣”。有些人会尝试新的库。有些会从积压中删除错误。两者都很好。尝试鼓励任务的平衡。”
无论您采用哪种方法,都需要加以考虑。询问您的团队哪些代码最妨碍他们的工作效率。
- 什么代码修复会对您的其他代码产生最大的影响?
- 哪些修复将提供最大的回报?
您不太可能有大量时间专门用于重构而牺牲所有其他项目,但不要低估定期、一致、专用的小型重构的影响。这些加起来并结合起来,有一个显着的好处。
文档和重构标准化命名约定等文档可以确保每个人都在同一页面上。Xerox 高级开发人员对审查重构的研究发现,缺乏文档是最大的挑战之一。
记录您的重构工作会导致花费时间,并为未来的团队成员提供上下文。
另外,记录你的成功——重构的最大收获是什么?这些可以纳入同行评审吗?
淹没在需要重构和技术债务的代码中?选择一个比较好的编辑器优先的问题跟踪器,用于帮助工程师实现健康的代码库:
- 直接从编辑器创建和查看代码问题
- 跟踪和优先考虑代码改进,如技术债务
- 使用我们的 Jira 集成为您的 sprint 添加关键问题