重构代码想到的

我的代码是用C语言写的,因此,想到的东西可能只适用于C语言哈


 

尽量不要使用全局变量

【原因】:

  1. 代码的逻辑非常依赖于函数的调用顺序;
  2. 代码的逻辑很难被看懂,从而极大地降低了代码的可维护性;
  3. 由于原因2,所以代码中常常隐藏有bug;

因为全局变量通常是用来保存某种状态,从而在各个函数中可以被很方便地修改和参与判断,那么应对方法也很简单,就是:

【应对方法】:

  1. 状态变量、指针或者数组,在一个总包函数中被定义;
  2. 修改上述状态信息的子函数的调用都集中在总包函数中;
  3. 子函数可以通过返回值,或者指针或数组参数,返回状态信息;
  4. 子函数只能修改一种状态信息,或者只判断一种状态信息; 

 

一个函数尽量只做一件事情

【原因】:

  1. 因为只做一件事情,函数的逻辑可以写得比较简单;
  2. 简单的事情通常很难出错;
  3. 简单的事情通常也很容易看懂,从而可维护性很高;

【备注】:

  有些人心理可能会犯嘀咕:每个函数只做一件事情,岂不显得自己代码写得没有水平,显得非常笨拙嘛。用《UNIXT编程艺术》书中的一句话反驳就是:宁花机器一秒,不花程序员一分;代码的可维护性和正确性比程序员的虚荣心更重要。


 

 一个循环也尽量只做一件事情

【原因】:

  1. 循环中做的事情多了,很容易犯错,举个例子:
for (i=0; i<24; i++)
{
  for(j=0; j<8; j++)
  {
     a[i][j] = read(a.bin);
     b[i][j] = read(b.bin);
     if (a[i][j] > b[i][j])
       break;
  }      
}

  上面的代码中,作者本意是想利用读文件自动移动文件读指针的特性,在for循环中一边读文件,一边比较,但是一旦break出去for循环2后,再进入for循环2后,作者本意想读的文件位置与实际读到的可能就不同了。

修改以后的代码如下:

for (i=0; i<24; i++)
{
  for(j=0; j<8; j++)
  {
     a[i][j] = read(a.bin);
     b[i][j] = read(b.bin);
   }      
}

for (i=0; i<24; i++)
{
  for(j=0; j<8; j++)
  {
     if (a[i][j] > b[i][j])
       break;
   }      
}

上面的代码看上去很蠢,但是绝对不会出错,逻辑也非常清晰明了。

posted @ 2017-06-15 14:58  朝雾之归乡  阅读(127)  评论(0编辑  收藏  举报