【高质量C/C++】3.命名规则
【高质量C/C++】—— 3. 命名规则
目录
- 一、命名规则
- 二、共性规则
- 三、简单的Windows应用程序命名规则
一、命名规则
在命名规则中比较著名的是Microsoft公司的“匈牙利”法,该命名规则的思想是 “在变量和函数名中加入前缀,以增进人们对程序的理解?。如所有字符以ch
为前缀,指针追加前缀p
,如果一个变量由ppch
开头,则表明他是指向字符指针的指针。
“匈牙利”法最大的缺点就是烦琐,如:
int i, j, k;
float x, y, z;
// 匈牙利法
int iI, iJ, iK; // 以i为前缀
float fX, fY, fZ; // 以f为前缀
这样烦琐的程序会让绝大多数程序员无法忍受。
根据考察,没有一个命名规则可以让所有的程序员赞同,程序设计教科书一般都不指定命名规则。命名规则对于软件产品而言并不是成败攸关的事,我们不必花太多精力试图发明世界上最好的命名规则,应制定一个让大多数程序员都满意的命名规则。
二、共性规则
共性规则是大多数程序员采纳的,我们应当先遵循共性规则前提下,在扩充特定的规则
规则:
- 标识符的内容:
- 标识符直观并且可以拼读,可以望文知意。标识符最好采用英文单词或其组合,便于记忆和阅读。切记不要使用汉语拼音来命名。
- 变量的名字应使用名词,或者形容词+名词
- 全局函数的名字应使用动词或动词+名词,类的成员函数应当只使用动词,被省略的名词就是对象本身。
int age = 18; // 年龄
int nianling = 18; // 年龄,不良的风格
int newValue = 0; // 变量名
int Add(int a, int b); // 全局函数名
box->Draw() // 类的成员函数
- 标识符的规则:
- 标识符长度应符合一个特定的范围。长标识符可以更好的表达大含义,但是过长的标识符也会影响阅读。单字符名字也是有的,如i、j、k、m、n、x、y、z等在特定场景下有特定含义的。
- 命名规则尽量与操作系统或开发工具的风格保持一致。如Windows应用程序的标识符通常采用大小写混排的方式,而Unix应用程序标识符通常采用小写加下划线的方式。
int maxVal = 10; // 变量名
int maxValueUntilOverflow = 10; // 过长的变量名
for (int i=0; i<n; i++) // 单字符名字i
;
void AddChild(... ...); // Windows标识符风格
void add_child(... ...) // Unix标识符风格
- 多个标识符的命名规则:
- 程序中不要出现只靠大小写区分的相似的标识符
- 程序中不要出现标识符完全相同的局部变量和全局变量,尽管二者作用域不同而不会发生语法错误,但会使人误解
- 用正确的反义词组命名具有互斥意义的变量或相反动作的函数的。
- 尽量避免名字中出现数字编号,除非逻辑上需要编号,无意义的数字编号命名会严重影响阅读性
int x, X; // 不良的风格,大小写不易区分
// 不良的风格,全局变量名和局部变量名冲突
int name;
void test(void)
{
int name;
}
int max, min; // 良好的风格
// 良好的风格
int SetValue(... ...);
int GetValue(... ...);
// 不良的风格
int value1;
int value2;
int value3;
三、简单的Windows应用程序命名规则
规则:
- 类名和函数名用大写字母开头的单词组合而成
- 变量和参数用小写字母开头的单词组合而成。
- 常量全用大写字母,用下划线分割单词。
- 静态变量加前缀
s_
- 如果不得已要用全局变量,则全局变量前加前缀
g_
- 类的数据成员加前缀
m_
,这样可以避免与成员函数的参数同名,但是对于现在这个时代,一般情况下我们在成员变量前加上_
就可以了,对于一些特定的公司,也可能会要求你加在后面 - 为了防止软件库的标识符和其他软件库冲突,可以为各种标识符加上能反映软件性质的前缀。如三维图形标准OpenGL所有的库函数均以
gl
开头,所有常量均以GL
开头
int g_value; // 全局变量
class Node // 类名
{
public:
void SetValue(int value);
private:
int _value; // 成员变量
bool _flag;
}
void Node::SetValue(int value) // 函数名
{
static int s_value; // 静态变量
const int MAX_LENGTH = 100; // 常量
bool flag; // 变量
int drawMode;
}