代码重构:解读重构概念及重构实战
目录
一.重构是什么(what)
1.重构的本质
2.重构≠性能优化
二.重构的目的(why)
1.去写好的代码
2.去写更灵活的代码
三.重构的时机(when and where)
1.何时重构
2.何时不重构
四.重构的方法(how)
1.重构关键核心
2.重构方法
3.重构工具
小结
一.重构是什么(what)
重构(refactoring):在不改变代码外在行为的前提下,对代码作出修改,以改进程序的内部结构。
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基础知识会更好理解。
本文不得用以任何商业活动,仅供学习使用。
相关文章:
代码重构:解读重构概念及重构实战
目录 一.重构是什么(what) 1.重构的本质 2.重构≠性能优化 二.重构的目的(why) 1.去写好的代码 2.去写更灵活的代码 三.重构的时机(when and where) 1.何时重构 2.何时不重构 四.重构的方法(how) 1.重构关键核心 2.重构方法 3.重构工具 小结 一.重构是什么(what)…...
java.util.Optional类介绍
java.util.Optional 是 Java 8 引入的一个容器类,用于表示可能包含或不包含非空值的对象。它的设计初衷是为了减少程序中的空指针异常(NullPointerException),并使代码更加简洁和易读。 Optional 类的介绍 1. 特点 避免显式的 null 检查:使用 Optional 可以避免显式的 n…...
PhotoShop自动生成号码牌文件
1、说明 设计卡牌的时候,遇到自动生成编号,从01500到-02500,一个一个的手写,在存储保存成psd格式的文件,会很耗时。 下面将介绍如何使用ps自动生成psd格式的文件 2、使用excle生成数字 从01500到-02500 第一步&…...
02逻辑代数与硬件描述语言基础
2.1 逻辑代数(简单逻辑的运算) 2.2 逻辑函数的卡诺图(从图论的角度)化简法 2.3 硬件描述语言Verilog HDL基础(研究生阶段才用得到) 要求: 1、熟悉逻辑代数常用基本定律、恒等式和规则。 2、掌握…...
OpenGL3.3_C++_Windows(21)
抗锯齿 遇到模型边缘有锯齿:光栅器将顶点数据转化为片段的方式有关 抗锯齿:产生更平滑的边缘SSAA超采样抗锯齿:使用比正常分辨率更高的分辨率,来渲染场景,它也会带来很大的性能开销。 光栅器: 位于最终处…...
clickhouse学习
ClickHouse学习 安装部署 1.下载rpm文件 下载地址:https://packages.clickhouse.com/rpm/stable/ clickhouse-client-23.2.1.2537.x86_64.rpm clickhouse-common-static-23.2.1.2537.x86_64.rpm clickhouse-common-static-dbg-23.2.1.2537.x86_64.rpm clickhous…...
MySQL高级-索引-使用规则-前缀索引
文章目录 1、前缀索引2、前缀长度3、查询表数据4、查询表的记录总数5、计算并返回具有电子邮件地址(email)的用户的数量6、从tb_user表中计算并返回具有不同电子邮件地址的用户的数量7、计算唯一电子邮件地址(email)的比例相对于表…...
外星生命在地球的潜在存在:科学、哲学与社会的交织
外星生命在地球的潜在存在:科学、哲学与社会的交织 摘要:近年来,关于外星生命是否存在的讨论日益激烈。有研究表明,外星人可能已经在地球漫步,这一观点引发了广泛的科学、哲学和社会学思考。本文将从科学角度探讨外星…...
使用FRP 0.58版本进行内网穿透的详细教程
什么是FRP? FRP(Fast Reverse Proxy)是一款高性能的反向代理应用,主要用于内网穿透。通过FRP,您可以将内网服务暴露给外网用户,无需进行复杂的网络配置。 准备工作 服务器:一台具备公网IP的服…...
0000电子技术基础概述
数电 未来课的基础 以前是模块、器件级 现在是 系统级 价格、性能、 技术更新快速的好处:得到了实惠 坏处:工程师需要不断地学习,不变就容易out,要用发展的眼光看待问题 了解基础知识、还要有前沿概念。 理论课、实践课要相结…...
vscode+platformio使用STC官方库进行51单片机开发 -- 中断异常
问题描述 在进行STC8H1K08单片机的开发时,使用官方提供的C语言库函数,在vscodeplatformio开发环境下发现库函数的串口中断异常,看起来像是中断没有触发。 解决过程 用串口中断时一直没有触发中断,起初没有怀疑是中断的问题&…...
探索Android架构设计
Android 应用架构设计探索:MVC、MVP、MVVM和组件化 MVC、MVP和MVVM是常见的三种架构设计模式,当前MVP和MVVM的使用相对比较广泛,当然MVC也并没有过时之说。而所谓的组件化就是指将应用根据业务需求划分成各个模块来进行开发,每个…...
基于matlab的不同边缘检测算子的边缘检测
1 原理 1.1 边缘检测概述 边缘检测是图像处理和计算机视觉中的基本问题,其目的在于标识数字图像中亮度变化明显的点。这些变化通常反映了图像属性的重要事件和变化,如深度不连续、表面方向不连续、物质属性变化和场景照明变化等。边缘检测在特征提取中…...
CentOS安装ntp时间同步服务
CentOS安装ntp时间同步服务 安装ntp 检查服务器是否安装ntp: rpm -q ntp安装ntp: yum install -y ntp服务端配置 配置文件路径:/etc/ntp.conf 设置ntp为开机启动 systemctl enable ntpd查看ntp开机启动状态 enabled:开启, disabled:关闭 …...
【Linux进阶】UNIX体系结构分解——操作系统,内核,shell
1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。 从广义上…...
PageOffice国产版在线编辑word文件
PageOffice国产版支持统信UOS、银河麒麟等国产操作系统。调用客户端WPS在线编辑word、excel、ppt等文件。在线编辑效果与本地WPS一致。如图所示: web系统集成pageofficeV6.0国产版的文档:PageOfficeV6.0国产版最简集成代码(Springboot) PageOffice最简集…...
Bitmap位图数据排列方式
读取dicom C# 使用fo-dicom操作dicom文件-CSDN博客 创建位图 通过读取dicom得到像素内存,本例单指彩色图像。 Bitmap dataBmp new Bitmap(imageWidth, imageHeight, stride, PixelFormat.Format24bppRgb, dstBmp); 当像素的内存按照RGB的排列模式时,…...
重磅消息:ONLYOFFICE8.1版本桌面编辑器发布:功能完善的 PDF 编辑器、幻灯片版式、改进从右至左显示、新的本地化选项等
目录 ONLYOFFICE介绍 PDF 编辑器 功能全面的 PDF 编辑器 文本编辑 页面处理 (添加、旋转、删除) 插入和调整各种对象,例如表格、形状、文本框、图像、TextArt、超链接、方程等。 此外 PDF 表单 文本文档编辑器更新内容 页面颜色 页面…...
16进制数按位修改
16进制数需要按位修改,特别是在修改寄存器的时候 16进制数转换为2进制 #16进制数转换为2进制 def hex_to_binary(hex_value):return bin((hex_value))二进制数转换为列表 def bin_to_array(bin_str):integer = int(bin_str, 2)array...
深度神经网络——什么是小样本学习?
引言 小样本学习是指使用极少量的训练数据来开发人工智能模型的各种算法和技术。小样本学习致力于让人工智能模型在接触相对较少的训练实例后识别和分类新数据。小样本训练与训练机器学习模型的传统方法形成鲜明对比,传统方法通常使用大量训练数据。小样本学习是 主…...
送物机器人电子方案定制
这是一款集娱乐、教育和互动于一身的高科技产品。 一、它的主要功能包括: 1. 智能对话:机器人可以进行简单的对话,回答用户的问题,提供有趣的互动体验。 2. 前进、后退、左转、右转、滑行:机器人可以通过遥控器或AP…...
chatgpt: linux 下用纯c 编写一按钮,当按钮按下在一新窗口显示本机主目录下图片子目录中的1.jpg图片
tmd,这chatgpt太强大了。 从下面的c程序与python程序对比,纯c的ui编程也不是太复杂。 再说一次,要想学好编程必须要用上这个chatgpt工具。 在 Linux 环境下使用纯 C 语言编写一个按钮,当按钮按下时,在一个新窗口中显示本机主目…...
SherlockChain:基于高级AI实现的智能合约安全分析框架
关于SherlockChain SherlockChain是一款功能强大的智能合约安全分析框架,该工具整合了Slither工具(一款针对智能合约的安全工具)的功能,并引入了高级人工智能模型,旨在辅助广大研究人员针对Solidity、Vyper和Plutus智…...
MySQL中Explain执行计划各参数的含义
EXPLAIN 语句输出的各个列的作用先大致罗列一下: 列名 描述 id 在一个大的查询语句中每个SELECT关键字都对应一个唯一的id select_type SELECT关键字对应的那个查询的类型 table 表名 partitions 匹配的分区信息 type 针对单表的访问方法 possible_keys…...
Redis队列自研组件
背景 年初的时候设计实践过一个课题:SpringBootRedis实现不重复消费的队列,并用它开发了一个年夜饭下单和制作的服务。不知道大家还有没有印象。完成这个课题后,我兴致勃勃的把它运用到了项目里面,可谁曾想,运行不久后…...
ArchLinux挑战安装(ZFS、Wayland、KDE、xero)
目录 0. 前言: 1. 先期准备 1.1 引导ArchLinx光盘。 1.2 禁用 reflector 服务 1.3 防止网卡禁用 1.4 wifi设置 1.5 测试网络是否连接 1.6 更新系统时间 1.7 更换源 1.8 下载ZFS模块 1.9 加载ZFS模块 2. 磁盘处理 2.1 查看磁盘分区 2.2 清除与整个磁盘…...
纯css写一个动态圣诞老人
效果预览 在这篇文章中,我们将学习如何使用CSS来创建一个生动的圣诞老人动画。通过CSS的魔力,我们可以让圣诞老人在网页上摇摆,仿佛在向我们招手庆祝圣诞节和新年。 实现思路 实现这个效果的关键在于CSS的keyframes动画规则以及各种CSS属性…...
百度Apollo的PublicRoadPlanner一些移植Ros2-foxy的思路(持续更新)
如今的PublicRoadPlanner就是之前耳熟能详的EM planner 计划 —— ROS2与CARLA联合仿真 结构化场景: 规划算法:EM-planner 控制算法:MPC和PID 非结构化场景: 规划算法采用Hybrid A* (1)小车模型搭建(计划参考Github上Hybrid上的黑车,比较炫酷) (2)车辆里程计: 位…...
Linux内存管理(七十三):cgroup v2 简介
版本基于: Linux-6.6 约定: 芯片架构:ARM64内存架构:UMACONFIG_ARM64_VA_BITS:39CONFIG_ARM64_PAGE_SHIFT:12CONFIG_PGTABLE_LEVELS :31. cgroup 简介 术语: cgroup:control group 的缩写,永不大写(never capitalized); 单数形式的 cgroup 用于指定整个特性,也用…...
c++习题01-ljc的暑期兼职
目录 一,题目描述 二,思路 三,伪代码 四,流程图 五,代码 一,题目描述 二,思路 1,根据题目要求需要声明4个变量:a,b,c,d ;牛奶价格a,活动要求b&…...
济南网站设计公司富/网站关键词优化排名软件
自定义学习率代码可以加快训练的速度,下面是代码的内容和学习率的截图。 import matplotlib.pyplot as plt def lrfn(epoch):LR_START 0.00001LR_MAX 0.00005 *8#* strategy.num_replicas_in_syncLR_MIN 0.00001LR_RAMPUP_EPOCHS 5LR_SUSTAIN_EPOCHS 5LR_EXP_…...
做网站总结作文/广州seo教程
In this article, we will learn how to integrate and play a video using YouTube API in Android with Kotlin.在本文中,我们将学习如何在带有Kotlin的Android中使用YouTube API集成和播放视频。 The YouTube Android Player API enables you to incorporate vi…...
虹桥做网站/seo是什么职业做什么的
配置方法 在官方找到两种配置方法: 方法1 文档地址1 方法2 文档地址2 在这里推荐使用第二种方法。 在使用第一种方法时因为修改 /* package.json */ "scripts": { - "start": "react-scripts start","start": "rea…...
wordpress模板淘宝客模板/小说搜索风云榜
表面看起来,如今是以太坊的至暗时刻,而黎明前往往是最黑暗的。种种迹象表明,ETH 2.0 或许会成为以太坊下一个爆发点。文 | 秦晓峰 运营 | 盖遥 编辑 | 卢晓明出品 | Odaily星球日报(ID:o-daily)作为最早的…...
广州 餐饮 网站建设/seo网站关键词优化方式
实验室通风柜在实验室中起到了决定性的作用,因为这关系到实验室内的环境是不是遭到破坏,实验室人员的身体健康问题等。那么通常在实验过程中,一些化学实验可能会导致一些粉尘及有害气体的出现,即使在我们做好防护的同时࿰…...
怎么制作网站小游戏/seo公司 杭州
如何搭建知识付费系统?如何搭建一个知识付费课程平台知识付费一直很火爆,在这个不确定的时代,很多人已经明确知道,学习是终身的事情,也有人在说这只是在制造焦虑,但知识付费越来越火是个明确的事实。这就有…...