1.何谓重构
「重构」有两种不同含义:
- 作为名词时的含义:软件内部结构的一种调整,目的是在不改变「软件的可视行为」前提下,提高它的可拓展性,降低修改成本。
- 作为动词时的含义:使用一系列重构的准则,在不改变「软件的可视行为」前提下,调整其结构。
注:「软件的可视行为」的指的是程序运行时表现。
几个常见的问题:
「重构」只是整理代码吗?
从某种角度而言,是的。
- 重构(包含的各种原则)是整理代码的一套方法论。掌握之后,可以吧帮助我们更高效并且可控地整理好代码。
「重构」与「性能优化」的区别
和重构一样,性能优化通常不会改变组件的行为(除了执行速度),只会改变其内部结构。但是两者出发点不同:
性能优化往往使代码较难理解,但为了得到所需的性能你不得不那么做。
我要强调的第二点是:重构不会改变软件「可受观察之行为」——重构之后软件功能一如以往。
「添加新功能」和「重构」的区别
- 添加新功能时,你不应该修改既有代码,只管添加新功能。通过测试(并让测试正常运行〉,你可以衡量自己的工作进度。
- 重构时你就不能再添加功能,只管改进程序结构。此时你不应该添加任何测试(除非发现先前遗漏的任何东西),只在绝对必要(用以处理接口变化〕时才修改测试。
无论何时都应该清楚自己当前在做什么,是「添加新功能」还是在「重构」。
2.为何重构
- 改进软件设计。比如消除重复代码。代码数量减少将使未来可能的程序修改动作容易得多。确定代码将所有事物和行为都只表述一次。
- 提高可读性,降低维护成本
- 我们写下的源码有两个读者——计算机 和 另一些程序员。让后者能够读懂你的代码才是最重要的。(业务需求总是改变的,可能十天后就会有新同事需要尝试读懂你的代码,并做一些修改)
- 当你努力让程序运转的时候,你不会想到未来出现的那个开发者。其实很多时候,那个「未来的开发者」就是你自己。也就是说,重构可以帮助你完成这些
- 利用重构来协助我理解不熟悉的代码
- 帮助找到 bug。
- 对代码进行重构,我就可以深入理解代码的作为,并恰到好处地把新的理解反馈回去。搞清楚程序结构的同时,我也清楚了自己所做的一些假设
- 帮助提高编程速度。如果设计不合理。或许某一段时间内你的进展迅速,但恶劣的设计很快就让你的速度慢下来。你会把时间花在调试上面,无法添加新功能。修改时间愈来愈长,因为你必须花愈来愈多的时间去理解系统、寻找重复代码。
3.何时重构
重构本来就不是一件「特别拨出时间做」的事情,重构应该随时随地进行。你不应该为重构而重构,你之所以重构,是因为你想做别的什么事,而重构可以帮助你把那些事做好。
几个典型的重构时机:
- 添加功能时一并重构
- 修补错误时一并重构
- code review 时一并重构
4.小结
坏味道的代码编写而成的程序,有以下几个特征:
- 难以阅读的程序,难以修改。
- 逻辑重复(duplicated logic)的程序,难以修改。
- 添加新行为时需要修改既有代码的程序,难以修改。
- 带复杂条件逻辑(complex conditional logic)的程序,难以修改。
因此,我们希望程序:
- 容易理解;
- 所有逻辑都只在唯一一处指定;
- 新的改动不会危及现有行为;
- 尽可能简单表达条件逻辑(conditional logic)。
重构是这样一个过程:它在一个目前可运行的程序上进行,企图在「不改变程序行为」的情况下赋予上述美好性质,使我们能够继续保持高速开发,从而增加程序的价值。
5.参考资料与学习资源推荐
- 《重构,改善既有代码的设计》
由于本人水平有限,可能出于误解或者笔误难免出错,如果发现有问题或者对文中内容存在疑问请在下面评论区告诉我,谢谢!