共计 3311 个字符,预计需要花费 9 分钟才能阅读完成。
在本指南中,您将理解重构源代码的所有内容:益处、挑战、工具和最佳实际,以及重构和技术债权之间的区别。
一个人在他的笔记本电脑上工作 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 增加关键问题