热门频道
推荐频道
Copyright © 1999-2020, CSDN.NET, All Rights Reserved
weixin_39629947
关注
重构 改善既有代码的设计_老旧系统重构技巧,轻松搞定遗留代码
2020-12-03 07:35:39
关注
weixin_39629947
码龄5年
前几天偶然看到一位网友发的内容,说是老系统改了一行代码就崩溃了,着实令人头秃。越是成功的公司,越是有大堆的老系统和无法统计的遗留代码,尤其是基础服务相关的代码,那简直是按下葫芦浮起瓢的现实版本。创业公司倒是好一点,没有历史包袱。我们也经常重构老旧代码,不为别的,就是怕放太久发霉。恰好最近也在做系统重构,总结下我们在做的事情和一些技巧。
代码也会发霉
会发霉的不只是食物,代码也会。我们通常称为腐化。腐化的过程每天都在发生,一个紧急需求,一个新同事加入,一个变态的问题修复,一个共建项目,等等。腐化,是永远无法避免的,就像宇宙的熵增不可逆一样。面对腐化,架构师往往会加上一个防腐层。如果你的系统还没有防腐层,赶紧考虑考虑。即便有防腐层,也招架不住岁月的摧残,就像头上那日渐稀少的秀发,这就是命啊。
所以,我们需要重构。逆熵增需要做大量的功,要对混乱的代码重新梳理,使其恢复条理清晰、架构分明的优良状态。
梳理,还是梳理
重构前花大量时间对历史逻辑做梳理,而且要细致。古人曰“工欲善其事,必先利其器”。梳理好的逻辑就是重构的指路明灯。哪些要丢弃,哪些要优化,哪些要重构,哪些要产品重新定,哪些是风险点,在梳理好后就基本明了了。梳理带来的不只是逻辑的浮现,可能还有架构的方向。通过梳理,能够明确发现业务逻辑,甚至可以定义出新的领域模型、值、事件等。想想银河纪元时代,拿着银河系实时星图作战,就知道梳理有多重要了。
回放,对比变化
重构之后,测试要全面覆盖。这时候,回放就非常重要了。阿里也开源了一个回放工具 jvm-sandbox-repeater。GitHub 地址https://github.com/alibaba/jvm-sandbox-repeater。通过回放,可以在预发环境 debug 线上问题,可以看到线上真实流量在预发环境的实际表现。通过对比,可以发现重构后哪些地方和之前不一样了,尤其是页面渲染和持久化的数据。
回放做好以后,还可以作为日常发布的快速验证。只要本次回放和上次正常回放差异不大,基本上风险就已经很小了。
架构,以终为始
既然做重构了,架构方面就要好好设计。尽量摒弃错综复杂的历史逻辑,设计新的架构方案。以提高研发效率、降低维护成本为最终目标,所有的重构设计都围绕着这个目标展开。没有什么是不能改的,如果不能,那就加两个更牛逼的程序员。如果重构后还保留一坨屎一样的遗留代码,真不知道重构的意义是什么。重构就是要以终为始,在新的架构设计中,让遗留代码重新投胎以获得新的生命。
改善,代码重构
优秀的程序员是需要不定期对已有代码做或多或少的重构的。在《重构 改善既有代码的设计》一书中,作者已经给了很多重构的具体方法。重复代码抽出、过长函数拆分、模型重新设计、封装字段、封装集合、以State/Strategy取代类型码、方法移动位置等诸多技巧,这里就不展开了。我觉得每个程序员都应该好好学习下这本书,然后深入实践下代码级重构。正如书评所说“虽不应翻着重构手册干活,但需对本书中提到的70多个重构方法成竹在胸”。
速度,速战速决
遗留代码很多已经像网贷一样了,越陷越深。投入资源做重构所获得的回报,实际上比继续维护老代码高的多。重构的过程要快,过程中日常需求尽量暂停。重构的工作量很大,但是对速度要求也很高。如果一边重构,一边线上还在做需求变更,很可能陷入困境,甚至在重构后丢失线上逻辑。梳理做好了,回放做好了,程序员就可以按照计划快速重构,多上几个人,确保快速完成。
心态,胆大心细
前面的工作都做好了,那接下来就是干了。
放心大胆地干,不要怂。这段代码看不懂怎么办,改!看回放。这段代码又臭又硬怎么办,改!看回放。
改的时候,也要心细一点,好好理解下原有的业务逻辑。在战略上藐视敌人,也要在战术上重视敌人。做好 code review,让了解的人一起看改动,或者团队成员一起把把关。
推荐阅读:
工作还好找吗?面试官的建议——阿里篇
被老程序员压榨怎么办?我不想辞职
阿里p6晋升p7是一道坎吗?p7晋升总结
百万程序员关注的话题|小公司程序员如何进入向往的大公司?
每分钟访问10万+,11种策略教你保持亿级流量网站稳定性!
点击阅读全文
打开CSDN,阅读体验更佳
makefile基础到实战编译大型C/C++项目(linux)
<p><strong style="color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 24px; background-color: #ffffff;"><span style="max-width: 100%; box-sizing: border-box; color: #ff0000;">《makefile基础到实战编译大型C/C++项目(linux)》讲师:夏曹俊</span></strong></p> <p><strong style="color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 24px; background-color: #ffffff;"><span style="max-width: 100%; box-sizing: border-box; color: #ff0000;"><img src="https://img-bss.csdnimg.cn/202108051335242356.jpg" alt="" /></span></strong></p> <p><strong style="color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 24px; background-color: #ffffff;"><span style="max-width: 100%; box-sizing: border-box; color: #ff0000;"><img src="https://img-bss.csdnimg.cn/202108011719115788.jpg" alt="" /></span></strong></p> <p><strong style="color: #333333; font-family: 'Hiragino Sans GB', 'Microsoft Yahei', arial, 宋体, 'Helvetica Neue', Helvetica, STHeiTi, sans-serif; font-size: 24px; background-color: #ffffff;"><span style="max-width: 100%; box-sizing: border-box; color: #ff0000;"><img src="https://img-bss.csdnimg.cn/202108011719226134.jpg" alt="" /></span></strong></p>继续访问
老旧系统重构技巧,轻松搞定遗留代码
作者:丁仪 来源:https://chengxuzhixin.com/blog/post/xi_tong_zhong_gou_ji_qiao_gao_ding_yi_liu_dai_ma.html 前几天偶然看到一位网友发的内容,说是老系统改了一行代码就崩溃了,着实令人头秃。越是成功的公司,越是有大堆的老系统和无法统计的遗留代码,尤其是基础服务相关的代码,那简直是按下葫芦浮起瓢的现实版本。创业公司倒是好一点,没有历史包袱。我们也经常重构老旧代码,不为别的,就是怕放太久发霉。恰好最近也在做系统重构,总.继续访问
程序如何做到代码复用,减少代码冗余,从而减少代码修改的成本?
1:尽量让一个人来写相关功能模块,不要把一个独立的模块分给多个人写代码。(不用你提醒,改多了他自己就知道优化代码,减少代码的冗余) 2:业务要清晰,业务不清晰不可避免的写冗余代码,(所以需要一个好的产品) 3:封装方法的时候,最小模块化,就是一个方法的封装,要保证这个方法就是一个最小单元,以后用于都不可能变。 4:层层封装方法。需要结合3来使用,最小模块化方法封装好后,剩下的就是组装最小模块,完成更加复杂的功能。层层封装也要求每一次封装都是一个最小单元。 如果做到上面的4点,你的代码冗余肯定可以减少很多.继续访问
系统重构之后生产数据迁移解决方案--Mysql为例
通常情况下,我们的系统在重构之后,表名、字段名都会发生不同程度的变化,如果说重构之后数据库结构变更很小,那么恭喜你,你省去了很多麻烦。但是往往实际情况事与愿违,所以此处仅记录本人导入生产数据的一些思路和步骤,以及会遇到的一些问题 方案一:Server Link(推荐) Mysql提供一种引擎叫FEDERATED,这种引擎允许我们链接其他数据库,然后通过sql命令复制其他库表到任意数据库。简单来说就类似于Navicat复制一个数据库的表到另一个数据库中去,这样相当于两个库的表都在一个库里边,导入数据就变得继续访问
前端代码重构经验总结
前端代码重构经验总结 2018年中至2019年年初,我曾参加过一次中型前端项目的代码重构。 项目原本是由jquery + vue搭建的,主要由jquery实现功能,只是引入了vue,可以用一些vue框架提供的基础功能。 vue提供了官方的命令行工具vue-cli,用于创建脚手架快速搭建vue 项目。项目组决定将项目完全基于vue框架进行重构。 重构前的分析 由于jquery的开发模式和vue的M...继续访问
什么是遗留代码:有效地处理遗留代码的8个小贴士
处理旧的而不是您自己编写的历史遗留代码将是一份苦差事。但是,除非您是从头开始一个项目,否则这是不可避免的。这意味着您需要一种更好的方式来处理遗留代码。 这就是为什么我们提供了一些指导,解释什么是遗留代码、如何有效地处理遗留代码的最佳实践,以及静态代码分析如何帮助重构代码。...继续访问
3个步骤处理和更新遗留代码
在处理遗留代码时,您需要一种可持续的方式来管理变更。使用遗留代码可能会成为敏捷和DevOps的障碍,但是您可以利用适当的技术来克服挑战。 什么是遗留代码? 许多人使用“遗留代码”一词来简单地指代旧代码。但是“旧”和“遗留”对不同的人意味着不同的事情。在这里,我将遗留代码的定义用作团队尚不了解的任何现有代码。 有关代码的知识可能不完整,原因有几个,例如: 团队从组织的另一部分获得了一个项目。 原始作者离开了团队,并与他或她一起了解了有关代码的知识。 代码提供的功能不再是业务优先级,并且保...继续访问
关于老系统的重构和优化选择
最近公司领导层脑袋发热要转java,干掉.net,所以碰到一个系统新的需求过来都要评估一下是重构还是原有的基础上修改 基于以上背景也就诞生了这篇文章:到底重构还是优化 我的建议是:工时决定一切 老系统重构会遇到2个问题: 1.业务的重新梳理 2.代码逻辑的梳理 业务的重新梳理:不用分析,大家做个系统的都明白,5年甚至10年的老系统业务梳理简直就是sheet,如果一个...继续访问
代码重构示例 1 -- 遗留项目开发之最小影响原则
最小影响原则 隔离原则 接口设计 代码重构继续访问
老旧系统改造,彻底重构还是给老系统减负?
编辑:彭文华来 源:大数据架构师(ID:bigdata_arch)周末跟一位老彭友约了在了一个景色非常优美的地方私聊,没想到一下就聊了3个多小时。跟企业实战大佬毫无保留的深入探讨一个问...继续访问
最新发布 【干货】如何重构老系统?
目录结构:一、啥是系统重构?二、为什么要系统重构?三、系统重构,要注意哪些点?四、该如何推动系统重构这件事?五、个人过往真实案例分享前言:SuperG同学的公司,最近在搞各种大翻修,但是同时里边的员工还要正常工作,于是就出现了:因为厕所要重建,所以要换楼层上厕所,因为楼梯要重修,所以只能用电梯。导致中午去撒个尿,一趟要20多分钟,造孽啊~一、系统重构是什么意思?系统重构,就是结合业务现状,重新设...继续访问
人人都能看懂系列:《分布式系统改造方案——老旧系统改造篇》
打工人打工魂,打工仔hellohello-tom上线啦🤣 tom哥真是越来越懒了,懒得动笔,有很多粉丝一直在催我更新,所以tom哥整理了一下,今天打算来场硬核输出,继续更新人人能看懂系列,文字较多,建议多读几遍 人人都能看懂系列:《分布式系统改造方案——老旧系统改造篇》。 很多同学到一家公司相信说的最多的一句话都是,窝xxxx,这什么垃圾代码,我可没办法维护,让我改的话只能推翻重写,毕竟每个人都只熟悉自己的代码,但是老板可不会让你这么轻而易举答应你的要求,尤其是项目已经正在运营,正在产生收益,很多同学只能心继续访问
遗留系统重构的模式与原则
设计模式强调为开发大规模系统提供可复用的设计指南。 —— 《反模式:危机中软件、架构和项目的重构》 就重构的基本原则来说,倒也不是很复杂: 小步前进。走一小步,提交一次代码,方便回滚,有一天你会懂的。 随时可用。如果不能保证随时可用,那就说不上是重构了。 融入日常。 当你习惯了重构,记得在日常工作中使用。 重构模式:EPDCA 我尝试从书中找到一个合适的模式,但是都没有发现符合我的步骤。...继续访问
旧Web项目重构(一)_集成maven
旧Web项目重构(一)_集成maven 为什么集成maven,旧项目集成maven过程 使用pom文件就可以管理相关依赖的版本,方便jar包升级。如果依赖冲突,idea等软件可以查看依赖关系,方便排查相关问题。 集成maven过程: 1、添加pom文件 2、添加maven相关依赖 3、修改目录结构 1、添加pom文件 <?xml version="1.0" encoding="UTF-8...继续访问
代码重构系列一
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。CSDN视频网址:http://edu.csdn.net/lecturer/144 在项目开发中,对代码经常做的事情是重构,在我的团队中,我经常审核团队写的代码并对他们的代码进行重构继续访问
重构 改善既有代码的设计——重构原则
1.何谓重构? 答: A.重构(名词意义):对软件内部结构的调整,目的是在不改变软件可观察行为的前提下,提高其理解性,降低其修改成本; B.重构(动词意义):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构; 总结:为了更容易理解和修改软件,在不改变软件功能的前提下,调整软件结构; 重构的两种思维:在软件开发的过程中,编码和重构经常会交叉,因为二者是两种不同思维方式继续访问
重构改善即有代码的设计
(一)重构原则 1、何谓重构 对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。 另一种解释是:使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。 重构不止是代码整理,它提供了一种高效且受控的代码整理技术 2、为何重构 改进软件设计:如果没有重构,程序的设计会逐渐变质,重构很像是在整理代码,你所做的就是让所有的东西回到应处的位置上。 帮...继续访问
祖传代码的重构体验
code小生,一个专注于 Android 领域的技术分享平台作者:代一鸣链接:https://www.jianshu.com/p/fe0024e6c1b8声明:本文是 代...继续访问
重构 代码重构原则 总结
重构定义 如果你发现自己需要为程序添加一个特性 而代码结构使你无法很方便地达成目的 那就先重构那个程序 使特性的添加比较容易进行 然后再添加特性 重构之前 首先检查自己是否有一套可靠的测试机制 这些测试必须有自我检验能力 重构技术就是以微小的步伐修改程序 如果你犯下错误 很容易便可发现它 任何一个傻瓜都能写出计算机可以理解的代码 唯有写出人类容易理解的代码 才是优秀的程序员 重构(名词)...继续访问
写评论评论
收藏
点赞
踩
分享