本文共 4851 字,大约阅读时间需要 16 分钟。
人们交流靠各种语言,每行都有每行的所谓的“行话”。程序员也不例外,众所周知,程序员都是用代码进行交流的。那么除了在代码中的注释之外,
程序员如何读懂别人的程序呢? 当然,程序员之间也有所谓的“潜规则”。大家都把代码中的变量、函数和类等等用目前常用的匈牙利命名、驼峰式、帕斯卡命名法来进行命名。一、匈牙利命名法(Hungarian)
匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域,类型等。这些符号可以多个同时使用,顺序是先m_(成员变量), 再指针,再简单数据类型,再其他。例如:m_lpszStr, 表示指向一个以0字符结尾的字符串的长指针成员变量。匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。
匈牙利命名法中常用的小写字母的前缀:前缀 类型 a 数组 (Array) b 布尔值 (Boolean) by 字节 (Byte) c 有符号字符 (Char) cb 无符号字符 (Char Byte,没有多少人用) cr 颜色参考值 (ColorRef) cx,cy 坐标差(长度 ShortInt) dw Double Word fn 函数 h Handle(句柄) i 整型 l 长整型 (Long Int) lp Long Pointer m_ 类的成员 n 短整型 (Short Int) np Near Pointer p Pointer s 字符串型 sz 以null做结尾的字符串型 (String with Zero End) w Word
二、驼峰命名法(Camel)
驼峰式命名法就是当变量名或函式名是由一个或多个单词连结在一起,而构成的唯一识别字时,第一个单词以小写字母开始;第二个单词的首字母大写或每一个单词的首字母都采用大写字母,例如:myFirstName、myLastName,这样的变量名看上去就像驼峰峰一样此起彼伏,故得名。 驼峰式命名法(Camel-Case)一词来自 Perl 语言中普遍使用的大小写混合格式,而 Larry Wall 等人所著的畅销书《Programming Perl》(O’Reilly 出版)的封面图片正是一匹骆驼。 驼峰式命名法的命名规则可视为一种惯例,并无绝对与强制,为的是增加识别和可读性。 小驼峰法 变量一般用小驼峰法标识。驼峰法的意思是:除第一个单词之外,其他单词首字母大写。譬如 int myStudentCount; 变量myStudentCount第一个单词是全部小写,后面的单词首字母大写。 大驼峰法 相比小驼峰法,大驼峰法把第一个单词的首字母也大写了。常用于类名,函数名,属性,命名空间。譬如 public class DataBaseUser;三、 帕斯卡命名法(Pascal)
帕斯卡命名法其实就是目前说的大驼峰命名法,常用于类名,函数名,属性,命名空间。 string UserName;三种命名规则的小结:
MyData 就是一个帕斯卡命名的示例 而myData是一个骆驼命名法,它第一个单词的第一个字母小写,后面的单词首字母大写,看起来像一个骆驼 而iMyData是一个匈牙利命名法,它的小写的i说明了它的型态,后面的和帕斯卡命名相同,指示了该变量的用途。命名的基本原则
(1) 标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解——尽量采用采用英文单词或全部中文全拼表示,若出现英文单词和中文混合定义时,使用连字符“_”将英文与中文割开。较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写。例如:temp->tmp、flag->标志寄存器、statistic->stat、increment->inc、message->msg等缩写能够被大家基本认可。 (2) 命名中若使用特殊约定或缩写,则要有注释说明。应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明。 (3) 自己特有的命名风格,要自始至终保持一致,不可来回变化。个人的命名风格,在符合所在项目组或产品组的命名规则的前提下,才可使用。(即命名规则中没有规定到的地方才可有个人命名风格)。 (4) 对于变量命名,禁止取单个字符(如i 、j 、k… ),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i 、j 、k 作局部循环变量是允许的。变量,尤其是局部变量,如果用单个字符表示,很容易敲错(如i写成j),而编译时又检查不出来,有可能为了这个小小的错误而花费大量的查错时间。 (5) 除非必要,不要用数字或较奇怪的字符来定义标识符。 (6) 命名规范必须与所使用的系统风格保持一致,并在同一项目中统一。 (7) 在同一软件产品内,应规划好接口部分标识符(变量、结构、函数及常量)的命名,防止编译、链接时产生冲突。对接口部分的标识符应该有更严格限制,防止冲突。如可规定接口部分的变量与常量之前加上“模块”标识等。 (8) 用正确的反义词组命名具有互斥意义的变量或相**作的函数等。下面是一些在软件中常用的反义词组。
add / remove begin / end create / destroyinsert / delete first / last g et / releaseincrement / decrement put / getadd / delete lock / unlock open / closemin / max old / new start / stopnext / previous source / target show / hidesend / receive source / destinationcut / paste up / down示例:intmin_sum;intmax_sum;intadd_user( BYTE *user_name );intdelete_user( BYTE *user_name );
(9) 除了编译开关/ 头文件等特殊应用,应避免使用_EXAMPLE_TEST_ 之类以下划线开始和结尾的定义。
变量名的命名规则
(1) 变量的命名规则要求用“匈牙利法则”。 即开头字母用变量的类型,其余部分用变量的英文意思、英文的缩写、中文全拼或中文全拼的缩写,要求单词的第一个字母应大写。 即: 变量名=变量类型+变量的英文意思(或英文缩写、中文全拼、中文全拼缩写) 对非通用的变量,在定义时加入注释说明,变量定义尽量可能放在函数的开始处。 见下表:bool 用b开头 b标志寄存器int 用i开头 iCountshort int 用n开头 nStepCountlong int 用l开头 lSumchar用c开头 cCountunsigned char 用by开头float 用f开头 fAvgdouble 用d开头 dDetaunsigned int(WORD) 用w开头 wCountunsigned long int(DWORD) 用dw开头 dwBroad字符串 用s开头 sFileName用0结尾的字符串 用sz开头 szFileName
(2)指针变量命名的基本原则为:
对一重指针变量的基本原则为:“p”+变量类型前缀+命名,如一个float*型应该表示为pfStat。对二重指针变量的基本规则为:“pp”+变量类型前缀+命名。对三重指针变量的基本规则为:“ppp”+变量类型前缀+命名。 (3)全局变量用g_开头,如一个全局的长型变量定义为g_lFailCount。即:变量名=g_+变量类型+变量的英文意思(或缩写)。此规则还可避免局部变量和全局变量同名而引起的问题。 (4) 静态变量用s_开头,如一个静态的指针变量定义为s_plPerv_Inst。即: 变量名=s_+变量类型+变量的英文意思(或缩写) (5) 对枚举类型(enum)中的变量,要求用枚举变量或其缩写做前缀。并且要求用大写。enum cmEMDAYS{ EMDAYS_MONDAY;EMDAYS_TUESDAY;……};
(6) 对struct、union变量的命名要求定义的类型用大写。并要加上前缀,其内部变量的命名规则与变量命名规则一致。
结构一般用S开头,如:struct ScmNPoint{ int nX;//点的X位置int nY; //点的Y位置};
联合体一般用U开头,如:
union UcmLPoint{ LONG lX;LONG lY;}
(7) 对常量(包括错误的编码)命名,要求常量名用大写,常量名用英文表达其意思。当需要由多个单词表示时,单词与单词之间必须采用连字符“_”连接。
如:#define CM_FILE_NOT_FOUND CMMAKEHR(0X20B) 其中CM表示类别。(8) 对const 的变量要求在变量的命名规则前加入c_。即:c_+变量命名规则;示例:const char* c_szFileName;
函数的命名规范
(1)函数的命名应该尽量用英文(或英文缩写、中文全拼、中文全拼缩写)表达出函数完成的功能——函数名应准确描述函数的功能。遵循动宾结构的命名法则,函数名中动词在前,并在命名前加入函数的前缀,函数名的长度不得少于8个字母。函数名首字大写,若包含有两个单词的每个单词首字母大写。如果是OOP 方法,可以只有动词(名词是对象本身)。示例:LONG GetDeviceCount(……);void print_record( unsigned int rec_ind ) ;intinput_record( void ) ;unsigned char get_current_color( void ) ;
(2)避免使用无意义或含义不清的动词为函数命名。如使用process、handle等为函数命名,因为这些动词并没有说明要具体做什么。
(3)必须使用函数原型声明。函数原型声明包括:引用外来函数及内部函数,外部引用必须在右侧注明函数来源: 模块名及文件名;内部函数,只要注释其定义文件名——和调用者在同一文件中(简单程序)时不需要注释。
应确保每个函数声明中的参数的名称、类型和定义中的名称、类型一致。函数参数命名规范
(1) 参数名称的命名参照变量命名规范。 (2) 为了提高程序的运行效率,减少参数占用的堆栈,传递大结构的参数,一律采用指针或引用方式传递。 (3) 为了便于其他程序员识别某个指针参数是入口参数还是出口参数,同时便于编译器检查错误,应该在入口参数前加入const标志。如:……cmCopyString(const CHAR * c_szSource, CHAR * szDest)
文件名(包括动态库、组件、控件、工程文件等)的命名规范文件名的命名要求表达出文件的内容,要求文件名的长度不得少于5个字母,严禁使用象file1,myfile之类的文件名。转载地址:http://vmlbi.baihongyu.com/