对于实际上手写代码的各位程序员而言,一个好的变量和函数命名标准是必不可少的,但现实情况是没有一种命名标准可以获得所有程序员的赞同。也正因如此,不同的人根据自身经验的不同会有自己独特的命名风格。
虽然没有具体通用的命名标准,但却有一些共性规则是获得大部分人认可的。下文会介绍本人长期总结的一些变量及函数命名的共性规则、并附带本人自身的命名风格(个人习惯)。
此文的编程语言以Python为例(可以少打很多变量类型,手动滑稽),也适用于C/C++、C#、Java、JavaScript、等其它编程语言。
此文适合没有自己独特命名风格的新手程序员阅读,当然,拥有独特命名风格的程序员也可以阅读进行借鉴,同时也希望各位可以给予一些可靠的建议。
命名最好采用英文单词及其组合,便于记忆和阅读。切忌使用汉语拼音来命名。
命名的用词应当准确,英文单词不要太偏僻,组合不要太复杂。
示例:
# 正确示例
maxValue
minValue
# 错误示例
qiCheShuLiang # 汉语拼音,应改为carNum
preeminentAlgorithm # 单词偏僻,应改为goodMethod
carRunWheelStaticFrictionForce # 组合复杂,应改为carSFriction或carSFrn,并添加适当的注释
命名时,若组合名过长,则其中的英文单词可以简写,并适当添加注释。
示例:
# Number简写为Num
# Value简写为Val
carNum
maxVal
carSFrn # 简写过多,含义不直观,需要添加注释,汽车轮子的静摩擦力
命名长度应当符合min_length && max_information
原则,即更短的长度且包含更多的信息。
一般来说,长名字能更好地表达含义,所以命名长达十几个字符不足为怪。但命名并不是越长越好,因为不好理解,例如变量名maxVal
就比maxValueUntilOverflow
要好得多。单字符的命名也很常见,例如i, j, k, m, n, x, y, z
等,它们通常可用作循环便利或函数内的局部变量。
若名字过长,可适当缩减,解决方案有2个,第1个是挑选关键词,第2个便是上文提到的单词简写。
驼峰命名指每个单词遵循驼峰大小写规律,开头单词首字母小写,后续单词的首字母大写,用来区分不同的单词。
示例:
maxValue
roomDeskNum
下划线命名是不同于驼峰命名的方法,每个单词之间由下划线连接,通常用于所以字母都是小写或都是大写的情况。推荐C/C++的常量都用大写字母。
同理,可以用连词符代替下划线,即连词符命名,效果和下划线命名类似。
推荐使用下划线命名,因为连词符有时会因此含义冲突,从而大部分人喜欢使用下划线命名。
示例:
# 下划线命名(推荐)
first_name
MAX_VALUE
# 连词符命名
first-name
MAX-VALUE
用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
示例:
# 变量
minValue
maxValue
# 函数
SetValue()
GetValue()
错误示例:
# 变量x与X容易混淆
x = 5
X = 10
# 函数get与GET容易混淆
def get(x):
def GET(x):
程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。
尽量避免命名出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这样可以使代码逻辑提升,避免混乱。同时也是为了防止程序员偷懒,不肯为命名动脑筋(因为用数字编号最省事)。
为了防止自己编写的库中的一些标识符和其它软件库有冲突,可以为各标识符加上能反映库性质的前缀。
示例:
OpenGL中所有库函数均以gl开头,所有常量(或宏定义)均以GL开头。
OpenCV中所有的库函数均以cv开头。
同一项目的所有脚本应当保持一致的风格,方便后续解读和修改。
命名含义不直观或有混淆时,需要添加注释。
一般在定义变量时进行注释。使用过程中,重要位置或混淆位置也可适当添加注释。
示例:
maxValue # 最大值
minValue # 最小值
方案1(推荐):变量名和函数名都遵循驼峰命名
这样命名比较统一。变量名的前缀为名词,函数名的前缀为动词,这样可以让变量和函数区分开来。
但不绝对,转换类函数的前缀可以为名词,如xml2json()
,同时也可以不遵循驼峰命名,因为2个单词被2(To)
隔开了。
方案2:变量名和函数名都遵循下划线命名
这样命名也比较统一。Python代码推荐此种方式命名变量和函数,因为Python代码会提示变量名和函数名使用小写字母。
方案3:变量名遵循驼峰命名,函数名遵循下划线命名
这样命名不统一,但较好区别变量和函数。
总结
区别变量和函数可以通过括号判断,后面没有括号的是变量,有括号的是函数,这样既方便又准确,因此没必要仅通过名字区分变量和函数,所以使用上述几种方案均可,都不会影响到变量和函数的区分。Python推荐下划线命名法。
示例:
# 变量
carNum
# 函数
getCarNum()
xml2json() # 转换类函数的前缀可以是名词,
文件和文件夹命名推荐使用下划线+小写字母命名法,每个单词之间由下划线连接,所有单词都是小写字母。值得一提的是文件夹名称一般由1个单词组成,若需细分可以创建子文件夹,若文件夹名称由多个单词组成,可使用下划线命名法。
补充:若不喜欢使用下划线命名法,也可使用连词符命名法,效果和下划线类似。
示例:
/img/icon # 子文件夹
/img_icon # 下划线文件夹
create_list.py # 脚本文件
car_new.jpg # 图像文件
(此处以C++为例)
类名首字母大写+驼峰命名,变量和函数首字母小写+驼峰命名。对于成员数据和成员函数,首字母小写+驼峰命名。若函数名的单词数量较多,也可以使用小字母+下划线命名法。
示例1:
// 类名
class Node;
class LeafNode;
示例2:
// 类名
class Point
{
private:
// 成员数据
int xPos;
int yPos;
public:
// 成员函数
void setPoint(int x, int y)
{
xPos = x;
yPos = y;
}
void printPoint()
{
cout<< "x = " << xPos << endl;
cout<< "y = " << yPos << endl;
}
};
常量
常量全用大写的字母,用下划线分割单词。
示例:
const int MAX = 100;
const int MAX_LENGTH = 100;
静态变量
静态变量加前缀s_(表示static)。
示例:
void Init(){
static int s_initValue; // 静态变量
}
全局变量
如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。
示例:
// 全局变量
int g_peopleNum;
int g_carNum;