您好,欢迎访问三七文档
编程规范和技巧̶编写高质量的C/C++程序2一定要编写高质量代码!高质量代码–提高编程效率–减少调试时间–提高人品:代码是写给他人用的!养成好习惯–从点点滴滴做起–不要光看不做3程序员的境界大学计算机教育的失误:程序质量低下什么是编程老手:能够长期稳定地编写出高质量程序的程序员什么是编程高手:能够长期稳定地编写出高难度、高质量程序的程序员4编程风格世上不存在最好的编程风格–一切因需求而定团队开发讲究风格一致–如果制定了大家认可的编程风格,那么所有组员都要遵守若某种编程风格比较合你的工作,那么就采用它,不要只看不做:养成习惯!5一流代码的特性鲁棒-SolidandRobustCode简洁-MaintainableandSimpleCode高效-FastCode简短-SmallCode共享-Re-usableCode可测试-TestableCode可移植-PortableCode一流代码6关于代码风格问题代码风格(CodingStyle)是一种习惯现在许多大公司都对员工书写代码制定了规范开发大项目时由项目管理者制定代码规范程序风格的重要构成因素–程序版式–命名规则–函数设计原则其他–表达式规则–与零比较–常量规则–动态数组–内存管理7程序版式程序版式——程序员的书法–比书法好学得多,基本不需要特别练习但是坏习惯一旦养成,就像书法一样难以改变不影响程序的功能,但影响程序的可读性追求–清晰、整洁、美观、一目了然–容易阅读,容易测试8程序版式不良的风格intisprime(intn){intk,i;if(n==1)return0;k=sqrt((double)n);for(i=2;i=k;i++){if(n%i==0)return0;}return1;}#includestdio.h#includemath.hmain(){inti;for(i=2;i100;i++){if(isprime(i))printf(%d\t,i);}}9程序版式良好的风格intisprime(intn){intk,i;if(n==1)return0;k=(int)sqrt((double)n);for(i=2;i=k;i++){if(n%i==0)return0;}return1;}#includestdio.h#includemath.hmain(){inti;for(i=2;i100;i++){if(isprime(i))printf(%d\t,i);}}10程序版式对齐(Alignment)与缩进(indent)——保证代码整洁、层次清晰的主要手段–“{”位置的两种风格{和}独占一行,且位于同一列,与引用它们的语句左对齐,便于检查配对情况–位于同一层{和}之内的代码在{右边数格处左对齐,即同层次的代码在同层次的缩进层上–一般用设置为4个空格的Tab键缩进,不用空格缩进11voidFunction(intx){…//programcode}voidFunction(intx){…//programcode}if(condition){…//programcode}else{…//programcode}if(condition){…//programcode}else{…//programcode}for(initialization;condition;update){…//programcode}for(initialization;condition;update){…//programcode}while(condition){…//programcode}while(condition){…//programcode}如果出现嵌套的{},则使用缩进对齐,如:{…{…}…}建议的风格不建议的风格12程序版式现在的许多开发环境、编辑软件都支持“自动缩进”–根据用户代码的输入,智能判断应该缩进还是反缩进,替用户完成调整缩进的工作VC中有自动整理格式功能–只要选取需要的代码,按ALT+F8就能自动整理成微软的cpp文件格式13程序版式变量的对齐规则–数据类型+N个TAB+变量名+[N个TAB]+=+[初始化值];–例charname[20];charaddr[30];charsex='F';intage=20;floatscore=90;14程序版式空行——分隔程序段落的作用–在每个类声明之后加空行–在每个函数定义结束之后加空行–在一个函数体内,相邻两组逻辑上密切相关的语句块之间加空行,语句块内不加空行//空行voidFunction1(…){…}//空行voidFunction2(…){…}//空行voidFunction3(…){…}//空行while(condition){statement1;//空行if(condition){statement2;}else{statement3;}//空行statement4;}15程序版式代码行内的空格——增强单行清晰度–关键字之后加空格–函数名之后不加空格–赋值、算术、关系、逻辑等二元运算符前后各加一空格,但一元运算符前后一般不加空格sum=sum+term;–(向后紧跟,),;向前紧跟,紧跟处不留空格–,;后留一个空格Function(x,y,z)for(initialization;condition;update)–[].-前后不加空格–对表达式较长的for和if语句,为了紧凑可在适当地方去掉一些空格for(i=0;i10;i++)if((a+bc)&&(b+ca)&&(c+ab))16voidFunc1(intx,inty,intz);//良好的风格voidFunc1(intx,inty,intz);//不良的风格printf(%d%d%d,a,b,c);//良好的风格printf(%d%d%d,a,b,c);//不良的风格if(year=2000)//良好的风格if(year=2000)//不良的风格if((a=b)&&(c=d))//良好的风格if(a=b&&c=d)//不良的风格for(i=0;i10;i++)//良好的风格for(i=0;i10;i++)//不良的风格for(i=0;i10;i++)//过多的空格x=ab?a:b;//良好的风格x=ab?a:b;//不良的风格int*x=&y;//良好的风格int*x=&y;//不良的风格array[5]=0;//不要写成array[5]=0;a.Function();//不要写成a.Function();b-Function();//不要写成b-Function();程序版式17程序版式代码行–一行只写一条语句,这样方便测试–一行只写一个变量,这样方便写注释intwidth;//宽度intheight;//高度intdepth;//深度–尽可能在定义变量的同时,初始化该变量intsum=0;–if、for、while、do等语句各占一行,执行语句无论有几条都用{和}将其包含在内,这样便于维护if(widthheight){DoSomething();}//空行OtherThing();18intwidth;//宽度intheight;//高度intdepth;//深度intwidth,height,depth;//宽度高度深度x=a+b;y=c+d;z=e+f;x=a+b;y=c+d;z=e+f;if(widthheight){dosomething();}if(widthheight)dosomething();for(initialization;condition;update){dosomething();}//空行other();for(initialization;condition;update)dosomething();other();程序版式19程序版式长行拆分–代码行不宜过长,应控制在70-~80个字符以内–实在太长时要在适当位置拆分,拆分出的新行要进行适当缩进if((veryLongVar1=veryLongVar2)&&(veryLongVar3=veryLongVar4)){DoSomething();}doubleFunctionName(doublevariablename1,doublevariablename2);for(very_longer_initialization;very_longer_condition;very_longer_update){DoSomething();}20程序版式修饰符*和&的位置–有争议–从语义上讲,靠近数据类型更直观,但对多个变量声明时容易引起误解int*x,y;–提倡靠近变量名int*x,y;21注释规范注释(Comments)的重要性写注释给谁看?在哪些地方写注释?怎样写注释?注释的风格写注释时的注意事项可灵活运用的一些规则22注释规范注释的重要性–注释对于程序犹如眼睛对于人的重要性一样–没有注释的程序对于读者好比眼前一团漆黑,跟拿到一个可执行程序别无二致–不规范的注释和好几千度的近视眼没什么区别–代码本身体现不出价值–开发程序的思维才能使其变得有价值–这种思维的具体体现就是在于注释和规范的代码本身23注释规范写注释给谁看?–给自己看,使自己的设计思路得以连贯–给继任者看,使其能够接替自己的工作24注释规范写注释的最重要的功效在于传承–要站在继任者的角度写–简单明了、准确易懂、防止二义性–让继任者可以轻松阅读、复用、修改自己的代码–让继任者轻松辨别出哪些使自己写的,哪些是别人写的25注释规范不好的注释–i=i+1;//i加1–return-1;//返回-1–free(p);//释放p所指的内存–fclose(fin);//关闭文件–/******************************************//*功能描述:本函数用于实现xxx功能,目的是:*//*入口参数:参数p,表示指向结构体的指针*//*出口参数:参数xx,表示*//*返回值:返回xx值,当返回xx值时,表示*//******************************************/26注释规范不好的注释不但白写,还扰乱了读者的视线/*以二进制只读方式打开文件并判断打开是否成功*/if((fin=fopen(cat.pic,rb)==NULL){puts(打开文件cat.pic失败);/*如果打开失败,则显示错误信息*/return-1;/*返回-1*/}……/*从图像的第1行到第400行循环*/for(i=0;i400;i++)/*从图像的第1列到第400列循环*/for(j=0;j400;j++){……/*按照公式Y=0.299*R+0.587*G+0.114*B计算灰度值*/y=(299*r+587*g+114*b)/1000;……}……fclose(fin);/*关闭文件*/27注释规范好的注释(尤其是算法注释)是对设计思想的精确表述和清晰展现,能揭示代码背后隐藏的重要信息/*打开输入文件后判断文件长度是否符合格式要求*/if((fin=fopen(cat.pic,rb)==NULL){puts(打开文件cat.pic失败);return-1;}……/**下面是图像转换的算法实现。彩色图像到灰度图像的转换主要利用RGB颜色空间到*YUV颜色空间的变换公式来取得灰度值,公式为Y=0.299*R+0.587*G+0.114*B*/for(i=0;i400;i++)for(j=0;j400;j++){……y=(299*r+587*g+114*b)/1000;……}……fclose(fin);28注释规范在哪些地方写注释?–在重要的文件首部文件名+功能说明+[作者]+[版本]+[版权声明]+[日期]–在用户自定义函数前对函数接口进行说明
本文标题:编程规范和技巧
链接地址:https://www.777doc.com/doc-3687088 .html