浅谈重构

1.何谓重构

「重构」有两种不同含义:

  • 作为名词时的含义:软件内部结构的一种调整,目的是在不改变「软件的可视行为」前提下,提高它的可拓展性,降低修改成本。
  • 作为动词时的含义:使用一系列重构的准则,在不改变「软件的可视行为」前提下,调整其结构。

注:「软件的可视行为」的指的是程序运行时表现。

几个常见的问题:

「重构」只是整理代码吗?

从某种角度而言,是的。

  • 重构(包含的各种原则)是整理代码的一套方法论。掌握之后,可以吧帮助我们更高效并且可控地整理好代码。

「重构」与「性能优化」的区别

和重构一样,性能优化通常不会改变组件的行为(除了执行速度),只会改变其内部结构。但是两者出发点不同

性能优化往往使代码较难理解,但为了得到所需的性能你不得不那么做。

我要强调的第二点是:重构不会改变软件「可受观察之行为」——重构之后软件功能一如以往。

「添加新功能」和「重构」的区别

  • 添加新功能时,你不应该修改既有代码,只管添加新功能。通过测试(并让测试正常运行〉,你可以衡量自己的工作进度。
  • 重构时你就不能再添加功能,只管改进程序结构。此时你不应该添加任何测试(除非发现先前遗漏的任何东西),只在绝对必要(用以处理接口变化〕时才修改测试。

无论何时都应该清楚自己当前在做什么,是「添加新功能」还是在「重构」。

2.为何重构

  1. 改进软件设计。比如消除重复代码。代码数量减少将使未来可能的程序修改动作容易得多。确定代码将所有事物和行为都只表述一次。
  2. 提高可读性,降低维护成本
    • 我们写下的源码有两个读者——计算机 和 另一些程序员。让后者能够读懂你的代码才是最重要的。(业务需求总是改变的,可能十天后就会有新同事需要尝试读懂你的代码,并做一些修改)
    • 当你努力让程序运转的时候,你不会想到未来出现的那个开发者。其实很多时候,那个「未来的开发者」就是你自己。也就是说,重构可以帮助你完成这些
    • 利用重构来协助我理解不熟悉的代码
  3. 帮助找到 bug。
    • 对代码进行重构,我就可以深入理解代码的作为,并恰到好处地把新的理解反馈回去。搞清楚程序结构的同时,我也清楚了自己所做的一些假设
  4. 帮助提高编程速度。如果设计不合理。或许某一段时间内你的进展迅速,但恶劣的设计很快就让你的速度慢下来。你会把时间花在调试上面,无法添加新功能。修改时间愈来愈长,因为你必须花愈来愈多的时间去理解系统、寻找重复代码。

3.何时重构

重构本来就不是一件「特别拨出时间做」的事情,重构应该随时随地进行。你不应该为重构而重构,你之所以重构,是因为你想做别的什么事,而重构可以帮助你把那些事做好

几个典型的重构时机:

  • 添加功能时一并重构
  • 修补错误时一并重构
  • code review 时一并重构

4.小结

坏味道的代码编写而成的程序,有以下几个特征:

  • 难以阅读的程序,难以修改。
  • 逻辑重复(duplicated logic)的程序,难以修改。
  • 添加新行为时需要修改既有代码的程序,难以修改。
  • 带复杂条件逻辑(complex conditional logic)的程序,难以修改。

因此,我们希望程序:

  1. 容易理解;
  2. 所有逻辑都只在唯一一处指定;
  3. 新的改动不会危及现有行为;
  4. 尽可能简单表达条件逻辑(conditional logic)。

重构是这样一个过程:它在一个目前可运行的程序上进行,企图在「不改变程序行为」的情况下赋予上述美好性质,使我们能够继续保持高速开发,从而增加程序的价值。

5.参考资料与学习资源推荐

  • 《重构,改善既有代码的设计》

由于本人水平有限,可能出于误解或者笔误难免出错,如果发现有问题或者对文中内容存在疑问请在下面评论区告诉我,谢谢!

Show Comments
0%