`

代码风格规范一二三

阅读更多

by 崔向阳

参考: 《The practice of programming》-Brian W.Kernighan,Rob Pike

    还记得大一刚学C++时老师说,一定要养成良好的编程习惯,做好注释,注意程序的可读性。于是我把要上交的程序排好缩进,不管什么函数,变量都详详细细的写好是干什么用的,再把注释缩排的好看一些。至于自己练手的程序么?当然是不写注释的。这种知其然不知所以然的状态维持了很长一段时间。后来变量的命名方法,程序块的缩进和对齐,各种程序上的习惯写法,注释的写法……各种体会随着时间慢慢增长,但是一直到实际做项目的时候,才更加重视到保持良好的代码风格的重要性,这已经不只是个美观问题,好的代码更不容易出错更加健壮,更容易维护,等等好处不再一一列举。

    The practice of programming这本书很好的介绍了写代码各方面各种有益的经验,我在这里只简单列举一下其中一些要点,偶尔添加些自己的看法。另外Google发出了一个不错的C++编码规范,可以作为借鉴参考。

   

    命名规范

  •     全局变量使用稍长一些,可以描述清楚变量的名字;局部变量使用较短的名字就好。因为全局变量可能在不同的地方出现,有必要用一个长些的名字来提醒它是做什么用的。局部变量则使用较短的和习惯性常用的名字就已足够,读者也较容易根据上下文判断它的意思。比如如下这个例子:

                        for (theElementIndex = 0; theElementIndex < number0fElements;theElementIndex++) 
                                     elementArray[theElementIndex] = theElementIndex;

                        和

                        for (i = 0; i < nelems; i++) 
                                     elem[i] = i ;

    孰优孰劣一眼就看出来了。

    一致性。有一些常用的命名方法,如常量所有字母大写,类和结构体的首字母大写,变量首字母小写。还有骆驼命名法(userName)和用下划线分隔的命名法(user_name)。使用哪种方法可以根据自己的爱好,重要的是在程序里始终坚持一定的习惯,保持一致性。另外相关联的对象或变量的名字要体现他们的关系和区别。

    使用有意义的名字,如:#define ONE 1      和     #define INPUT-MODE 1    的区别。

    函数名应明确的指出所做的事情,与代码一致,并能一定程度上体现返回值,如: if( is_octal(c) )…      和      if( check_octal(c) )…      相比,更清晰的指出了返回值的类型。

    关于中文拼音缩写。在项目中碰到过很多命名是中文拼音缩写,我的观点是可以适当的用。比如业务支撑,使用bs并不能很好的表达意思,business_support在有些地方则过长了,直接使用yz,反而可以让项目相关的人更能明白意思,只要在项目中保持命名一致就好了;但是也看到过些误用的例子,比如听说过有人起的变量名是 zifuchuan 的,也确实是能让风云为之变色了,改为str稍好,但是参照上面的规范,起个有意义的名比如user_name之类的,则更加好了。

 

     表达式和语句

    有意识的显示出结构。如: 

                       for(i=0;i;

                       和

                       for(i=0;i

                                   ;

的区别。

    使用自然的表达方式。如:(! (block-id < actblks) )     和      (block-id >= actblks)      相比,后者就顺畅多了。

    在可能引起歧义的表达式处尽量使用括号,消除歧义。如:   if (x&MASK == BITS)      和     if (x& (MASK == BITS) )。

    使用简单的表达式。尽量避免使用复杂的表达式,而用多个简单表达式代替。

    使代码清晰,不卖弄技巧。如:subkey = subkey >> ( bitoff - ( ( bitoff>>3) << 3)); 和  subkey >>= bitoff & 0x7;    。

    一些表达式经常有副作用,需要引起注意。如:    array[i++] = i;    在不同的编译环境下可能会有不同的结果。

 

    一致性和习惯用法

    使用一致的缩排方式,和一致的花括号使用习惯。缩排方式没什么好说的。花括号有些时候可用可不用,比如if块里只有一行语句的情况,这些地方要保持一致性。

    使用约定俗成的习惯用法。例如,应该写成

                       for(i=0;i

                                …….

                       而不是

                       for(i=0;i

                               i++;

    尽量避免使用宏

 

    程序中的数字

    使用有意义的名字和表达式来代替直接使用数字。例如:

                       fac = lim / 20;        /* set scale factor */ 
                       if (fac < 1) 
                              fac = 1;          /* generate histogram */ 
                       for (i = 0; i < 26; i++) { 
                             ………

                      和

                      enum{

                             HEIGHT = 20;           /* height of bars */

                             NLET = 26;               /* size of alphabet */

                      };

                       fac = lim / HEIGHT;             /* set scale factor */ 
                       if (fac < 1) 
                              fac = 1;                       /* generate histogram */ 
                       for (i = 0; i < NLET; i++){    

    以前有段时间和第一段程序一样,程序里的数字很杂乱,自己写完了回头过来看的时候都很头疼,尤其有些参数需要改动的时候,需要一处一处的去改,不但麻烦,而且容易忙中出错。

    使用常量来命名数字,而不是宏

   

    注释

    不要过度注释。注释是为了帮助阅读程序,过度注释会使重要的注释信息被淹没。注释应该说明不能直接从程序中看出来的信息。

    对函数,全局变量,常量进行注释

    发现代码不合适的时候,改写它,而不是只进行注释。另外改写的时候要注意代码风格与原作者保持一致。

    注释要保持和代码的一致性。修改代码以后要及时对注释进行更新。

    用简洁的语言注释。当注释不得不冗长啰嗦时,通常是代码写的不好。

分享到:
评论

相关推荐

    PYTHON格式规范

    python格式的规范,编程代码风格的指导。

    jQuery权威指南-源代码

    1.1.5 jQuery程序的代码风格/5 1.2 jQuery的简单应用/7 1.2.1 jQuery访问DOM对象/7 1.2.2 jQuery控制DOM对象/7 1.2.3 jQuery控制页面CSS /9 1.3 本章小结/11 第2章 jQuery 选择器/12 2.1 jQuery选择器概述/...

    cs_plugins.zip

    Checkstyle是一个编码规范工具,结合eclipse的格式化,可以基本保持一定的统一风格,但是光靠这些还不够,需要平时积累编码规范,形成统一编码风格,达到所有人写的代码都像是一个人写出来一样.

    网站设计大赛方案.doc

    八、评审办法 评委由7-9人组成,网站设计人员现场演示,由评委现场打分,评出一二三等奖。 九、奖项设置 网站评比根据参评网站得分情况排次,设一等奖2名,二等奖4名,三等奖8名,优秀 奖若干。获奖人员颁发证书和...

    网站设计大赛方案(1).doc

    八、评审办法 评委由7-9人组成,网站设计人员现场演示,由评委现场打分,评出一二三等奖。 九、奖项设置 网站评比根据参评网站得分情况排次,设一等奖2名,二等奖4名,三等奖8名,优秀 奖若干。获奖人员颁发证书和...

    精品搜索导航网站search纯JS源码

    偏向练手,代码中可能会出现风格混乱、命名不规范、每次推送代码变动过多等问题 支持二次开发 建议使用VS Code(Visual Studio Code)并安装Live Server插件,否则无法处理json文件 部署服务器无其他要求 重要说明 ...

    Node.js 开发指南.pdf

    2.3 编译源代码 17 2.3.1 在POSIX系统中编译 17 2.3.2 在Windows系统中编译 18 2.4 安装Node包管理器 18 2.5 安装多版本管理器 19 2.6 参考资料 21 第3章 Node.js快速入门 23 3.1 开始用 Node.js...

    Node.js+开发指南

    2.3 编译源代码 17 2.3.1 在POSIX系统中编译 17 2.3.2 在Windows系统中编译 18 2.4 安装Node包管理器 18 2.5 安装多版本管理器 19 2.6 参考资料 21 第3章 Node.js快速入门 23 3.1 开始用 ...

    xheditor-1.1.14

    2.4. 上传程序开发规范 2.5. 插件开发指南 2.6. 皮肤设计指南 2.7. 关于二次开发 2.1. 进阶使用指导 阅读本章节请先阅读:xhEditor入门基础,若你已经熟悉xhEditor的基本使用,请往下继续。 xhEditor提供两种方式...

    《iPhone开发实战》.(Christopher Allen).pdf

    2.1 比较两种编程风格12 .2.2 核心思想:编程的连续性13 2.3 优点和缺点14 2.3.1 web开发14 2.3.2 sdk开发15 2.3.3 程序平台16 2.4 独立iphone开发17 2.4.1 web开发模型17 2.4.2 sdk开发模式18 ...

    易语言程序免安装版下载

    修改XP风格支持库,解决GDI资源泄露,以及在使用通用组件库六时组合框标题出现重影的BUG。 5. 修改扩展界面支持库一,解决树形框项目无法通过鼠标点击进入编辑状态的BUG。 6. 修改高级表格支持库,解决插入行/...

    【RT-Thread作品秀】写字机器人-电路方案

    G代码生成模块将图像轮廓序列化后进行路径规划,选取一个适合的加工精度,然后按数控加工常用的G代码规范生成NC加工文件。另外对于标准的DXF文件则通过文件解析的方法生成G代码。 运动控制模块是写字机器人中最杂的...

    美国..现代编译原理C语言描述.高清版

    8.1 规范树 126 8.1.1 ESEQ的转换 126 8.1.2 一般重写规则 126 8.1.3 将CALL移到顶层 130 8.1.4 线性语句表 131 8.2 处理条件分支 131 8.2.1 基本块 131 8.2.2 轨迹 132 8.2.3 完善 133 8.2.4 最优轨迹 133 推荐阅读...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     3.5.5 与旧代码的接口 111  3.6 多维数组 112  小结 117  术语表 117  第4章 表达式 119  4.1 基础 120  4.1.1 基本概念 120  4.1.2 优先级与结合律 121  4.1.3 求值顺序 123  4.2 算术运算符 124  4.3 ...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     3.5.5 与旧代码的接口 111  3.6 多维数组 112  小结 117  术语表 117  第4章 表达式 119  4.1 基础 120  4.1.1 基本概念 120  4.1.2 优先级与结合律 121  4.1.3 求值顺序 123  4.2 算术运算符 124  4.3 ...

Global site tag (gtag.js) - Google Analytics