代码重构:解读重构概念及重构实战

一.重构是什么(what)

重构(refactoring):在不改变代码外在行为的前提下,对代码作出修改,以改进程序的内部结构。

1.本质上说,重构就是在代码写好之后改进他的设计

传统开发过程中是先设计,再开发,更像是瀑布开发模式。

对重构来说,更像是敏捷开发模式,是一个设计与开发小步迭代,不断持续优化的过程。

2.重构≠性能优化

相似之处:

  1. 二者都需要修改代码;
  2. 二者都不会改变程序整体功能。

差异之处:

  1. 重构目的是让代码更容易理解和便于修改,重构后程序可能会运行的更快或者更慢;
  2. 性能优化只关心程序运行的更快,不关心代码的结构和可读性问题。

二.重构的目的(why)

目的:改善代码质量。

1.去写好的代码

什么是好的代码?

代码质量优劣并无绝对的判断标准,但是会有一些行业共同认可的标准。因为对于计算机来说,只要代码能运行,编译器不会在乎代码好不好看。但是代码是在实际开发应用中会涉及到修改,交接,是要给程序员和Leader去阅读的,一旦涉及到人,就会出现了代码的可读性问题。

好的代码的检验标准就是人们是否能轻而易举地修改它。

好代码应该直截了当,有人需要修改代码时,应该能轻而易举的找到修改点,应该能更快速做出修改,而不引入其他错误。

傻瓜都能写出计算机可以理解的代码,唯有能写出人类容易理解的代码,才是优秀的程序员。

让自己的代码更健康,而不是更完美

2.去写更灵活的代码

谁也无法预测未来的事。

对于一个团队来说,应对未来的发展,以及团队人员的变更,或者领导有了新的想法,每当遇到如此事件,我们的代码就要遭罪了。

灵活性可以更变通的应对不可预知的问题。

重构后的代码结构会更清晰,可以考虑预留一些功能接口,这样等到一个新同事拿到项目工程时,他会感谢上一位老哥的。


三.重构的时机(when and where)

1.何时重构

两种情况:开发过程中和开发完成后

  • 重构的最佳时机就是在添加新功能之前。

最常遇到的情况是,待添加的新的功能也会用到之前使用的代码和数据结构,为了避免大量代码复制粘贴,消除重复代码,所以不要一直埋头苦干,而是要停下来多思考。

重构和添加新功能不能同时进行?

添加新功能时,就不应该修改既有代码,只管添加新功能;重构时就不再添加新功能,只管调整代码结构。同时进行二者会很混乱。

  • 当代码读起来不明就里时

一旦需要思考“这段代码到底在做什么”,就要自问一下,“能不能重构这段代码,令其一目了然”。

  • 有更合适的优化空间

此时代码可能能够被理解,但是写的很复杂或者有更好的优化,这种情况可以参考一些常见的优化方法,以及需要根据长期的开发项目经验来实施。

  • 在开发项目管理中约定重构时机

通常在较为严谨的项目中,每一步都有自己的流程和时间限制,那么可以在项目管理中提前设置一些重构节点,有计划的安排重构工作,或者专门安排团队来做,定期的code review也是一个共同讨论重构的好时机。

2.何时不重构

不是所有情况都需要重构的,没必要为了重构而重构,以下情况就可以不考虑重构。

  • 如果代码本身设计合理,质量过关,维护成本低,团队有着一套很稳定的管理流程,那么只要保持这样的状态就好,按照规则做好自己的事;

  • 如果代码太烂了,并且耦合程度太高,重构的成本>重写的成本,那么考虑升版代码,推倒重新设计;

  • 如果代码本身已经运行了很多年,虽然凌乱,但是不影响运行,可以考虑把一些凌乱的代码打包隐藏到一个API中,以后不用管他即可;

重构的时机在实际工作中,要取决于整个项目的安排,或者对后续维护运行的影响,以及重构工作的人力成本和时间成本。从大领导的角度来说,通常只会关心交付的内容能不能满足合同要求,能不能结项结款。但是实际上从维护公司长期发展和培养个人程序开发优良喜欢来说,重构是领导层和基层人员都要时刻去考虑的。


四.重构的方法(how)

1.重构关键核心

开展高效有序的重构,关键心得是:小步快跑,保持代码处于永远可以工作的状态,小步修改积累起来也能大大改善系统的设计。

小步快跑:无论每次重构多么简单,重构后立刻运行测试,修改完成后提交版本控制,便于回滚。

2.重构方法

这部分内容是针对实际代码如何修改的实践方法,内容比较多,我会持续更新并通过单独链接的方式呈现,参考书中的js代码,我会做改成C++或者Python来重现,请根据需要自行跳转查看

3.重构工具

重构除了我们手动的修改代码,例如使用查找/替换方式去修改名字,目前的IDE中都自带一些自动化重构工具,比如JetBrains的IntelliJ IDEA,还有Eclipse,或者是微软的Visual Studio,都或多或少具备重构功能,有了这些工具我们可以更好的更方便的进行重构,但是重构的思路还是要人来自己设计和掌握。


小结

“重构的意义不在于把代码打磨的闪闪发光,而是纯粹的要从经济角度考量”

对于软件开发工作者来说,重构在实际工作中是由经济利益驱动的,如果只是做一锤子买卖,没人愿意去干重构这件事;或者本身不是你写的代码,你的领导突然让你把他重构,又不会额外给你什么好处;只有在跟你涉及利益相关时,比如你写的代码你后面还要维护它,或者你的团队在开发时就要求了一些管理流程,或者代码由多人协作,每个人都要清理出自己的接口,以防别人代码影响自己。

在学习或科研中也是一样的,代码更重要的是得到数据结果或者分析结果,你的论文中不会粘贴大量的代码。

所以不同的岗位,不同的情况,所要进行重构工作这件事的考量不同,但是重构也是一种习惯和素养,如果他成为你开发的一种良好习惯,你总有一天会从中受益的,毕竟谁都喜欢和能写出这样代码的人打交道,养成习惯,学到手,用不用,在哪里用,到时候再说。

参考书籍:

《重构:改善既有代码的设计(第2版)》

该文是参考了上面的内容,是一篇读书笔记及总结感悟,该书的参考语言是JavaScript,作者会用代码案例贯穿讲解,会涉及一些语法上的优化,有JS基础知识会更好理解。

本文不得用以任何商业活动,仅供学习使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/32697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【b站-湖科大教书匠】2 物理层-计算机网络微课堂

课程地址:【计算机网络微课堂(有字幕无背景音乐版)】 https://www.bilibili.com/video/BV1c4411d7jb/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 2 物理层 2.1 物理层的基本概念 2.2 物理层下面的传输媒…

Android Studio 安卓手机上实现火柴人动画(Java源代码—Python)

android:layout_marginLeft“88dp” android:layout_marginTop“244dp” android:text“Python” android:textSize“25sp” app:layout_constraintStart_toStartOf“parent” app:layout_constraintTop_toTopOf“parent” /> </androidx.constraintlayout.widget.…

Python - Excel查找和替换详解 (在工作表,行,列或单元格中替换数据,替换单元格部分内容)

目录 安装Python Excel库 Python在Excel工作表中查找和替换数据 Python在Excel特定行中查找和替换数据 Python在Excel特定列中查找和替换数据 Python在Excel特定单元格区域中查找和替换数据 Python查找和替换Excel单元格的部分数据 在日常工作中&#xff0c;我们经常面临…

卤货商家配送小程序商城是怎样的模式

无论生意大小、打造品牌都是必要的一步&#xff0c;只要货品新鲜、味道高、性价比高&#xff0c;其新客转化/老客复购数量都不少&#xff0c;卤货种类多且复购多个单独/聚会场景&#xff0c;以同城主要经营&#xff0c;也有部分品牌有外地食品配送需要。 想要进一步品牌传播、…

Linux PXE高效批量装机

部署PXE远程安装服务 在大规模的 Linux 应用环境中&#xff0c;如 Web 群集、分布式计算等&#xff0c;服务器往往并不配备光驱设备&#xff0c;在这种情况下&#xff0c;如何为数十乃至上百台服务器裸机快速安装系统呢?传统的USB光驱、移动硬盘等安装方法显然已经难以满足需…

文本编辑命令和正则表达式

一、 编辑文本的命令 正则表达式匹配的是文本内容&#xff0c;Linux的文本三剑客&#xff0c;都是针对文本内容。 文本三剑客 grep&#xff1a;过滤文本内容 sed&#xff1a;针对文本内容进行增删改查 &#xff08;本文不相关&#xff09; awk&#xff1a;按行取列 &#…

电子电气架构——由NRC优先级引起的反思

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

一文详解去噪扩散概率模型(DDPM)

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

Django之云存储(二)

一、Django使用云存储 建立项目 django-admin startproject project_demo创建子应用 python manage.py startapp app_name修改配置文件,设置模板视图路径 settings.py TEMPLATES = [{BACKEND: django.template.backends.django.DjangoTemplates,DIRS: [os.path.join(BASE_DIR,…

如何在 MySQL 中导入和导出数据库以及重置 root 密码

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 如何导入和导出数据库 导出 要导出数据库&#xff0c;打开终端&#xff0c;确保你没有登录到 MySQL 中&#xff0c;然后输入以下命令&…

sd StableDiffusion库学习笔记

目录 torchmetrics准确率计算 ConsistencyDecoder DeepSpeed realesrgan BasicSR超分辨率&#xff0c;去噪&#xff0c;去模糊&#xff0c;去 JPEG 压缩噪声 segment_anything mmengine controlnet_aux accelerate transfersformer pytorch_fid einops compel tra…

Ike-scan一键发现通过互联网的IPsec VPN服务器(KALI工具系列二十八)

目录 1、KALI LINUX 简介 2、Ike-scan工具简介 3、信息收集 3.1 目标主机IP&#xff08;服务器&#xff09; 3.2 KALI的IP 4、操作示例 4.1 简单扫描 4.2 范围扫描 4.3 扫描多个目标 4.4 输出扫描结果 4.5 特殊扫描 5、总结 1、KALI LINUX 简介 Kali Linux 是一个功…

基于Vue-cli脚手架搭建项目使用ElementUI组件

项目结构 node_modules 项目依赖的外部组件文件放在此处,例如vue public index.html是对外提供的唯一的html文件 src assets 存放静态文件 例如图片 css js等文件 components 里面存放的是组件 App.vue是组件 main.js是项目配置文件 package.json存放的是项目依赖的…

IEEE RAL 具有高运动性能的仿旗鱼机器人协同运动机制研究

水下机器人作为军用侦察、监测及攻击装置备受关注&#xff0c;目前传统水下机器人普遍采用螺旋桨作为推进器&#xff0c;但高噪音、高能耗等问题限制了应用范围。鱼类通过自然选择进化出优异的运动性能&#xff0c;特别是在海洋中游动速度快、机动性强的旗鱼。为了探究快速和高…

redis持久化操作【随记】

持久化 Redis它是将数据保存到内存当中,内存里的数据最大特点: 断电易失.保存在内存的数据就没有了.如果如果这些数据还有用,业务使用啥的,不能就让它这么没有了. redis当中提供持久化机制, 说白了,将内存的数据 —-> 写入到磁盘. –> 持久化. 1 rdb方式 redis database,…

车载测试系列:CAN协议之远程帧

远程帧&#xff08;也叫遥控帧&#xff09;&#xff1a;是接收单元向发送单元请求发送具有标识符的数据所用的帧&#xff0c;由 6 个段组成&#xff0c;没有数据段。 当某个节点需要数据时&#xff0c;可以发送远程帧请求另一节点发送相应数据帧。 简单的说&#xff1a;发起方…

示例:推荐一个基于第三方开源控件库DataGridFilter封装的FilterColumnDataGrid,可以像Excel拥有列头筛选器

一、目的&#xff1a;基于第三方开源控件库DataGridFilter封装的FilterColumnDataGrid&#xff0c;可以像Excel拥有列头筛选器&#xff0c;感兴趣的可以去下方链接地址查看开源控件库地址。本控件封装的目的在于将第三方库的皮肤和样式封装到皮肤库中可统一设置样式&#xff0c…

【Python Cookbook】S03E01 对数值进行取整 int() round() math.ceil() math.floor() 函数

目录 问题解决方案int 函数round 函数math.floor() 函数math.ceil() 函数 讨论&#xff08;1&#xff09;参数 ndigits 可以为负数&#xff08;2&#xff09;不要与格式化混为一谈&#xff08;3&#xff09;精度上有需求请选择 decimal 在 Python 中对整数和浮点数进行数学计算…

hdfs java客户端使用,文件上传下载,预览的实现

1. 环境部署 1.1 Linux hadoop集群搭建 Hadoop大数据集群搭建&#xff08;超详细&#xff09;_hadoop集群搭建-CSDN博客 1.2 windows hadoop util 安装 Hadoop——Windows系统下Hadoop单机环境搭建_hadoop windows开发环境搭建-CSDN博客 1.3 温馨提示&#xff0c;如果要使用ja…

QT中QSettings的使用系列之三:QSettings操作注册表

1、核心代码 #include "widget.h" #include "ui_widget.h" #include <QSettings> #include <QDebug>Widget::Widget