当前位置:网站首页>如何进行「小步重构」?
如何进行「小步重构」?
2022-07-05 04:15:00 【Zachary-Fan】
这里是Z哥的个人公众号
每周五11:45 按时送达
当然了,也会时不时加个餐~
我的第「227」篇原创敬上
大家好,我是Z哥。
关于重构的文章之前也写过两篇:
但是这两篇主要讲的是重构的方式方法。在 Z 哥看来,除了方式和方法还有一个点对于重构这件事来说也很重要,就是如何能够实现“小步重构”。
因为只有“小步”地进行重构,才能达到那种未雨绸缪、防范于未然的效果,将风险扼杀在摇篮里。
所谓“善战者无赫赫之功”,我是非常不提倡以“憋大招”的方式在某个时期重写一个新系统的,不但风险大成本也大。
但是要实现“小步重构”,需要平时注意一些细节,下面我来分享一些我的经验。
首先,归根到底重构就是偿还技术债。所以小步重构之前我们首先要有一种比较好的方式来对待技术债。
不知道你有没有过这样的经历:
在编码实现一个功能时,发现有一个逻辑如果按照全面去考虑的话需要改动很多地方,甚至可能要推翻当前已经写过的部分代码,但是呢现在实际场景并没那么多,当前的实现已经能满足。算了,先这样吧,后续业务怎么发展还不知道呢,到时候再说。
这就是一种很常见的债务,并且这种债务很容易让人忽视,因为它并没有让你在当下做出什么曲线救国的事情,只是一种“短视”的妥协。但是这种妥协一旦多了之后,后续的迭代往往会有很多大大小小的补丁来覆盖之前没有考虑的场景,最终积重难返,因为项目难以继续维护而重写。
上面提到的“大大小小的补丁”其实就是另一种常见的债务,这些补丁往往伴随着 if-else 这种代码出现。大家也都知道,if-else 代码如果过多的话,对人的阅读是非常不友好的。
技术债还有很多,我想每个程序员其实都能识别出来。对待它们的方式不同,最终形成不同人之间工作成果的差异。
Z哥推荐你对待技术债的方式很简单。就是在代码里增加 todo,然后将清理 todo 作为一个固定的任务安排,定期进行。
记 todo 看上去是一个简单的事情,但是还是值得花点心思来提高效率的。常见的场景比如:
有一些改动需要涉及到多个地方,那么可以用某种标识(我习惯用当前时间精确到分钟)来统一标注一下,这样后续修改的时候就不会出现只改了一半导致出现 bug 的情况。
有些重构可能依赖于一些其它的改动才能进行,那么也可以把依赖的改动信息写一下,如果所依赖的地方恰好也在本项目内,还可以备注一下相关的文件名和方法名。
有些重构还可能有一些 deadline 的约束,比如需要在 xx 日期前完成,那么也可以备注一下。
我平时用的 todo 格式是:
//todo:描述需要做什么重构。(202206121536)。依赖于xxx文件中的方法xxx。需要在2022.7.30前完成
做好了备注,剩下的就是定期清理 todo 了,这个需要根据当前的工作饱和度来安排,但 Z 哥建议,哪怕非常忙,至少 1 个月要进行一次。
好了,这篇呢 Z 哥和你分享了我对小步重构这件事的看法和经验。
重构一定是小步快跑式的方式是最好的,不但可以降低风险,从长期来看所耗费的成本也是最低的。具体的做法也很简单就是记 todo 和定时清理。
关于重构的一些方式方法可以查看我之前写的两篇文章。
希望对你有所帮助。
对了,最后还有一个建议强烈推荐给你。就是没有调用的方法尽早删除,不要留着觉得以后可能还会用。根据我这么多年的经验来看,未来再会用到的概率微乎其微,留着反而增加了后续的代码重构成本。因为当你修改一个方法或者字段,然后通过IDE查找引用的时候,这些其实已经没有调用的方法也会被关联到。
推荐阅读:
原创不易,如果你觉得这篇文章还不错,就「点赞」或者「在看」一下吧,鼓励我的创作 :)
也可以分享我的公众号名片给有需要的朋友们。
如果你有关于软件架构、分布式系统、产品、运营的困惑
可以试试点击「阅读原文」
边栏推荐
- Use object composition in preference to class inheritance
- 如何实现实时音视频聊天功能
- Pyqt pyside custom telescopic menu bar sharing (including tutorial)
- Technical tutorial: how to use easydss to push live streaming to qiniu cloud?
- C language course setting: cinema ticket selling management system
- JVM garbage collection
- Network layer - forwarding (IP, ARP, DCHP, ICMP, network layer addressing, network address translation)
- Special Edition: spreadjs v15.1 vs spreadjs v15.0
- How to get the first few pieces of data of each group gracefully
- Ctfshow 2022 Spring Festival welcome (detailed commentary)
猜你喜欢
Wechat applet development process (with mind map)
Threejs Internet of things, 3D visualization of farm (III) model display, track controller setting, model moving along the route, model adding frame, custom style display label, click the model to obt
American 5g open ran suffered another major setback, and its attempt to counter China's 5g technology has failed
Interview summary: This is a comprehensive & detailed Android interview guide
在线SQL转Excel(xls/xlsx)工具
JVM garbage collection
Enterprise level: spire Office for . NET:Platinum|7.7. x
Why can't all browsers on my computer open web pages
[phantom engine UE] realize the animation production of mapping tripod deployment
As soon as I write the code, President Wang talks with me about the pattern all day
随机推荐
Threejs realizes the drawing of the earth, geographical location annotation, longitude and latitude conversion of world coordinates threejs coordinates
ActiveReportsJS 3.1 VS ActiveReportsJS 3.0
Interview related high-frequency algorithm test site 3
Use of vscode software
Pyqt pyside custom telescopic menu bar sharing (including tutorial)
Un réveil de l'application B devrait être rapide
我国算力规模排名全球第二:计算正向智算跨越
【虚幻引擎UE】运行和启动的区别,常见问题分析
MySQL: view with subquery in the from clause limit
在线SQL转Excel(xls/xlsx)工具
Scheduling system of kubernetes cluster
Containerd series - what is containerd?
Threejs Internet of things, 3D visualization of factory
Judge whether the stack order is reasonable according to the stack order
About the project error reporting solution of mpaas Pb access mode adapting to 64 bit CPU architecture
在线文本行固定长度填充工具
Rome链分析
Common features of ES6
open graph协议
IronXL for . NET 2022.6