关山难越,谁悲失路之人;萍水相逢,尽是他乡之客。
百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程教程 > 技术文章 > 正文

我来告诉你代码重构有什么好处

guanshanw 2023-09-19 13:18 17 浏览 0 评论

在本指南中,您将了解重构源代码的所有内容:好处、挑战、工具和最佳实践,以及重构和技术债务之间的区别。

一个人在他的笔记本电脑上工作A man working on his laptop computer

我们都在寻找清理代码、降低复杂性和改进功能的方法。重构提供了前进的道路。

本指南将涵盖以下主题:

  1. 什么是重构?
  2. 重构有什么好处?
  3. 技术债务与重构
  4. 重构指标
  5. 代码重构示例
  6. 代码重构工具
  7. 重构和工程经理面临的挑战
  8. 高级管理层对重构的支持
  9. 团队支持和重构:冲刺还是马拉松?
  10. 文档和重构

什么是重构?

根据两本关于重构的书籍的作者 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 添加关键问题

相关推荐

七条简单命令让您玩转Git
七条简单命令让您玩转Git

凭借着出色的协作能力、快速部署效果与代码构建辅助作用,Git已经得到越来越多企业用户的青睐。除了用于开发商业及消费级应用之外,众多科学及政府机构也开始尝试使用这...

2023-10-07 12:14 guanshanw

基本完整的关于Git分支branch的操作
基本完整的关于Git分支branch的操作

Git使用背景项目中要用到dev或者其他分支开发完代码,需要将该分支合并到master的需求操作步骤下面以dev名称为lex为分支名为例来操作一遍客户端操作:...

2023-10-07 12:14 guanshanw

Git 进阶(合并与变基)
Git 进阶(合并与变基)

在Git中整合来自不同分支的修改主要有两种方法:合并(merge)以及变基(rebase)合并(merge)merge流程图merge的原理是找到这两个分...

2023-10-07 12:13 guanshanw

Git学习笔记 003 Git进阶功能 part5 合并(第一部分)

合并(merge)是很常用的操作。尤其是一个庞大的很多人参与开发的企业级应用。一般会设定一个主分支,和多个副分支。在副分支开发完成后,合并到主分支中。始终保持主分支是一个完整的,稳定的最新状态的分支。...

非标题党,三张图帮你理解git merge和git rebase的区别
非标题党,三张图帮你理解git merge和git rebase的区别

初始场景:基于正常的开发分支修改几个小bug,然后在合并到开发分支上。gitmergegitcheckoutfeaturegitmergeho...

2023-10-07 12:13 guanshanw

git 初次使用(01)
git 初次使用(01)

先从github上克隆代码下来:使用vscode克隆代码如下图,填写上github仓库地址:vscode有时候克隆代码速度比较慢,可以用命令行方式克隆gitc...

2023-10-07 12:12 guanshanw

Git 远程操作

4.Git远程操作命令说明gitremote远程版本库操作gitfetch从远程获取版本库gitpull下载远程代码并合并gitpush上传远程代码并合并4.1远程版本库操作gitre...

Git常用命令-总结
Git常用命令-总结

创建git用户$gitconfig--globaluser.name"YourName"$gitconfig--globaluser.em...

2023-10-07 12:12 guanshanw

git中删除从别人clone下来项目的git信息,并修改为自己的分支

如果你从别人的Git存储库中克隆了一个项目,并想要删除与该存储库相关的Git信息,并将其修改为你自己的分支,则可以执行以下步骤:使用gitclone命令克隆存储库:gitclone<u...

git系列-回滚和放弃本地修改

回滚历史提交就是reset的功能。这种情况是已经提交远程仓库,需要回滚到之前的提交。gitreset--hardcommitId//注:强制提交后,当前版本后面的提交版本将会删掉!gi...

GIT使用小技巧大全
GIT使用小技巧大全

在大型软件工程的开发过程中,版本控制是无法绕过去的;目前来说,最火的版本控制软件就是GIT了。早两年SVN比较火,不过被大神linus喷了几次后,就日落西山了,...

2023-10-07 12:11 guanshanw

git相关命令-上
git相关命令-上

这些命令都是看了文档后,个人觉得比较有用的一些,展示给大家。回到远程仓库的状态抛弃本地所有的修改,回到远程仓库的状态。gitfetch--all&...

2023-10-07 12:10 guanshanw

Git命令行接口:掌握Git的必备技能
Git命令行接口:掌握Git的必备技能

Git是一款强大的分布式版本控制工具,它支持命令行界面操作。熟练掌握Git命令行接口,是开发者使用Git的必备技能之一。在这篇文章中,我们将介绍Git命令行接口...

2023-10-07 12:10 guanshanw

Git命令详解
Git命令详解

相信各位小伙伴们应该都对git有一些了解,毕竟作为代码管理的神器,就算不是IT行业的小伙伴肯定也或多或少的听说过一些。今天就来和小伙伴们分享一下自己总结的常用命...

2023-10-07 12:10 guanshanw

工作7年收集到的git命令
工作7年收集到的git命令

概念git中的术语解释:仓库也叫版本库(repository)stage:暂存区,add后会存到暂存区,commit后提交到版本库git安装linux...

2023-10-07 12:10 guanshanw

取消回复欢迎 发表评论: