选择好的变量名
前注:希望我的读书笔记能带你快速翻过30页的《代码大全》,若有不妥之处,恳请指正。这部分很基础,但也是最常用的,不要小看哦~
对于码农来说,给变量取名是家常便饭,除了必须要遵循的命名规定外(C/C++/Java要求只能用字母、下划线和数字组成变量名,且开头不能是数字,不能与关键字重名等),还有很多“建议”去研究,不要小看这些“建议”,他们是你从菜鸟成长为编程高手的必经之路。
1. 常用的命名规则
在程序中,有变量(全局,局部,类成员变量,常义变量),有类(自定义或标准库),有函数(也叫做方法),那么怎样区别他们呢?通过上下文区分是最可靠的方式,然而这不是直观的,直观的方法是干脆从命名规则上就加以区分。一般地,局部变量用小写字母开头,后面的词用大写字母开头,比如smallCake,whiteBirdWeight等,全局变量加上g的前缀,表示为g_smallCake等,类成员变量用m_前缀,如m_whiteBirdWeight,常义变量初始化后值就不能改变的变量,在C++中,这些变量通常是这样定义的:const int ITER_AMOUNT = 5,这有些类似于宏定义,全部都用大写字母,用下划线作分隔符;类开头即用大写,如SheepClass,Weather等;函数定义同类,也是开头大写,不用担心与类区分不开,因为C/C++/Java等编程语言要求调用函数一定要在末尾加上括号的,即使这个函数一个参数也不要用,如AddNumber()等。
2. 命名不能太短
比如x,xx,x1这样的变量能说明什么?还有初学者喜欢用的a,b,c……这些毫无意义的变量名会让你的程序可读性大大下降。
3. 命名不要太长
比如班级总人数表示成numberOfPepleInAClass,这样的长词组写第一遍时可能还行,但写第二遍,第三遍……到后来你都嫌麻烦了,若没有自动补齐的插件,很容易拼写出错。
4. 有意义 Vs 长度
命名太短使变量无意义,命名太长又不利于编程(敲击键盘累人),那么到底该怎么命名呢?这是一个需要权衡的问题,方法是用尽量短的单词来描述变量,同时使之有意义,别的程序员看到你的变量就知道它的用途了。比如班级总人数可以表示成totalPepleInClass,既简单明了,又能体现变量的含义。
5. 以问题为导向
比如员工数据记录作为一次运算的输入,你可能会命名为inputRecord,这个输入有多个呢?你会编号为inputRecord1,inputRecord2……吗?到后来可能你自己也不知道哪对哪了。所以不要针对计算机来命名,命名应该反映出问题本身。员工数据记录命名为employeeData最好了,这样万一还有一个雇主的数据记录,就可以用employerData来代替inputRecord2了。
6. 保持一致性
在命名时,经常会有命名成AB还是BA的问题,比如总人数可以命名成totalPeple,也可以命名成peapleTotal,到底该怎么办呢?这没有硬性的规定,到底怎样写取决于你,但要保持前后一致。比如你前面用了totalPeple,后面就不要用revenueAverage了,而要用averageRevenue。
7. 循环下标命名
我们很喜欢用i或者j来作为循环下标,比如for(int i = 0; i < 10; ++i){…}这样的循环语句,这样做很正常,因为i只在这个循环内用,有时用作计数,有时用于数组下标的索引。但双重循环呢?
for(int i =0; i <10; ++i)
{
for(int j = 0; j < 2; ++j){…}
}
这样做勉强也是可以的,但双重循环时最好还是将i或j换成一个有意义的名字。一个简单的例子是遍历二维矩阵,可以用rowIndex代替i,可以用columnIndex代替j。
8. 临时变量也应有一个有意义的名字
我们经常喜欢把些临时变量命名为temp,比如计算一元二次方程根的时候,用temp=sqrt(b^2-4ac),但这样其实不好,用discriminant(判别式)来代替temp,读你程序的人会立刻明白这个临时变量的含义(除非他不认识这个单词,哈哈)。
9. 布尔变量不要用flag
码农们也喜欢用flag来表示布尔变量,用于设置标志,但这样其实是很模糊的,因为不知道这个标志是用于什么的,而且一旦程序中出现不止一个标志,flag的命名容易引起冲突。《代码大全》上推荐用的是诸如done,error,found一类的布尔变量(或者像isDone,isError,isFound),这样不用解释,读者就清楚这类标志是大致意思了。布尔变量不要用否定形式,比如说notFound这类,if(notFound)等条件判断常常把人绕晕,如果要用否定,就用!found吧。
最后摘抄一下书上的Key Points
(1) 好的变量名是提高程序可读性的一项关键要素;
(2) 名字要尽可能地具体,但也不要太长;
(3) 命名规则应该能够区分局部数据、类数据还是全局数据,要注意前后一致;
(4) 尽量不要用缩写,真的要用的话,就用大家熟知的,比如CCTV等;
(5) 代码的阅读次数远远多于编写的次数,所以确保你取的名字更侧重于阅读方便而不是编写方便。
<end>