Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >告诉大家代码重构有什么好处

告诉大家代码重构有什么好处

作者头像
IT大咖说
发布于 2022-03-08 09:10:10
发布于 2022-03-08 09:10:10
1.2K0
举报
文章被收录于专栏:IT大咖说IT大咖说

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

一个人在他的笔记本电脑上工作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 添加关键问题

来源:

https://www.cnblogs.com/microstone123/p/15948784.html

“IT大咖说”欢迎广大技术人员投稿,投稿邮箱:aliang@itdks.com

来都来了,走啥走,留个言呗~

 IT大咖说  |  关于版权

由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!

感谢您对IT大咖说的热心支持!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT大咖说 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
函数的递归调用(零基础理解递归)
递归是c语言学习中一个绕不开的话题, 那什么是递归呢? 递归其实就是一种解决问题的方法, 在c语言中, 递归就是函数自己调自己. 写一个史上最简单的C语言递归代码:
用户11317877
2024/10/16
1870
函数的递归调用(零基础理解递归)
信息安全实验室招新试题和完全解析
写个网页应该是很简单的,不管是静态网页还是带特效的网页。但是有几个问题,需要说明一下。
慕白
2018/08/03
1.2K0
信息安全实验室招新试题和完全解析
c语言函数递归与迭代详解(含青蛙跳台阶问题详解)
1.递归是什么? 递归是学习C语言函数绕不开的一个话题,那什么是递归呢? 递归其实是一种解决问题的方法,在C语言中,递归就是函数自己调用自己。 这里有一个极其简单的递归代码:
fhvyxyci
2024/09/24
1280
c语言函数递归与迭代详解(含青蛙跳台阶问题详解)
前端一面必会手写面试题(边面边更)4
函数柯里化概念: 柯里化(Currying)是把接受多个参数的函数转变为接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术。
helloworld1024
2023/01/06
3290
2022必会的前端手写面试题
要求写出 区号+8位数字,或者区号+特殊号码: 10010/110,中间用短横线隔开的正则验证。 区号就是三位数字开头。
buchila11
2022/05/01
7870
阶乘算法优化「建议收藏」
原文地址:http://blog.csdn.net/yxnk/article/details/1665052
全栈程序员站长
2022/09/15
1.4K0
c语言从入门到实战——函数递归
函数递归是指一个函数直接或间接地调用自身,以解决问题的一种方法。在C语言中,函数递归可以用来计算阶乘、斐波那契数列等数学问题。 函数递归是一种编程技术,其中函数直接或间接地调用自身来解决问题。它常用于处理可以分解为更小同类问题的复杂问题,如排序、搜索树等。递归的基本思想是将问题分解为更简单的子问题,然后组合子问题的解来得到原问题的解。然而,递归需要小心处理终止条件,否则可能导致无限循环。此外,递归可能消耗大量内存,因为它需要存储每个递归调用的状态。因此,在使用递归时,应仔细考虑其效率和适用性。
鲜于言悠
2024/03/20
2610
c语言从入门到实战——函数递归
【C语言】函数递归(含扫雷进阶思路)
    递归是学习C语⾔函数绕不开的⼀个话题,那什么是递归呢?     递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。 写⼀个史上最简单的C语⾔递归代码:
TANGLONG
2024/10/15
1450
【C语言】函数递归(含扫雷进阶思路)
美团前端手写面试题总结
该方法的参数是 Promise 实例数组, 然后其 then 注册的回调方法是数组中的某一个 Promise 的状态变为 fulfilled 的时候就执行. 因为 Promise 的状态只能改变一次, 那么我们只需要把 Promise.race 中产生的 Promise 对象的 resolve 方法, 注入到数组中的每一个 Promise 实例中的回调函数中即可.
helloworld1024
2022/10/18
9800
【c语言】一篇文章搞懂函数递归
递归是什么?其实,递归是一种解决问题的方法,体现在c语言中就是函数自己调用自己。让我们举一个最史上最简单的递归代码:
ephemerals__
2024/10/24
1820
【c语言】一篇文章搞懂函数递归
腾讯前端高频手写面试题
函数柯里化概念: 柯里化(Currying)是把接受多个参数的函数转变为接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术。
helloworld1024
2022/11/15
5960
近期作业总结(函数,递归,二进制)
方法一:思路:我们将该数据%2,如果除尽,则证明最后一位数字为0,如果未除尽,则最后一位为1。如果是1,则count++。
用户11039545
2024/03/28
1500
近期作业总结(函数,递归,二进制)
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。 写⼀个史上最简单的C语⾔递归代码:
半截诗
2024/10/09
1470
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
面试宝典之二 百度算法面试题分析
备注:几天之前凌晨6点醒了,也许是心血来潮,突然想用手机记下自己当时思考的几道百度算法面试题,
张哥编程
2024/12/13
670
20道高频前端手写题(有答案)
类的继承在几年前是重点内容,有n种继承方式各有优劣,es6普及后越来越不重要,那么多种写法有点『回字有四样写法』的意思,如果还想深入理解的去看红宝书即可,我们目前只实现一种最理想的继承方式。
ccAllen23
2022/07/29
7950
前端手写面试题合集
AJAX是 Asynchronous JavaScript and XML 的缩写,指的是通过 JavaScript 的 异步通信,从服务器获取 XML 文档从中提取数据,再更新当前网页的对应部分,而不用刷新整个网页。
helloworld1024
2022/12/14
5550
LeetCode-面试题17-打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
benym
2022/07/14
4250
腾讯前端手写面试题及答案
函数柯里化概念: 柯里化(Currying)是把接受多个参数的函数转变为接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术。
helloworld1024
2022/12/19
6710
java 算法题 - 面试中常见的位操作算法题
上一篇博客 聊一聊 Android 中巧妙的位操作 中,我们讲解了 java 中常用的位运算及常用应用场景,今天,让我们一起来看一下,面试中常见的位操作的算法题。
程序员徐公
2018/12/28
7510
前端二面手写面试题总结3
event bus既是node中各个模块的基石,又是前端组件通信的依赖手段之一,同时涉及了订阅-发布设计模式,是非常重要的基础。
helloworld1024
2023/01/05
7930
推荐阅读
相关推荐
函数的递归调用(零基础理解递归)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档