如何进行「小步重构」?

大家好,我是Z哥。

关于重构的文章之前也写过两篇:

  • 《接手历史悠久的老项目,干or跑?》

  • 《好的重构方法才能摆脱“屎山”》

但是这两篇主要讲的是重构的方式方法。在 Z 哥看来,除了方式和方法还有一个点对于重构这件事来说也很重要,就是如何能够实现“小步重构”。

因为只有“小步”地进行重构,才能达到那种未雨绸缪、防范于未然的效果,将风险扼杀在摇篮里。

所谓“善战者无赫赫之功”,我是非常不提倡以“憋大招”的方式在某个时期重写一个新系统的,不但风险大成本也大。

但是要实现“小步重构”,需要平时注意一些细节,下面我来分享一些我的经验。

首先,归根到底重构就是偿还技术债。所以小步重构之前我们首先要有一种比较好的方式来对待技术债。

不知道你有没有过这样的经历:

在编码实现一个功能时,发现有一个逻辑如果按照全面去考虑的话需要改动很多地方,甚至可能要推翻当前已经写过的部分代码,但是呢现在实际场景并没那么多,当前的实现已经能满足。算了,先这样吧,后续业务怎么发展还不知道呢,到时候再说。

这就是一种很常见的债务,并且这种债务很容易让人忽视,因为它并没有让你在当下做出什么曲线救国的事情,只是一种“短视”的妥协。但是这种妥协一旦多了之后,后续的迭代往往会有很多大大小小的补丁来覆盖之前没有考虑的场景,最终积重难返,因为项目难以继续维护而重写。

上面提到的“大大小小的补丁”其实就是另一种常见的债务,这些补丁往往伴随着 if-else 这种代码出现。大家也都知道,if-else 代码如果过多的话,对人的阅读是非常不友好的。

技术债还有很多,我想每个程序员其实都能识别出来。对待它们的方式不同,最终形成不同人之间工作成果的差异。

Z哥推荐你对待技术债的方式很简单。就是在代码里增加 todo,然后将清理 todo 作为一个固定的任务安排,定期进行。

记 todo 看上去是一个简单的事情,但是还是值得花点心思来提高效率的。常见的场景比如:

  1. 有一些改动需要涉及到多个地方,那么可以用某种标识(我习惯用当前时间精确到分钟)来统一标注一下,这样后续修改的时候就不会出现只改了一半导致出现 bug 的情况。

  2. 有些重构可能依赖于一些其它的改动才能进行,那么也可以把依赖的改动信息写一下,如果所依赖的地方恰好也在本项目内,还可以备注一下相关的文件名和方法名。

  3. 有些重构还可能有一些 deadline 的约束,比如需要在 xx 日期前完成,那么也可以备注一下。

我平时用的 todo 格式是:

//todo:描述需要做什么重构。(202206121536)。依赖于xxx文件中的方法xxx。需要在2022.7.30前完成

做好了备注,剩下的就是定期清理 todo 了,这个需要根据当前的工作饱和度来安排,但 Z 哥建议,哪怕非常忙,至少 1 个月要进行一次。

好了,这篇呢 Z 哥和你分享了我对小步重构这件事的看法和经验。

重构一定是小步快跑式的方式是最好的,不但可以降低风险,从长期来看所耗费的成本也是最低的。具体的做法也很简单就是记 todo 和定时清理。

关于重构的一些方式方法可以查看我之前写的两篇文章。

  • 《接手历史悠久的老项目,干or跑?》

  • 《好的重构方法才能摆脱“屎山”》

希望对你有所帮助。

对了,最后还有一个建议强烈推荐给你。就是没有调用的方法尽早删除,不要留着觉得以后可能还会用。根据我这么多年的经验来看,未来再会用到的概率微乎其微,留着反而增加了后续的代码重构成本。因为当你修改一个方法或者字段,然后通过IDE查找引用的时候,这些其实已经没有调用的方法也会被关联到。

推荐阅读:

原创不易,如果你觉得这篇文章还不错,就「点赞」或者「在看」一下吧,鼓励我的创作 :)

也可以分享我的公众号名片给有需要的朋友们。

如果你有关于软件架构、分布式系统、产品、运营的困惑

可以试试点击「阅读原文

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

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

相关文章

【BIM入门实战】Revit 2018幕墙的绘制与注意事项

一、幕墙概述 1. 定义 幕墙是建筑的外墙围护,不承重,像幕布一样挂上去,是现代大型和高层建筑常用的带有装饰效果的轻质墙体。由面板和支承结构体系组成的,可相对主体结构有一定位移能力或自身有一定变形能力、不承担主体结构所作…

微信小程序之登录

直接获取用户数据wx.getUserInfo({success: function (res) {var userInfo res.userInfoconsole.log("获取登录用户的所有信息")console.log(res.userInfo)}}) 复制代码如果用户拒绝,提示模态框,点击确定,进入设置,再次…

对象、字节流转换

数据表示时间   长度(字节)   数据类型   描述及要求平台登入时间   6        BYTE[6] (每个字节分别代表:年、月、日、时、分、秒)登入流水号 2        WORD    每登入一…

【BIM入门实战】Revit 图元分类有哪三种?Revit图元分类图文详解

Revit在项目中使用3种类型的图元:模型图元、基准图元和视图专有图元。 Revit中的图元也称为族。族包含图元的几何定义和图元所使用的参数。图元的每个实例都由族定义和控制。 1. 模型图元 模型图元表示建筑的实际三维几何图形,包括如下:墙、窗、门和屋顶,结构墙、楼板、坡…

跟益达学Solr5之solrconfig.xml配置详解

