这篇重点介绍一下代码编程的命名规范,主要是业界流行的命名法则和标识符命名规范
标识符的命名规则历来是一个敏感话题,典型的命名风格如unix风格、windows风格等,从来无法达成共识。实际上,各种风格都有其优势也有其劣势,而且往往和个人的审美观有关。对标识符定义主要是为了让团队的代码看起来尽可能统一,有利于代码的后续阅读和修改。
命名完全体现了程序的可阅读性和可理解性,在一定程度上是不需要写注释也能看懂代码。
目前,业界共有四种命名法则:驼峰命名法、匈牙利命名法、帕斯卡命名法和下划线命名法,其中前三种是较为流行的命名法。
1printEmployeePaychecks// 驼峰命名法
2
3print_employee_paychecks//下划线命名法
4
5PrintEmployeePaychecks// 帕斯卡命名法
其中,驼峰命名法和帕斯卡命名法类似,但是区别在第一个字母是否大小写,因此驼峰命名法一般称小驼峰命名法,帕斯卡命名法称大驼峰命名法。
正如它的名称所表示的那样,是指混合使用大小写字母来构成变量和函数的名字(这样的变量名看上去就像骆驼峰一样此起彼伏,故得名),又叫小驼峰命名法。
当变量名或函数名是由一个或多个单词连结在一起,而构成的唯一识别字时,第一个单词以小写字母开始;从第二个单词开始以后的每个单词的首字母都采用大写字母。
1printEmployeePaychecks
通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域、类型等。这些符号可以多个同时使用,顺序是先m_(成员变量)、再指针、再简单数据类型、再其它。这样做的好处在于能增加程序的可读性,便于对程序的理解和维护
匈牙利命名法的规则是:作用域(属性)+类型+描述。
如:定义一个全局变量,指向类型为int的最小值指针,变量命名为
int g_pMinValue = NULL;
以下是我根据匈牙利命名法总结的的写法对应表
分类 | 前缀 | 描述 |
---|---|---|
作用域(属性) | 无 | 局部变量 |
m_ | 类成员变量(C++) | |
ms_ | 类的静态成员变量(C++) | |
s_ | 静态变量 | |
g_ | 全局变量 | |
sg_ | 静态全局变量 | |
c | 常量 | |
类型 | b | bool 变量,不过我一般是用 is,如定义一个数据接收完成标志,则 bool isRecvEnd; |
sz | 以 '\\0' 结束的字符串 | |
str | string 类型字符串(C++) | |
p | 指针变量 | |
uc | 无符号单字节整数型(unsigned char) | |
us | 无符号双字节整数型(unsigned short) | |
ui | 无符号四字节整数型(unsigned int) | |
c | 有符号单字节整数型(signed char) | |
s | 有符号双字节整数型(signed short) | |
i | 有符号四字节整数型(signed int) | |
arr | 数组 | |
l | 长整型 | |
f | 浮点型变量 | |
pfn | 函数指针 | |
t | 结构体变量 | |
e | 枚举变量 | |
类型前缀可以组合使用,例如"arrc"表示字符数组,"psz"表示指向以'\\0' 结束的字符串的指针等等 |
有看过我代码的朋友可能就会有疑问了,为什么我写的代码中关于变量的定义,特别是整数型的变量没有加前缀uc
us
ui
c
s
i
l
,而其它类型变量都会加上前缀,原因如下:
- 虽然这个一看名字就知道这个变量的类型定义和取值范围,但是通常情况下变量定义后在后面的维护中可能为了增大或减少取值范围,会改变类型的定义,但又不同时重命名变量,导致后来再看就会有异议
- 目前的大部分编程软件将鼠标放置在变量上,通常就会提示该变量的类型定义,所以也不需要特意按照这个命名
- 大部分只有整数型的变量定义后才会因为取值范围受限而改变类型定义,而其他类型的定义之后基本不会随意变动
是指混合使用大小写字母来构成变量和函数的名字,每个单词的第一个字母都大写,又叫大驼峰式命名法;
1PrintEmployeePaychecks
使用下划线( )连接组成的标识符,即 单词(字母或数字) 单词(字母或数字)_单词(字母或数字)
1print_employee_paychecks(); // 函数
2int min_value = 0; // 变量
根据不同场景使用不同命名规则,甚至组合使用,业内比较常用的方式。
驼峰命名法,有时也使用下划线命名法,根据不同情况使用,尽量和之前的保持一致
因为不同系统对文件名大小写处理会有所不同(如Windows系统不区分大小写,但是Linux系统则区分)
匈牙利命名法 + (小)驼峰命名法两种结合使用
具体规则是:属性+类型+描述( 驼峰命名法)
- 使用名词或者形容词 + 名词方式命名变量(描述),如
char szFile[20] = "file";
int fileSize = 0;
- 禁止使用单字节命名变量,但允许定义
i
、j
、k
等作为局部循环变量
大写 + 下划线命名法
- 对于数值或者字符串等等常量或者枚举的定义,全部采用全大写字母,单词之间加下划线“_”的方式命名。如
#define MIN_VALUE 5
- 除了头文件或编译开关等特殊标识符定义,宏定义不能使用下划线“_”开头和结尾(一般来说,下划线开头或结尾的宏都是一些内部的定义)
帕斯卡命名法(大驼峰命名法),对于对外提供的接口函数,则加模块前缀
- 以函数要执行的动作命名,一般采用动词或者动词+名词的结构,且符合帕斯卡命名法
- 对于对外提供的接口函数,一般加上模块前缀
LED_
,如LED_CtrlOff(…)
除了上述规则外,关于以上标识符的命名还应该符合以下规则:
1、标识符的命名要清晰、明了,有明确的含义,同时使用完整的单词或大家基本可以认同和理解的缩写,避免让人产生误解
如:良好的命名:
int error_number;
不好的命名:int n, nerr;
2、标识符的长度应当符合“min-length && max-information”原则
如:几十年前老ANSI C规定名字不准超过6个字符,现今的C++/C不再有此限制。一般来说,长名字能更好地表达含义,所以函数名、变量名、类名长达十几个字符不足为怪。那么名字是否越长越好?不一定,例如变量名
maxval
就比maxValueUntilOverflow
好用
3、除了常见的通用缩写外,不使用单词缩写,不得使用汉语拼音
较短的单词可以通过去掉“元音”形成缩写,较长的单词可取单词的头几个字母形成缩写,一些单词有大家公认的缩写,常用单词缩写必须统一。协议中的单词缩写与协议保持一致,对于某个系统使用的专用缩写应该在注释或者某处做统一说明
4、用正确的反义词组命名具有互斥意义的变量或相反动作的函数等
如:
add
/remove
,begin
/end
,creat
/destroy
等
5、尽量避免名字中出现数字编号,除非逻辑上的确需要编号
6、重构/修改部分代码时,应保持和原有代码风格保持一致
根据源代码现有的风格继续编写代码,有利于保持总体一致
全部0条评论
快来发表一下你的评论吧 !