四种基本的编程命名规范(下划线命名法、匈牙利命名法、驼峰式命名法、帕斯卡命名法)和可读性更高的代码规范20200926
一个软件的生命周期,80%的时间在维护。
当你查看源代码的时候,是否突然冒出一个念头,想问候此前贡献这段代码的程序员?!问候的冲动?!
那么,怎样才能不被后人问候?
四种基本的编程命名规范(匈牙利命名法、驼峰式命名法、帕斯卡命名法、下划线命名法)。
@@@首要原则:不要害怕过长的变量名。代码风格的宗旨就是直观,简洁,最关键的是高可读性。
WhenIWriteLongNamesWhichAreEasilyKnown
谷歌 C++ 编程规范,从项目的命名到文件的命名,再到类和变量以及宏定义的命名都做到了细致入微,充分的结合了下划线命名法与驼峰式命名法(早先推崇的小驼峰,不过近年好像改成大驼峰了),又加入了一些新的元素,十分的系统完善。
通常每种语言都有自己的 Coding Style, 比如 C/C++ 和 python 是下划线, java 和 go 是驼峰。
@@@(1)下划线命名法。(最大的好处是迅速直观区分“保留字”和自定义“变量”)
下划线命名法并不如大小驼峰式命名法那么备受推崇,但是也是浓墨重彩的一笔。尤其在宏定义和常量中使用比较多,通过下划线来分割全部单词。
该命名规范,也是很简单,要求单词与单词之间通过下划线连接即可。
@@@(2)帕斯卡命名法。大驼峰式命名法。(主流)。
帕斯卡命名法,又叫大驼峰式命名法、Pascal命名法。
与小驼峰式命名法的最大区别在于,每个单词的第一个字母都要大写。
@@@(3)驼峰式命名法。
驼峰式命名法,又叫小驼峰式命名法(所以自然就存在大驼峰命名法啦……)。
该命名规范,要求第一个单词首字母小写,后面其他单词首字母大写,简单粗暴易学易用。
@@@(4)匈牙利命名法。(淘汰)。
举例来说,表单的名称为form,那么在匈牙利命名法中可以简写为frm,则当表单变量名称为Switchboard时,变量全称应该为 frmSwitchboard。这样可以很容易从变量名看出Switchboard是一个表单,同样,如果此变量类型为标签,那么就应命名成 lblSwitchboard。可以看出,匈牙利命名法非常便于记忆,而且使变量名非常清晰易懂,这样,增强了代码的可读性,方便各程序员之间相互交流代码。
属性部分:
g_ 全局变量
c_ 常量
m_ c++类成员变量
s_ 静态变量
类型部分:
数组 a
指针 p
函数 fn
无效 v
句柄 h
长整型 l
布尔 b
浮点型(有时也指文件) f
双字 dw
字符串 sz
短整型 n
双精度浮点 d
计数 c(通常用cnt)
字符 ch(通常用c)
整型 i(通常用n)
字节 by
字 w
实型 r
无符号 u
描述部分:
最大 Max
最小 Min
初始化 Init
临时变量 T(或Temp)
源对象 Src
目的对象 Dest
@@@@@其他规范:
@@@(1)合理使用空格。
等号两边用空格。如:int a = 100;
参数之间用空格。如:test(int a, int b, int c)
语句末的分号与前面内容不要加空格。如:test(a, b, c);
@@@(2)合理使用括号。
用括号分隔子表达式,不要只靠默认优先级来判断。((a && b) || (c && d))
用括号分隔if/while/for等语句的代码块,那怕代码只有一行。
@@@(3)合理缩进。
每一级都正常缩进,用tab缩进取代空格缩进。历史上用空格缩进的目的是防止代码因编辑器的tab宽度不同而变乱,现在这个担心现在是多余的 了,代码编辑器都支持tab宽度设置了。如果代码缩进的层次太多(比如超过三层),则可能是代码设计上出了问题。
@@@(4)以对象为中心。
采用“主语(对象)+谓语(动作)”的形式来命名,取代传统的“谓语(动作)+宾语(目标)”的形式。
如:dlist_append。
@@@(5)代码注释。
注释最好是英文,实在不行就用拼音,可以有效避免乱码问题、编码错误问题、标点符号问题。
例如:遇到编译不通过,报的行号完全没有错误的,这行删掉重新输入一遍就好了的问题?就是编码错误问题。
qishi wo xihuan pinyin xie,meiyou bianma wenti,hai bu yong qiehuan shurufa。
@@@(6)不要使用o(字符O的小写,很容易以为是数值0),1(字母L的小写,也和数值1容易混淆),作为变量名和首字母。
@@@(7)花括号一定独占一行。
微软官方推荐的是花括号应该独占一行,不与任何语句并列。
@@@(8)命名空间应该按照字母音序排列,这样做的目的在于方便在引入的多个命名空间中直接快速的找到命名空间。
@@@(9)应该使用 User.Name,“.”即中文的“的”的意思。
GNU C风格是如下这种规范:
For the body of the function, our recommended style looks like this:
if (x < foo (y, z))
haha = bar[4] + 5;
else
{
while (z)
{
haha += foo (z, z);
z--;
}
return ++x + bar ();
}
GNU C风格不但要求大括号前后各控两格,还要求使用tab符号,且一个tab代表8格。
@@@(10)各层命名规约:
@@A) Service/DAO 层方法命名规约
1)获取单个对象的方法用 Get 做前缀。
2)获取多个对象的方法用List做后缀,如:GetOrdersList。
3)获取统计值的方法用 Count 做后缀。
4)添加或更新的方法用 Save或Add。
5)删除的方法用 Remove/Delete。
6)修改的方法用 Update。
@@B) 领域模型命名规约
1) 实体对象:如UserInfo,UserInfo即为数据库表名。
2) 数据传输对象:xxxDTO,xxx 为业务领域相关的名称。
3) 展示对象:xxxViewModel,xxx 一般为网页名称。
@@@此外,命名规则还有:
变量名不要以数字开头;
变量至少有两个音节,
变量名要语义化(看其名,知其意);
从变量名可明确知道其作用域;
全局变量用 const 定义,常量性质,字母全部大写(尽量少定义);
变量名使用a - z、A - Z、0 - 9、下划线和$符号;
当变量作用域是整个模块时使用驼峰式(模块名字空间的所有地方都可以访问该变量);
当变量作用域不是整个模块时使用下划线 (模块名字空间内的某个函数的局部变量);
确保所有模块作用域内的变量名至少有两个音节,并能明确展示其作用域,就会很清晰,例如下:
用户中心 ⇒ userCenter
商品列表 ⇒ goodsList
消息通知 ⇒ messageInfo
每级代码头部缩进两个空格,
每行代码长度限制为78个字符,
这也是大厂通用写法,最为标准。
按逻辑段落组织代码,段落之间要空行,
每一行最多只包含一条语句或赋值语句,但是允许每行同时声明多个变量;
运算符和变量之间要有空格,更容易地识别变量;
每个逗号之后要有空格;
在段落内,相似的运算符要对齐;
缩进注释,缩进量和所解释的代码相同;
在运算符的前面换行,检查更加方便;
把后续的语句缩进一个层次,比如使用两个空格;
使用尾部逗号,在逗号分隔符的后面换行;
方括号或者括号单独占一行。清楚地表明这是语句的结尾,不会迫使读者横向扫寻分号;
将长度进行存储,之后循环无需再去读取长度。避免每次循环都要去读取一次数组的长度。
(一)好的代码如下:
for (let i = 0, j = arr.length; i < j; i++) {
// do something...
}
(二)更好的代码如下,又节约了一个变量:
for (let i = arr.length - 1; i >= 0; i--) {
// do something...
}
(三)不好的代码如下:
for (let i = 0, j = arr.length; i < j; i++) {
// do something...
}
@@@@@Python命名规范:@
模块名和包名采用小写字母并且以下划线分隔单词的形式;
如:browser_driver
类名或异常名采用每个单词首字母大写的方式;
如:BasePage, KeyboardInterrupt
全局或者类常量,全部使用大写字母,并且以下划线分隔单词;
如:CONSTANT_NAME
其余变量命名包括方法名,函数名,普通变量名则是采用全部小写字母,并且以下划线分隔单词的形式命名。
如:my_func
以上的内容如果是内部使用的,则使用下划线开头命名。
如:_verify_status, _num, _ClassName