solrconfig.xml配置文件中包含了很多solr自身配置相关的参数,solrconfig.xml配置文件示例可以从solr的解压目录下找到&#xff0c;如图&#xff1a; 用文本编辑软件打开solrconfig.xml配置&#xff0c;你将会看到以下配置内容&#xff1a; Xml代码 <?xml version"1.…

.NET 7 新增速率限制 (Rate Limiting) 功能,轻松限制请求数量

前言.NET 7 内置了速率限制&#xff08;Rate Limiting&#xff09;功能&#xff0c;速率限制指的是限制可访问资源的请求数。例如数据库每分钟可以安全处理 1000 个请求&#xff0c;再多不确定会不会崩。这时就可以在应用程序中放一个速率限制器&#xff0c;规定每分钟只允许 …

Cmder集成到VS Code (新旧版设置不同)

1.55版本之前 "terminal.integrated.shell.windows": "cmd.exe","terminal.integrated.shellArgs.windows": ["/k", "d:\\cmder\\cmdermini\\vendor\\init.bat"],1.55版本之后 "terminal.integrated.profiles.windows&…

Linux Tomcat8 启动堆内存溢出

今天在部署一个开源项目的时候&#xff0c;Tomcat8启动异常&#xff0c;报错信息&#xff1a; Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: PermGen space 根据报错信息我们可以看出是堆内存不够。所以需要手动设置堆内存大小&…

【BIM入门实战】Revit视图中图元看不见的原因总结

在Revit模型设计的过程中&#xff0c;有时会提示绘制的图元不可见&#xff0c;通常情况下&#xff0c;可以采用以下三种方法让隐藏的图元显示出来。 原因一&#xff1a;视图范围 平面视图的形成是由操作平面对三维进行 水平切割的俯视图&#xff0c;如果绘制的图元不可见&…

Tabcontrol动态添加TabPage(获取或设置当前选项卡及其属性)

http://blog.csdn.net/xiongxyt2/article/details/6920575 •MultiLine 属性用true 或false来确定是否可以多行显示 •Appearance 属性设置选项卡的显示方式&#xff0c;Normal,Buttons和FlatButtons为三种不同的显示方式。 •TabPages属性设置选项卡的一系列属性&#xff0c;包…

用C#为国产智能手表写“Hello, China. ”

在此之前&#xff0c; 我写过几篇如何使用C#编写STM32程序的例子&#xff0c; 那么同样&#xff0c; ESP32下我们也可以使用C#&#xff0c;我们依然仰仗于一直在发展壮大的 .Net nanoFramework , 目前他支持的开发板越来越多 &#xff0c; 支持的芯片种类也越来越多&#xff0c…

Python将list存为csv文件

#!/usr/bin/env python # -*- encoding: utf-8 -*-import sys import json import os import pandas as pd""" description:将list存为csv文件 param {*} return {*} """staticmethod def list_to_csv(list_data, csv_file):if len(list_data) &…

【BIM入门实战】Revit入门基础知识选择题带答案解析(116题)

1、在Revit同一个界面同时打开多个视图的快捷键是( )。 A、 WT B、 WA C、 WC D、 WD 答案: A 2、Revit样板文件的后缀名是( )。 A、 .rvt B、 .rte C、 .rfa D、 .ifc 答案: B 3、标高、轴网创建的快捷键分别是( )。 A、 AL LL B、 LL GR C、 AR MM D、 LL TR 答案…

数据迁移 (选做)

1. pip install flask-migrate #Flask-Migrate 是一个数据迁移框架,需要通过Flask-script库来操作. 2. pip install flask-script #通过命令行来操作Flask 3. 新建模型更改文件&#xff1a;manage.py from flask_script import Managerfrom flask_migrate import Migrate, Mi…

Flex4项目html-template文件夹解析

每个Flex的web应用程序项目都包含一个名为html-template文件夹。这个文件夹包含HTml模板和在浏览器中运行程序的支持文件。 每当你更改保存到你的源代码&#xff0c;Flash Builder会自动重建应用程序使用的HTML模型文件并生成一个HTML包。同时&#xff0c;它把HTML模板文件夹的…

驱动之LCD的介绍与应用20170209

本文主要介绍的是LCD的介绍与应用&#xff0c;直接看个人笔记即可: 转载于:https://www.cnblogs.com/yuweifeng/p/6382551.html

.NET 序列化枚举为字符串

默认情况下&#xff0c;枚举是以其整数形式进行 JSON 序列化&#xff0c;这通常会导致与消费者应用缺乏互操作性&#xff0c;因为他们需要事先了解这些数字的实际含义。因此&#xff0c;我们希望它们在一些情况下以字符串的形式进行序列化。本文将讲解实现这一目标的各种方法。…

ArcGIS实验教程——实验四十四:ArcGIS地图浮雕效果制作完整案例教程

ArcGIS制作地图时可以制作出很多很炫的效果,比如地图阴影、地图晕渲效果、浮雕效果、三维效果等等。本实验讲解在ArcGIS中制作浮雕效果地图,效果如下所示: 扩展阅读:【ArcGIS Pro微课1000例】0016:ArcGIS Pro 2.8浮雕效果地图制图案例教程 1. 加载矢量数据 加载实验数据包…

Mysql,SqlServer,Oracle主键自动增长的设置

参考文献 http://blog.csdn.net/andyelvis/article/details/2446865 1、把主键定义为自动增长标识符类型 MySql 在mysql中&#xff0c;如果把表的主键设为auto_increment类型&#xff0c;数据库就会自动为主键赋值。例如&#xff1a; create table customers(id int auto_incre…

Chapter 3 Phenomenon——19

His unfriendliness intimidated me. 他的不友好恐吓到了我。 My words came out with less severity than Id intended. 我说出来的言辞比我打算的要不严厉一些。 我说出的话远远没有达到我所想要的充满火药味的效果。 "You owe me an explanation," I reminded him…