1.重构的定义
重构是一种对软件内部结构的改善,目的是在不改变软件的可见行为的情况下,使其更易理解,修改成本更低。
其中,“重构不改变外部的可见行为”,可以把重构理解为,在保持功能不变的前提下,利用设计思想、原则、模式、编程规范等理论来优化代码,修改设计的不足,提高代码质量。
2.重构的目的:为什么重构?
对于项目来言,重构可以保持代码质量持续处于一个可控状态,不至于腐化到无可救药的地步。
对于个人而言,重构非常锻炼一个人的代码能力,并且是一件非常有成就感的事情。
它是我们学习的经典设计思想、原则、模式、编程规范等理论知识的练兵场。
3.什么情况下要重构?
首先,不要寄希望于在代码烂到一定程度之后,集中重构解决所有问题是不现实的,我们必须探索一条可持续、可演进的方式。
持续重构:
- 平时没事的时候,你可以看看项目中有哪些写得不够好的、可以优化的代码,主动去重构一下;
- 或者在修改、添加某个功能代码的时候,你也可以顺手把不符合编码规范、不好的设计重构一下;
- 总之,就像把单元测试、Code Review 作为开发的一部分,我们如果能把持续重构也作为开发的一部分,称为一种开发习惯,对项目、对自己都很有好处。
尽管我们说重构能力很重要,但持续重构意识更重要。我们要正确地看待代码质量和重构这件事情。技术在更新、需求在变化、人员在流动,代码质量总会在下降,代码总会存在不完美,重构就会持续在进行。
时刻具有持续重构意识,才能避免开发初期就过度设计,避免代码维护的过程中质量的下降。
而那些看到别人代码有点瑕疵就一顿乱骂,或者花尽心思去构思一个完美设计的人,往往都是因为没有树立正确的代码质量观,没有持续重构意识。
4.重构的对象:到底重构什么?
根据重构的规模,可以笼统地分为:大规模高层次重构和小规模低层次的重构。
大型重构
大型重构指的是对顶层代码设计的重构,包括:系统、模块、代码结构、类与类之间的关系等的重构,重构的手段有:分层、模块化、解耦、抽象可复用组件等。这类重构的工具就是我们学习过的那些设计思想、原则和模式。这类重构涉及的代码改动会比较多,影响面会比较大,所以难度也较大,耗时会比较长,引入 bug 的风险也会相对比较大。
小型重构
小型重构指的是对代码细节的重构,主要是针对类、函数、变量等代码级别的重构,比如规范命名、规范注释、消除超大类或函数、提取重复代码等。小型重构更多的是利用编码规范。这类重构要修改的地方比较集中,比较简单,可操作性较强,耗时会比较短,引入 bug 的风险相对来说会比较小。只需要熟练掌握各种编码规范,就可以做到得心应手。
5.如何重构?
1.对于大型重构
(1)可能出现的问题
对于大型重构来说,因为涉及的模块、代码会比较多,如果项目代码质量又比较差,耦合比较严重,往往会牵一发而动全身。如果时间预估错误,很可能导致半途而废,继续堆砌烂代码了。
(2)正确的方式
在进行大型重构的时候,我们要提前做好完善的重构计划,有条不紊地分阶段来进行。每个阶段完成一小部分代码的重构,然后提交、测试、运行,发现没有问题之后,再继续进行下一阶段的重构,保证代码仓库中的代码一直处于可运行、逻辑正确的状态。每个阶段,我们都要控制好重构影响到的代码范围,考虑好如何兼容老的代码逻辑,必要的时候还需要写一些兼容过渡代码。只有这样,我们才能人每一阶段的重构都不至于耗时太长(最好一天就能完成),不至于与新的功能开发相冲突。
2.对于小型重构
大规模高层次的重构一定是有组织、有计划,并且非常谨慎的,需要有经验、熟悉业务的资深同事来主导。
而小规模低层次的重构,因为影响范围小,改动耗时短,所以,只要你愿意并且有时间,随时都可以去做。
\