flag标志什么?哦,它标志代码馊了——(三)
2011-11-19 23:26
393 查看
有时候flag会以别的名字出现,但同样会把代码弄得馊不可闻。例如下面的代码
样本代码5
View Code
现在不难看出,代码中的sign不过是break或return语句的一个拙劣的替代品而已,完全没有必要。代码可以进一步简化
结论就是,原来代码中的loca和sign没有任何存在的意义,因为它们除了把代码弄得更晦涩更复杂之外没有起到任何好作用。
标志变量的毛病改完了,但这个search()其实还有另外的毛病,这个毛病就是根本不应该把查找与输出这两个功能搅和在一起。完成单一任务是函数设计的一个基本原则。因此从整个程序设计的角度来说更干净的写法应该是:
通过前面的几个例子,不难看出,在代码中轻率地使用flag之类的标志变量确实能够败坏代码的味道,使得代码变馊。
那么,是否在代码中绝对不应该使用标志变量呢?却也不是。使用flag标志变量的前提首先是解决问题的算法要求使用这样的变量,离开了这个前提使用flag标志变量就难免成为东施效颦;其次,不应该生硬死板地为标志变量命名为flag,无论什么问题总是一味地flag或sign,不是头脑僵化就是思维扭曲。
最后看一个例子,欣赏一下大师是如何使用标志变量的。下面的代码出自K&R,程序功能是统计输入的行数、单词数和字符数:
这里,标志变量并没有使用丑陋的flag作为名称,而是恰当地使用了state这个与问题相贴切的名字。再加上两个漂亮的符号常量IN和OUT,使得代码的含义不言自明,连注释都用不着。三十多年过去了,这段代码不但没有腐朽,相反,依然还是那么清新典雅,垂范后人,令人高山仰止。(完)
样本代码5
View Code
void search(int n,int num[],char name [8]) { int top = 0 ,bott = N-1,mid,loca=-1,sign = 1 ; while((sign==1)&&(top<=bott)) { mid=(bott+top)/2; if(n==num[mid]) { loca=mid; printf("No.%d,his name is %s.\n",n,name[loca]); sign=-1; } else if(n<num[mid]) bott=mid-1; else top=mid+1; } if(loca==-1) printf("%d not been found.\n",n); }
现在不难看出,代码中的sign不过是break或return语句的一个拙劣的替代品而已,完全没有必要。代码可以进一步简化
void search( int n , int num[] , char name[][8] ) { int top=0,bott=N-1,mid; while( top<=bott ) { mid=(bott+top)/2; if( n == num[mid] ) { printf("No.%d,his name is %s.\n",n,name[mid]); return ; } else if( n < num[mid] ) bott = mid - 1 ; else top = mid + 1 ; } printf("%d not been found.\n",n); }
结论就是,原来代码中的loca和sign没有任何存在的意义,因为它们除了把代码弄得更晦涩更复杂之外没有起到任何好作用。
标志变量的毛病改完了,但这个search()其实还有另外的毛病,这个毛病就是根本不应该把查找与输出这两个功能搅和在一起。完成单一任务是函数设计的一个基本原则。因此从整个程序设计的角度来说更干净的写法应该是:
#include <stdio.h> #define N 10 #define NOT_FOUND (-1) int search( int , int [] , size_t ); int main( void ) { /* */ int num , number ; char name [8] ; / * */ printf("\ninput number to look for:"); scanf("%d",&number); { int site = search( number , num , N ); if( site != NOT_FOUND ) printf("No.%d,his name is %s.\n" , number , name[site] ); else printf("%d not been found.\n",n); } /* */ return 0; } int search( int n, int num[] , size_t size ) { int top = 0 , bott = size - 1 , mid ; while( top <= bott ) { mid = ( bott + top ) / 2 ; if( n == num[mid] ) return mid ; if( n < num[mid] ) bott = mid - 1 ; else top = mid + 1 ; } return NOT_FOUND ; }
通过前面的几个例子,不难看出,在代码中轻率地使用flag之类的标志变量确实能够败坏代码的味道,使得代码变馊。
那么,是否在代码中绝对不应该使用标志变量呢?却也不是。使用flag标志变量的前提首先是解决问题的算法要求使用这样的变量,离开了这个前提使用flag标志变量就难免成为东施效颦;其次,不应该生硬死板地为标志变量命名为flag,无论什么问题总是一味地flag或sign,不是头脑僵化就是思维扭曲。
最后看一个例子,欣赏一下大师是如何使用标志变量的。下面的代码出自K&R,程序功能是统计输入的行数、单词数和字符数:
#include <stdio.h> #define IN 1 /*在单词内*/ #define OUT 0 /*在单词外*/ /* 统计输入的行数、单词数和字符数 */ main() { int c,nl,nw,nc,state; state = OUT ; nl = nw = nc = 0 ; while((c = getchar())!= EOF){ ++nc; if( c == '\n') ++nl; if( c ==' ' || c =='\n' || c =='\t') state = OUT ; else if(state == OUT){ state = IN ; ++nw; } } printf("%d %d %d\n", nl , nw , nc ); }
这里,标志变量并没有使用丑陋的flag作为名称,而是恰当地使用了state这个与问题相贴切的名字。再加上两个漂亮的符号常量IN和OUT,使得代码的含义不言自明,连注释都用不着。三十多年过去了,这段代码不但没有腐朽,相反,依然还是那么清新典雅,垂范后人,令人高山仰止。(完)
相关文章推荐
- flag标志什么?哦,它标志代码馊了——(二)
- flag标志什么?哦,它标志代码馊了——(一)
- MonoDevelop代码提示前有个P、C、E。这些标志都代表什么?
- 优龙的FS44B0X板子的BIOS代码的入口点在什么地方?如何查找?
- babel到底将代码转换成什么鸟样?
- (转载)怎么看到有的代码定义变量用var $a是什么意思?
- 什么是整洁的代码(Clean Code)?
- 代码设计程度的出发点是什么
- fir.im Weekly - 除了写代码,还需要了解什么
- 代码参数里的 payload 究竟是什么意思
- SourceTree的基本使用 1. SourceTree是什么 拥有可视化界面的项目版本控制软件,适用于git项目管理 window、mac可用 2. 获取项目代码 1. 点击克隆/新建 2
- 拿什么拯救你,我的代码--c#编码规范实战篇
- html 代码rowspan="2" 代表什么意思
- asp.net服务器代码标记中的等号(=)、井号(#)的含义是什么?
- 如何实现把CListCtrl类中的数据存储到txt或excel中,并且存储位置可以自己选择?具体代码是什么?
- 漫画告诉你什么是《屎一样的代码》?
- ARM启动代码学习(一)RO和RW还有ZI代表什么?(转载)
- 这是什么垃圾代码
- 你为你的程序做了什么--代码篇
- 【敏捷】敏捷时代的建模:敏捷团队的扩张除了代码还需要什么? (ZZ)