重构的原则
重构:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
重构关键:使用大量微小且保持软件性的步骤,一步步达成大规模的修改。即重构不会破坏代码,每次小改动之后后,整个系统任然照常工作。
重构的目的
- 改进软件的设计:防止代码逐渐失去自己的结构,导致源码难以阅读和理解。经常性的重构有助于代码维持自己该有的形态。
- 使软件更容易理解:让代码更好的表达作者意图。
- 帮助找到BUG:对代码重构可以深入理解代码的作用,并且可以把新的理解加入到代码中。
- 提高编程速度:基于已有的功能快速构建新功能。
重构的时机
- 预备性重构:让添加新功能更容易。添加新功能之前看看现有代码库是否有模块已经实现需要的大部分功能,只是需要修改小部分代码,从而避免代码重复。
- 帮助理解的重构:使代码更易懂。例如使用清楚明了的变量名、将一个长函数拆分成几个短函数。
- 捡垃圾式重构:逐步清理冗余代码。不一定要专门抽出时间来实现重构。可以在工作时捎带的做一点重构,积少成多。
- 长期重构。某些重构可能需要几个星期解决,可以让整个团队在未来的几周内逐步解决这个问题。
- 复审代码时重构。让较有经验的人把知识传递给欠缺经验的人。在复审过程中不仅可以获得建议,而且其中许多建议能够立刻实现。
- 不该重构的时机。一是不理解代码的工作原理时,二是重写比重构还要容易时。
重构的挑战
- 延缓新功能开发:尽管重构的目的是加快开发速度,但是任然有很多人认为,花在重构的时间是在拖慢新功能的开发进度。
- 代码所有权:很多重构手法不仅会影响一个模块内部,还会影响该模块与系统其他部分的关系。但是有时又没有权限更改另一个团队的代码库。代码所有权的边界会妨碍重构。
- 分支合并:当在代码库分支生进行大量的代码开发之后,将修改代码合并到主线上时会非常困难。
- 测试:为了避免BUG,如果想要重构,要先有自测试的代码。
- 遗留代码:遗留代码多半没有测试,如果存在一个庞大而又缺乏测试的遗留代码,很难安全的重构它。