当前位置:网站首页>害怕重构?都怪我太晚和你介绍该如何重构,现在我来了
害怕重构?都怪我太晚和你介绍该如何重构,现在我来了
2020-11-09 22:37:00 【Java架构师联盟】
前几天偶然看到一位网友发的内容,说是老系统改了一行代码就崩溃了,着实令人头秃。越是成功的公司,越是有大堆的老系统和无法统计的遗留代码,尤其是基础服务相关的代码,那简直是按下葫芦浮起瓢的现实版本。创业公司倒是好一点,没有历史包袱。我们也经常重构老旧代码,不为别的,就是怕放太久发霉。恰好最近也在做系统重构,总结下我们在做的事情和一些技巧。
代码也会发霉
会发霉的不只是食物,代码也会。我们通常称为腐化。腐化的过程每天都在发生,一个紧急需求,一个新同事加入,一个变态的问题修复,一个共建项目,等等。腐化,是永远无法避免的,就像宇宙的熵增不可逆一样。面对腐化,架构师往往会加上一个防腐层。如果你的系统还没有防腐层,赶紧考虑考虑。即便有防腐层,也招架不住岁月的摧残,就像头上那日渐稀少的秀发,这就是命啊。
所以,我们需要重构。逆熵增需要做大量的功,要对混乱的代码重新梳理,使其恢复条理清晰、架构分明的优良状态。
梳理,还是梳理
重构前花大量时间对历史逻辑做梳理,而且要细致。古人曰“工欲善其事,必先利其器”。梳理好的逻辑就是重构的指路明灯。哪些要丢弃,哪些要优化,哪些要重构,哪些要产品重新定,哪些是风险点,在梳理好后就基本明了了。梳理带来的不只是逻辑的浮现,可能还有架构的方向。通过梳理,能够明确发现业务逻辑,甚至可以定义出新的领域模型、值、事件等。想想银河纪元时代,拿着银河系实时星图作战,就知道梳理有多重要了。
回放,对比变化
重构之后,测试要全面覆盖。这时候,回放就非常重要了。阿里也开源了一个回放工具 jvm-sandbox-repeater。GitHub 地址https://github.com/alibaba/jvm-sandbox-repeater。通过回放,可以在预发环境 debug 线上问题,可以看到线上真实流量在预发环境的实际表现。通过对比,可以发现重构后哪些地方和之前不一样了,尤其是页面渲染和持久化的数据。
回放做好以后,还可以作为日常发布的快速验证。只要本次回放和上次正常回放差异不大,基本上风险就已经很小了。
架构,以终为始
既然做重构了,架构方面就要好好设计。尽量摒弃错综复杂的历史逻辑,设计新的架构方案。以提高研发效率、降低维护成本为最终目标,所有的重构设计都围绕着这个目标展开。没有什么是不能改的,如果不能,那就加两个更牛逼的程序员。如果重构后还保留一坨屎一样的遗留代码,真不知道重构的意义是什么。重构就是要以终为始,在新的架构设计中,让遗留代码重新投胎以获得新的生命。
改善,代码重构
优秀的程序员是需要不定期对已有代码做或多或少的重构的。在《重构 改善既有代码的设计》一书中,作者已经给了很多重构的具体方法。重复代码抽出、过长函数拆分、模型重新设计、封装字段、封装集合、以State/Strategy取代类型码、方法移动位置等诸多技巧,这里就不展开了。我觉得每个程序员都应该好好学习下这本书,然后深入实践下代码级重构。正如书评所说“虽不应翻着重构手册干活,但需对本书中提到的70多个重构方法成竹在胸”。
速度,速战速决
遗留代码很多已经像网贷一样了,越陷越深。投入资源做重构所获得的回报,实际上比继续维护老代码高的多。重构的过程要快,过程中日常需求尽量暂停。重构的工作量很大,但是对速度要求也很高。如果一边重构,一边线上还在做需求变更,很可能陷入困境,甚至在重构后丢失线上逻辑。梳理做好了,回放做好了,程序员就可以按照计划快速重构,多上几个人,确保快速完成。
心态,胆大心细
前面的工作都做好了,那接下来就是干了。
放心大胆地干,不要怂。这段代码看不懂怎么办,改!看回放。这段代码又臭又硬怎么办,改!看回放。
改的时候,也要心细一点,好好理解下原有的业务逻辑。在战略上藐视敌人,也要在战术上重视敌人。做好 code review,让了解的人一起看改动,或者团队成员一起把把关。
为此,像大家推荐这本书籍---《重构》,这里也分享给大家
适应人员
本书的目标读者是专业程序员,也就是那些以编写软件为生的人。书中的示例和讨论,涉及大量需要详细阅读和理解的代码。这些例子都以Java写成。之所以选择Java,因为它是一种应用范围愈来愈广的语言,而且任何具备C语言背景的人都可以轻易理解它。Java是一种面向对象语言,而面向对象机制对于重构有很大帮助。
尽管关注对象是代码,但重构对于系统设计也有巨大影响。资深设计师和架构师也很有必要了解重构原理,并在自己的项目中运用重构技术。最好是由老资格、经验丰富的开发人员来引入重构技术,因为这样的人最能够透彻理解重构背后的原理,并根据情况加以调整,使之适用于特定工作领域。如果你使用的不是Java,这一点尤其重要,因为你必须把我给出的范例以其他语言改写。
下面我要告诉你,如何能够在不通读全书的情况下充分用好它。
如果你想知道为什么应该重构,请阅读前两章。它们告诉你重构是什么以及为什么应该重构。
第1章重构,第一个案例
第2章重构原则
如果你想知道该在什么地方重构,请阅读前5章。它会告诉你一些代码特征,这些特征指出“这里需要重构”。
第3章代码的坏味道
第4章构筑测试体系
第5章重构列表
第6章重新组织函数
第7章在对象之间搬移特性
第8章重新组织数据
第9章简化条件表达式
第10章简化函数调用
第11章处理概括关系
第12章大型重构
需要这份资料的,关注+转发后,私信”资料“即可查看获取方式
如果你想着手进行重构,从第5章延伸至第12章。它不能说是一份全面的列表,只是一个起步,其中包括迄今为止我在工作中整理下来的所有重构手法。我希望这是值得你日后一再回顾的部分。一开始只需概略浏览列表,看看其中有些什么,不必理解所有细节。一旦真正需要实施某个准则,再详细阅读它,从中获取帮助。列表部分是供查阅的参考性内容,你不必一次就把它全部读完。
此外你还应该读一读列表之后其他作者的“客串章节”,特别是第15章。
第13章重构,复用与现实
第14章重构工具
第15章总结
所谓**重构(refactoring)**是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构。重构是一种经千锤百炼形成的有条不紊的程序整理方法,可以最大限度地减少整理过程中引入错误的几率。本质上说,重构就是在代码写好之后改进它的设计。
好啦,需要这份资料的,关注+转发后,点击这里即可查看资料获取方式
版权声明
本文为[Java架构师联盟]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4472036/blog/4710337
边栏推荐
- 迅为IMX6ULL开发板C程序调用shell
- 如何运用二分查找算法
- Leetcode 49 letter heterotopic word grouping
- 低功耗蓝牙单芯片为物联网助力
- Configure the NZ date picker time selection component of ng zerro
- Expect ':' at 0, actual = (JSON conversion exception resolution)
- 没有磁盘空间 No space left on device
- Apache Hadoop的重要组成
- Interviewer: what are cache penetration, cache avalanche and cache breakdown?
- 传统采购模式已变!汽车采购职能该如何创新?
猜你喜欢
Jingtao project Day10
你了解你的服务器吗、你知道服务器的有哪些内幕吗
骚操作!嵌套 JSON 秒变 Dataframe!
[graffiti Internet of things footprint] graffiti cloud platform interface description
2018中国云厂商TOP5:阿里云、腾讯云、AWS、电信、联通 ...
Can public IP address and SSL certificate improve SEO?
Configure the NZ date picker time selection component of ng zerro
JS deep copy
Application of V7 version of lvgl Library
如何用代码上传头像,并添加自己的版权信息?
随机推荐
sql 截取数据中 ‘.’的前后数据
YoMo Codec - Y3的性能评测报告
LinkedList源码简析
【科创人】Rancher江鹏:从清华工程物理学硕士到云计算开源创业者
Operation and design of rights management in ERP
Realization of commodity backstage system
eleven point nine
[最佳实践]了解 Eolinker 如何助力远程办公
说说 C# 9 新特性的实际运用
正式班D25
jt-京淘项目
ES6, ES7, es8 Learning Guide
Software engineering in code -- source code analysis of menu project
SRM系统是什么系统?SRM供应商管理系统功能
Hot update scheme of Chrome extension program: 2. Based on double cache update function module
【涂鸦物联网足迹】涂鸦云平台接口说明
刚毕业都会迷茫,我经过7年总结,送给程序员的你们7点建议
sql 筛选查询重复列
探访2020 PG技术大会
It will be 2021. What is the modern C + + worth learning?