转载自https://github.com/Snailclimb/JavaGuide(添加小部分笔记)感谢作者!
前段时间重读了 《重构:改善代码既有设计》,收货颇多。于是,简单写了一篇文章来聊聊我对重构的看法。

何谓重构?#
学习重构必看的一本神书《重构:改善代码既有设计》从两个角度给出了重构的定义:
- 重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
- 重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。
用更贴近工程师的语言来说: 重构就是利用设计模式(如组合模式、策略模式、责任链模式)、软件设计原则(如 SOLID 原则、YAGNI 原则、KISS 原则)和重构手段(如封装、继承、构建测试体系)来让代码更容易理解,更易于修改。
软件设计原则指导着我们组织和规范代码,同时,重构也是为了能够尽量设计出尽量满足软件设计原则的软件。
正确重构的核心在于 步子一定要小,每一步的重构都不会影响软件的正常运行,可以随时停止重构。
常见的设计模式如下 :

更全面的设计模式总结,可以看 java-design-patterns 这个开源项目。
常见的软件设计原则如下 :

更全面的设计原则总结,可以看 java-design-patterns 和 hacker-laws-zh 这两个开源项目。
为什么要重构?#
在上面介绍重构定义的时候,我从比较抽象的角度介绍了重构的好处:重构的主要目的主要是提升代码&架构的灵活性/可扩展性以及复用性。
如果对应到一个真实的项目,重构具体能为我们带来什么好处呢?
- 让代码更容易理解 : 通过添加注释、命名规范、逻辑优化等手段可以让我们的代码更容易被理解;
- 避免代码腐化 :通过重构干掉坏味道代码;
- 加深对代码的理解 :重构代码的过程会加深你对某部分代码的理解;
- 发现潜在 bug :是这样的,很多潜在的 bug ,都是我们在重构的过程中发现的;
- ……
看了上面介绍的关于重构带来的好处之后,你会发现重构的最终目标是 提高软件开发速度和质量 。
重构并不会减慢软件开发速度,相反,如果代码质量和软件设计较差,当我们想要添加新功能的话,开发速度会越来越慢。到了最后,甚至都有想要重写整个系统的冲动。
[
《重构:改善代码既有设计》这本书中这样说:
重构的唯一目的就是让我们开发更快,用更少的工作量创造更大的价值。
何时进行重构?#
重构在是开发过程中随时可以进行的,见机行事即可,并不需要单独分配一两天的时间专门用来重构。
提交代码之前#
《重构:改善代码既有设计》这本书介绍了一个 营地法则 的概念:
编程时,需要遵循营地法则:保证你离开时的代码库一定比来时更健康。
这个概念表达的核心思想其实很简单:在你提交代码的之前,花一会时间想一想,我这次的提交是让项目代码变得更健康了,还是更腐化了,或者说没什么变化?
项目团队的每一个人只有保证自己的提交没有让项目代码变得更腐化,项目代码才会朝着健康的方向发展。
当我们离开营地(项目代码)的时候,请不要留下垃圾(代码坏味道)!尽量确保营地变得更干净了!
开发一个新功能之后&之前#
在开发一个新功能之后,我们应该回过头看看是不是有可以改进的地方。在添加一个新功能之前,我们可以思考一下自己是否可以重构代码以让新功能的开发更容易。
一个新功能的开发不应该仅仅只有功能验证通过那么简单,我们还应该尽量保证代码质量。
有一个两顶帽子的比喻:在我开发新功能之前,我发现重构可以让新功能的开发更容易,于是我戴上了重构的帽子。重构之后,我换回原来的帽子,继续开发新能功能。新功能开发完成之后,我又发现自己的代码难以理解,于是我又戴上了重构帽子。比较好的开发状态就是就是这样在重构和开发新功能之间来回切换。









