首页 > 其他分享 >[观点]重构代码的7个阶段

[观点]重构代码的7个阶段

时间:2022-12-05 10:37:11浏览次数:64  
标签:重构 完美 UT 代码 模块 重写 观点


导读:你曾去想重构一个很老的模块,但是你只看了一眼你就恶心极了。文档,奇怪的函数和类的命名,等等,整个模块就像一个带着脚镣的衣衫褴褛的人,虽然能走,但是其已经让人感到很不舒服。面对这种情况,真正的程序员会是不会认输的,他们会接受挑战认真分析,哪怕重写也在所不惜。最终那个模块会被他们重构,就像以前和大家介绍过的那些令人销魂的编程方式中的屠宰式编程一样。

下面是重构代码的几个阶段,文章译自《The 7 stages of refactoring》这篇文章。内容如下:

第一阶段——绝望

在你开始去查看你想要重构的模块的,你会觉得好像很简单,这里需要改一个类,那里需要改两到三个函数,重写几个函数,看上去没什么大不了的,一两天就搞定了。于是你着手开始重构,然后当你调整重构了一些代码,比如改了一些命名,修理了一些逻辑,渐渐地,你会发现这个怪物原来体型这么大,你会看到与代码不符甚至含糊不清的注释,完全摸不着头脑的数据结构,还有一些看似不需要方法被调了几次,你还会发现无法搞清一个函数调用链上的逻辑。你感到这个事可能一周都搞不定,你开始绝望了。

第二阶段——找最简单的做

你承认你要重构的这个模块就是一个可怕的怪物,不是一两下就可以搞定的,于是你开始着干一些简单的事,比如重新命名一下几个函数,移除一些代码的阻碍,产生几个常量来消除magic number,等等,你知道这样做至少不会让代码变得更糟糕。

第三阶段——再次绝望

但是接下来的事会让你再次撞墙。你会发现那些代码的瑕疵是些不痛不痒的事,改正这些事完全于事无补,你应该要做的事就是重写所有的东西。但是你却没有时间这么干,而这些代码剪不乱理还乱,耦合得太多,让你再一次绝望。所以,你只能部分重写那些不会花太多时间的部分,这样至少可以让这些老的代码能被更多的重用。虽然不完美,但是至少可以试试。

第四阶段——开始乐观

在你重构这个模块几天之后,不断的重构了几次,虽然你发现改善代码的进度太慢了,但此时,你已知道代码应该要被改成什么样,你在痛苦之后也锁定了那些那修改的类。是的,虽然你的时间预算已经超支,虽然要干的事比较多,但你还是充满希望,觉得那是值得的。

第五阶段——快速了结

这个时候,你知道你花了太多的时间,你感到你所面对的情况越来越让你越到不安,你明白你自己已经陷入了困境。你原本以为只需要一次简单的重构,然而现在你要面对的是重写所有的东西。你开始意识到原因是因为你是一个完美主义者,你想让代码变得完美。于是你开始在怠慢你文档,并到到一个捷径来重写老的代码,你开始采用一些简单而粗暴,快速而有点肮脏的方法。虽然不是很完美,但你就是这样去做了。然后,你开始运行测试做UT,发现UT报告上全是红色,几乎全都失败了,你恐慌了,于是快速地fix代码,然后让UT 能工作。此时,你拍拍自己胸口,说到,没问题 ,于是就反代码提交了。

第六阶段——修改大量的Bug

你的重写并不完美,虽然其过了测试,但是那些测试对于你的新的代码有点不太合适,虽然他们都没有报错,但是他们测试得范围太小了,没有覆盖到所有的情况和边界。所以,在这以后,你还需要几周的时间不得不来修改越来越多的bug,这使得你的设计在每一次quick-fix后就变得越来越难看。此时,代码已经不像你所期望的那样完美了,但你依然觉得他还是比一开始要好一些。这个阶段可能历经几个月。

第七阶段——觉悟

经过了6个月,你重写的模块又出了一个比较严重的bug。这让你重构的那个模块变得更难堪。你发现出的这个问题是和当初的设计不一致,你还发现被你重构掉的那段老的代码并不是当初看上去的那么坏,那段老的代码确实考虑到了一些你未曾考虑到的事情。这个时候,你团队里有人站出来说这个模块应该被重构或是重写,而你却不动声色地一言不发,并希望那个站出来的人能在几个月后能觉悟起来。

不知道这是不是你的经历,我经历过很多次这样的事。对于很多维护性质的项目,我几乎不敢动,那怕看到代码很不合口味。那些从来没有写过代码的敏捷咨询师一定会说用TDD或是UT可以让你的重构更有效也更容易,但我想告诉你,这种脱离实际的说法很不负责任,这就好比说—— 我在杀猪的时候遇到了一些麻烦,因为我对猪的生理结构不清楚,或是这本来就是一头畸形的猪,导致我杀的猪很难看,而伟大的敏捷咨询师却告诉我,要用一把更快更漂亮的刀。软件开发永远不是那么简单的事,杀猪也一样。

标签:重构,完美,UT,代码,模块,重写,观点
From: https://blog.51cto.com/u_11295556/5911454

相关文章

  • 不用正则,60行代码搞定高效Url重写
     在Url重写的很多方案中,都用到了正则,在页面比较少的情况下,可能看不出什么问题但页面一旦过多,正则的性能凸显,这里给出一个不需要试用正则的方案,当然......
  • JAVA 解压缩代码写法
    packagecom.chinaunicom.asset.common.utils.compress;importlombok.extern.slf4j.Slf4j;importorg.apache.commons.compress.archivers.ArchiveEntry;importorg.......
  • git命令合并分支代码
    合并步骤:例:dev分支合并到master分支1、gitcheckoutmaster             【进入要合并的分支】2、gitpull【拉......
  • 让代码帮我们写代码(一)
    Hello,大家好,又是好久不见,最近太忙了(借口)。看了下日志,有2个月没写文章了。为了证明公众号还活着,今天必须更新一下了。在我们的开发过程中,总有那么些需求是那么的变态。常......
  • 一行代码实现页面全屏黑白
     业内怎么实现css属性兼容性如何兼容IE广发行内是怎么实现的提供一段能兼容几乎所有浏览器的代码,以新对公CRM为例 1、实现页面全屏黑白的示例百度  ......
  • 代码实现中文简体转换繁体程序
    PHP版本<?phpclassutf8_chinese{private$utf8_gb2312;private$utf8_big5;private$data;publicfunction__construct($data){$this->......
  • 【计算机毕业设计】基于jsp网上书店(源代码+论文)
    网上书店系统1.需求分析。参考设计要求,及可行性的分析,我们确定了如下的需求:1.数据库设计科学合理。2.网站主页面简洁美观,可以天蓝色为主色调。3.网站主页显示各个分类的及总......
  • 工程坐标转换方法C#代码实现
    目录1.前言2.计算总体框架3.C#代码实现3.1整体类的构建3.2椭球参数赋值3.3转换1、3(大地经纬度坐标与地心地固坐标的转换)3.4投影转换3.5转换2的实现(三参数、七参数)3......
  • 代码大全1
    从本月开始,开始阅读《代码大全2》这本书,在本书的前言中作者非常简要的说明了在现在编程中所存在的问题:近年来,关于软件开发的研究,进展是非常迅速的,但是开发实践却并非如此......
  • 代码大全2
    在《代码大全2》第八章,介绍了防御式编程,防御式编程的主要思想:不是指编程时抱着防备别人批评和攻击的态度,而是建立一种永远不知道他人将如何使用你的程序的思想。我们在编写......