重构代码想到的
我的代码是用C语言写的,因此,想到的东西可能只适用于C语言哈
尽量不要使用全局变量
【原因】:
- 代码的逻辑非常依赖于函数的调用顺序;
- 代码的逻辑很难被看懂,从而极大地降低了代码的可维护性;
- 由于原因2,所以代码中常常隐藏有bug;
因为全局变量通常是用来保存某种状态,从而在各个函数中可以被很方便地修改和参与判断,那么应对方法也很简单,就是:
【应对方法】:
- 状态变量、指针或者数组,在一个总包函数中被定义;
- 修改上述状态信息的子函数的调用都集中在总包函数中;
- 子函数可以通过返回值,或者指针或数组参数,返回状态信息;
- 子函数只能修改一种状态信息,或者只判断一种状态信息;
一个函数尽量只做一件事情
【原因】:
- 因为只做一件事情,函数的逻辑可以写得比较简单;
- 简单的事情通常很难出错;
- 简单的事情通常也很容易看懂,从而可维护性很高;
【备注】:
有些人心理可能会犯嘀咕:每个函数只做一件事情,岂不显得自己代码写得没有水平,显得非常笨拙嘛。用《UNIXT编程艺术》书中的一句话反驳就是:宁花机器一秒,不花程序员一分;代码的可维护性和正确性比程序员的虚荣心更重要。
一个循环也尽量只做一件事情
【原因】:
- 循环中做的事情多了,很容易犯错,举个例子:
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; } }
上面的代码看上去很蠢,但是绝对不会出错,逻辑也非常清晰明了。
版权声明:
作者:朝雾之归乡
出处:http://www.cnblogs.com/cnpirate
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。