代码重构之逻辑聚集
上一篇文章中写了一个重构数据结构,也就是数据聚集的例子。之前还有过一个经历,是重构一个很长的函数,过程大概就是把相关的逻辑聚集起来。我将其称为逻辑聚集。这是一个重构代码逻辑的过程。
故事是这样的。在我手上的,是一个由几百行代码组成的函数。程序整体上看起来有比较清晰的代码块,有的代码块很相似,但是细节有不同。曾经尝试修改过这个代码。但是,由于一些局部变量贯穿整个函数,在不同的地方发挥作用,而且,不同的代码块之间相互影响。所以,修改这个函数的逻辑很困难,一个小的改动就要改好几个地方。所以,就想着重构一下这段代码。最直接的目标就是,将这个函数变短到几十行的样子,并且使得函数更容易理解。
首先,将几个看起来相似的代码块提取出来,抽象成一个单独的函数。而对于这几个代码块中不同的部分,则以变量的形式表示,作为函数的参数。需要注意的是,在修改过程中,要将只在代码块中起作用的变量作为局部变量,而将前面代码穿过了的参数作为函数参数传入进来,并且将代码块中修改了,而后续代码还有用的变量作为函数的返回参数。
其次,将其他的逻辑相对比较独立的代码块提取出来,抽象成单独的函数。同样要注意上面所提的事项。
最好,很重要的一点,要注意给每个提取出来的函数起一个直观易懂的名字。
经过这样的修改之后,我惊奇的发现整个函数变得很短,也很容易理解,很直观。整个函数看起来可能类似这样
1 void process_data(int* data, int len, int flag) { 2 parse_data(data, len); 3 if (flag) { 4 transform_data_with_method_1(data, len); 5 } else { 6 transform_data_with_method_2(data, len); 7 } 8 compress_data(data, len); 9 }
而且前面提到的那些贯穿整个函数的局部变量也被消除掉了。这时候尝试对代码做一些修改就容易多了。
最后,总结一下逻辑聚集的好处
- 聚集起来的短小函数更容易重用
- 聚集起来的短小函数更容易测试
- 由若干个调用这些短小函数所组成的代码更容易理解,有问题更容易发现,也更容易修改和扩展。
- 短小的函数使得局部变量的作用域更小,因此程序整体上更容易做并行,所有在有些情况下可以使程序运行效率更高。