重构是啥
对软件内部结构的调整,在不改变软件行为的前提下,提高可理解性,降低修改成本。
重构的目的:更易于理解、修改,对其外部行为几乎不造成影响。
两种不同行为:添加新功能与重构
添加新功能和重构,两者不能同时进行。添加新功能时只管添加新功能、重构时只管重构。
为何重构
简单来说重构可以帮助我们更好的改进程序的内部结构,使代码更容易理解,可以帮助修改bug,可以提高编程速度
何时重构
重构是因为你想做别的什么事,而重构能帮你把那些事做好。
三次法则
第一次做某件事只管去做;第二次做类似的事产生反感;第三次你就该重构了。所谓事不过三。
添加新功能时重构
这是最常见的重构时机。重构的直接原因是为了帮助我理解需要修改的代码。
另一个动力:代码的设计无法帮助添加所需的特性。
修补错误时重构
这种时候重构多半是为了可读性。
复审代码时重构
复审的好处:很多公司会做一些复审代码的活动,复审代码有很多好处:传播知识、帮助更多人理解系统更多内容。
重构对复审的好处:重构可以帮助更好的复审别人的代码。阅读代码并理解——>提出建议——>想到点子后,考虑是否能实现——>若能实现,开始做。这样可以获得更高层次的认识。
复审团队要精练:原作者+复审者,复审者提出建议,然后两人共同判断修改是否可通过重构轻松实现,若可以,则进行。
重构可以帮助更好的复审别人的代码
重构的难题
当学习一种新技术时,很难知道它的局限性在哪里(它不适用的场合)。重构也如此,不知道它的局限性,我们应该获得它所提供的有利之处,也要监控它所带来的问题。
修改接口
要注意修改已发布接口(比如公开接口),若修改,不仅要考虑自己使用的情况,还要考虑其他调用者。
该如何重构那些必须修改的“已发布接口”?
- 必须同时维护新旧两个接口,直到所有用户都有时间对这个变化做出反应。尽量这么做,让旧接口调用新接口(不要复制)。还可以采用deprecation(表示“不建议使用''的意思)让调用者注意到它
- 尽量不要发布接口,请修改代码所有权政策,使重构更顺畅。让其他程序员可以进入自己的程序库,修改他们自己管理的那部分,比维护接口会更容易。请修改代码所有权政策,使重构更顺畅。
何时不该重构
有时候既有代码实在太混乱,还不如重新写一个来得容易。这种情况没有什么准则来判断。
- 代码根本不能正常运行,这时候只能重写一个
- 一个折中的办法是,将“大块头软件”重构为封装良好的小型组件,然后逐一对组件进行重构或重建(自己选)。
- 项目接近最后期限,避免重构。
重构与设计
重构和设计彼此互补。设计是编程之初需要做的,而重构是编程之后要做的,两者都很重要。重构可以降低设计阶段的难度,减轻设计压力。