代码重构之逻辑聚集

上一篇文章中写了一个重构数据结构,也就是数据聚集的例子。之前还有过一个经历,是重构一个很长的函数,过程大概就是把相关的逻辑聚集起来。我将其称为逻辑聚集。这是一个重构代码逻辑的过程。

故事是这样的。在我手上的,是一个由几百行代码组成的函数。程序整体上看起来有比较清晰的代码块,有的代码块很相似,但是细节有不同。曾经尝试修改过这个代码。但是,由于一些局部变量贯穿整个函数,在不同的地方发挥作用,而且,不同的代码块之间相互影响。所以,修改这个函数的逻辑很困难,一个小的改动就要改好几个地方。所以,就想着重构一下这段代码。最直接的目标就是,将这个函数变短到几十行的样子,并且使得函数更容易理解。

首先,将几个看起来相似的代码块提取出来,抽象成一个单独的函数。而对于这几个代码块中不同的部分,则以变量的形式表示,作为函数的参数。需要注意的是,在修改过程中,要将只在代码块中起作用的变量作为局部变量,而将前面代码穿过了的参数作为函数参数传入进来,并且将代码块中修改了,而后续代码还有用的变量作为函数的返回参数。

其次,将其他的逻辑相对比较独立的代码块提取出来,抽象成单独的函数。同样要注意上面所提的事项。

最好,很重要的一点,要注意给每个提取出来的函数起一个直观易懂的名字。

经过这样的修改之后,我惊奇的发现整个函数变得很短,也很容易理解,很直观。整个函数看起来可能类似这样

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 }

而且前面提到的那些贯穿整个函数的局部变量也被消除掉了。这时候尝试对代码做一些修改就容易多了。


最后,总结一下逻辑聚集的好处

  • 聚集起来的短小函数更容易重用
  • 聚集起来的短小函数更容易测试
  • 由若干个调用这些短小函数所组成的代码更容易理解,有问题更容易发现,也更容易修改和扩展。
  • 短小的函数使得局部变量的作用域更小,因此程序整体上更容易做并行,所有在有些情况下可以使程序运行效率更高。
posted @ 2014-12-04 21:31  掰棒子熊  阅读(376)  评论(0编辑  收藏  举报