好的重构方法才能摆脱“屎山”
共 3653字,需浏览 8分钟
·
2020-12-12 03:06
这里是Z哥的个人公众号
每周五11:45 按时送达
当然了,也会时不时加个餐~
我的第「171」篇原创敬上
重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。 重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。 《重构》Martin Fowler
有很多客观因素导致了就算发现了坏代码,也不一定有充足的时间来修改。
不同的人代码水平不一,一个人看起来没毛病的代码,可能在其他人眼里却是需要重构的代码。
增加新功能的时候。此时,你发现既有的代码无法让你轻松添加新特性,需要花30%以上的时间做一些重复性的编码。
修bug的时候。此时,你发现排查逻辑非常困难,需要花费半小时甚至是数小时才能搞清楚代码在处理什么。
当从优秀的程序员口中说出觉得某段的代码写的太shit。(普通人的shit可能是到了无可救药的地步了,优秀的人觉得shit大概率还有救,否则他估计就离职不干了~)
始终工作。这其实也是《重构》中提到的理念,“「不改变软件可观察行为」的前提下”。如果你的重构需要大刀阔斧的进行,会导致很长一段时间软件无法运行起来,那么这就不是一个好的重构方式,因为在很长一段时间里你都不知道它会不会走向万劫不复的“深渊”。(有没有遇到过越重构越糟糕的经历?欢迎分享你的吐槽)
持续集成:很多人会将重构单独作为一个版本去做,其实这样会有一个新的问题,就是后续合版本是个痛苦的事情,而且容易出错。所以,应该就在平时的版本里去做重构,让每一次重构都可以跟着CI/CD持续进行。
随时中止:不管你的重构代码写到什么阶段,只要编译不报错就可以随时中止,立马切换到功能开发。只有达到这个标准,你的Leader才不会对重构又爱又恨。
过程可逆:假如我的重构出现了重大缺陷,它是可以快速回退的,而不需要从之前的版本当中去捞代码。毕竟,谁都无法100%保证每一次的重构都是perfect的。
参数类型尽量用强类型。弱类型的返回值虽然让你的Function向后兼容性很好,但是也带来了很多无法在编译期间被发现的问题。
不返回不需要的参数。添加更多参数在最初肯定是为了“跑在业务前面”,但这份好心往往最终带来的是更多“意料之外的耦合”,导致后续的重构成本大增。
将相同逻辑的代码抽离并封装到一处,可以避免在多个方法体里增加圈复杂度,只在一个方法体里增加。
通过AOP技术,不但可以将重复的代码剔除出当前方法体,还可以将try...catch之类的代码剔除出去,以降低复杂度。
通过一些语法糖或者框架,也可以降低复杂度。如,lambda表达式。
……
增加一个功能或者接口的时间是不是缩短了?
测试那边回归测试的平均时间是不是缩短了?
……
始终工作
持续集成
随时中止
过程可逆
推荐阅读:
原创不易,如果你觉得这篇文章还不错,就「在看」或者「分享」一下吧。鼓励我的创作 :)
如果你有关于软件架构、分布式系统、产品、运营的困惑
可以试试点击「阅读原文」