导读:你曾去想重构一个很老的模块,但是你只看了一眼你就恶心极了。文档,奇怪的函数和类的命名,等等,整个模块就像一个带着脚镣的衣衫褴褛的人,虽然能走,但是其已经让人感到很不舒服。面对这种情况,真正的程序员会是不会认输的,他们会接受挑战认真分析,哪怕重写也在所不惜。最终那个模块会被他们重构,就像以前和大家介绍过的那些令人销魂的编程方式中的屠宰式编程一样。
下面是重构代码的几个阶段,文章译自《The 7 stages of refactoring》这篇文章。内容如下:
第一阶段——绝望
在你开始去查看你想要重构的模块的,你会觉得好像很简单,这里需要改一个类,那里需要改两到三个函数,重写几个函数,看上去没什么大不了的,一两天就搞定了。于是你着手开始重构,然后当你调整重构了一些代码,比如改了一些命名,修理了一些逻辑,渐渐地,你会发现这个怪物原来体型这么大,你会看到与代码不符甚至含糊不清的注释,完全摸不着头脑的数据结构,还有一些看似不需要方法被调了几次,你还会发现无法搞清一个函数调用链上的逻辑。你感到这个事可能一周都搞不定,你开始绝望了。
第二阶段——找最简单的做
你承认你要重构的这个模块就是一个可怕的怪物,不是一两下就可以搞定的,于是你开始着干一些简单的事,比如重新命名一下几个函数,移除一些代码的阻碍,产生几个常量来消除magic number,等等,你知道这样做至少不会让代码变得更糟糕。
第三阶段——再次绝望
但是接下来的事会让你再次撞墙。你会发现那些代码的瑕疵是些不痛不痒的事,改正这些事完全于事无补,你应该要做的事就是重写所有的东西。但是你却没有时间这么干,而这些代码剪不乱理还乱,耦合得太多,让你再一次绝望。所以,你只能部分重写那些不会花太多时间的部分,这样至少可以让这些老的代码能被更多的重用。虽然不完美,但是至少可以试试。
第四阶段——开始乐观
在你重构这个模块几天之后,不断的重构了几次,虽然你发现改善代码的进度太慢了,但此时,你已知道代码应该要被改成什么样,你在痛苦之后也锁定了那些那修改的类。是的,虽然你的时间预算已经超支,虽然要干的事比较多,但你还是充满希望,觉得那是值得的。
第五阶段——快速了结
这个时候,你知道你花了太多的时间,你感到你所面对的情况越来越让你越到不安,你明白你自己已经陷入了困境。你原本以为只需要一次简单的重构,然而现在你要面对的是重写所有的东西。你开始意识到原因是因为你是一个完美主义者,你想让代码变得完美。于是你开始在怠慢你文档,并到到一个捷径来重写老的代码,你开始采用一些简单而粗暴,快速而有点肮脏的方法。虽然不是很完美,但你就是这样去做了。然后,你开始运行测试做UT,发现UT报告上全是红色,几乎全都失败了,你恐慌了,于是快速地fix代码,然后让UT 能工作。此时,你拍拍自己胸口,说到,没问题
,于是就反代码提交了。
第六阶段——修改大量的Bug
你的重写并不完美,虽然其过了测试,但是那些测试对于你的新的代码有点不太合适,虽然他们都没有报错,但是他们测试得范围太小了,没有覆盖到所有的情况和边界。所以,在这以后,你还需要几周的时间不得不来修改越来越多的bug,这使得你的设计在每一次quick-fix后就变得越来越难看。此时,代码已经不像你所期望的那样完美了,但你依然觉得他还是比一开始要好一些。这个阶段可能历经几个月。
第七阶段——觉悟
经过了6个月,你重写的模块又出了一个比较严重的bug。这让你重构的那个模块变得更难堪。你发现出的这个问题是和当初的设计不一致,你还发现被你重构掉的那段老的代码并不是当初看上去的那么坏,那段老的代码确实考虑到了一些你未曾考虑到的事情。这个时候,你团队里有人站出来说这个模块应该被重构或是重写,而你却不动声色地一言不发,并希望那个站出来的人能在几个月后能觉悟起来。
不知道这是不是你的经历,我经历过很多次这样的事。对于很多维护性质的项目,我几乎不敢动,那怕看到代码很不合口味。那些从来没有写过代码的敏捷咨询师一定会说用TDD或是UT可以让你的重构更有效也更容易,但我想告诉你,这种脱离实际的说法很不负责任,这就好比说——
我在杀猪的时候遇到了一些麻烦,因为我对猪的生理结构不清楚,或是这本来就是一头畸形的猪,导致我杀的猪很难看,而伟大的敏捷咨询师却告诉我,要用一把更快更漂亮的刀。软件开发永远不是那么简单的事,杀猪也一样。
分享到:
相关推荐
10. **软件生命周期管理**:从需求分析到系统维护,每个阶段都有其特定的代码编写考量。书中阐述了如何在不同阶段应用最佳实践,确保软件在整个生命周期内的健康状态。 以上是对《代码大全》电子版1.01中的核心知识...
然而,Jack Reeves的观点却直指核心,认为在所有这些文档中,唯有源代码能够承载并体现软件设计的全部精髓。他指出,工程过程的最终产物并非实物,而是文档,而在这个过程中,源代码不仅是最终的文档,也是最真实的...
博客系统是一种基于Web的个人信息发布平台,它允许用户创建、编辑和发布个人文章,与他人分享观点和信息。...对于初学者来说,可以按照源代码逐步理解每个部分的功能,进而重构或扩展出更个性化的博客系统。
- **重构技术**:介绍如何安全地改进现有代码而不改变其外部行为的方法。 - **单元测试**:强调单元测试在确保代码质量和可维护性方面的作用。 #### 3. 设计模式与原则 - **常用设计模式**:如单例模式、工厂模式等...
在 SA 上执行重构时面临的第一个问题是缺乏支持自动或半自动重构的适当工具。 用于描述 SA 的域和观点的多样性增加了 ADL 的数量和可以描述 SA 的方式。 不能现实地希望为所有不同的 ADL 设计重构
7. **数据存储和加载**:游戏进度、用户设置或其他关键数据可能在这个阶段实现保存和加载功能。 8. **错误处理和调试**:为了确保代码的稳定性和可维护性,会加入错误处理机制并进行大量调试工作。 9. **测试和...
相比之下,敏捷设计强调“Code is Design”,将架构设计分散到开发的各个阶段,让设计直接体现在代码中,减少开发者的工作量,提高敏捷性。 2. 敏捷设计的主要观点 在敏捷开发中,详细设计不再在项目初期一次性完成...
书中的观点和建议跨越了语言和技术的界限,适用于任何阶段的程序员。 1. **务实编程**: 书中强调程序员应具备务实的态度,始终关注解决问题的最有效方法,而不是盲目追求新技术。这包括理解业务需求,编写可维护...
6. **版本控制与重构**:利用版本控制系统如Git进行协同开发,以及适时进行代码重构,可以保持代码结构清晰,降低bug产生的可能性。 7. **团队协作与沟通**:良好的团队协作能减少由于误解或沟通不畅导致的bug。书...
在详细设计阶段,书中涵盖了多种设计模式和重构技术,帮助开发者解决复杂问题,改善代码的结构。这些模式包括工厂模式、观察者模式、单例模式等,都是软件设计中不可或缺的部分。重构是保持代码健康的关键,通过逐步...
13. 软件重构通常包括六个活动:库存分析、文档重构、__接口重构__、代码重构、数据重构和正向工程。 II. 请简要回答以下问题:(共25分) 1. 为什么软件需要随时间演变?(6分) 软件需要随时间演进,因为业务...
5. **重构**:定期对代码进行重构,去除冗余代码,简化逻辑,提高代码质量。 6. **文档撰写**:编写详细的文档,包括但不限于设计文档、用户手册和API文档,以便于他人理解和使用。 7. **持续集成**:采用持续集成...
4. **重构**:敏捷开发提倡适时的代码重构,以保持代码的清晰性和可维护性,这对“软件运行正确”至关重要。 5. **质量保证**:敏捷团队中的每个人都负责质量,而不仅仅是测试人员。通过集体代码审查和自我组织,...
- **观点总结**:Fowler的观点强调了测试在软件开发过程中的重要性,尤其是在重构阶段。他建议开发者应该遵循自己所使用的编程语言的习惯用法,而不是盲目复制其他语言的设计。 ### 3. 征稿启示 - **征稿内容**:...
在软件工程领域,设计是构建高质量系统的关键环节,而Martin Fowler的观点引发了业界对于传统设计方法与演进式设计之间关系的深思。 首先,让我们理解什么是演进式设计。演进式设计是一种灵活且适应变化的设计方法...
在具体开发过程中,项目组采用了持续集成、重构等敏捷实践,并利用版本控制软件SVN进行代码管理,以确保代码的稳定性和一致性。同时,项目负责人定期对代码进行审查,及时发现并纠正不合理的设计或编码问题。 #### ...