[toc]
原则
选择描述性的词语,名称要能够描述它所代表的意思,要尽可能的存更多的意思。
检测
- 将名字告诉别人,如果别人的想到的和你考虑到的一样,那么代码可读性就可以了
- 将命名读出来,自己感受是否清晰
- 一段时间后再读自己的代码试试
命名规范
匈牙利命名法
匈牙利命名法是在 1972 年至 1981 年期间一个程序员发明的,这种规范的主要思想就是给变量加上一个表示变量类型的前缀。不过这种方法有其复杂的历史渊源,现在几乎快被淘汰了。
wiki:
在系统匈牙利命名法中,前缀代表了变量的实际数据类型
ex:
int iMyData;
下划线命名法
下划线命名法使用下划线分割单词,这种规范在 c 语言中使用得比较多。
ex:
int my_data;
驼峰式命名法
驼峰式命名法又叫小驼峰式命名法,这种规范要求第一个单词的首字母小写,后面其他单词首字母大写
ex:
int myData;
帕斯卡命名法
帕斯卡命名法,又叫大驼峰式命名法。
与小驼峰式命名法的最大区别在于,每个单词的第一个字母都要大写。
ex:
int MyData;
建议
选择专业的词语
对特定领域的操作,使用这个领域的专业词汇。
例如操作 Thread ,使用 Stop() 显然有让它 start 的意思,但是根据情况也有不同的可能,可能是彻底 kill,也可能是暂时 pause,所以使用后者 kill() 或 pause() 这种专业操作 thread 的更加准确。
避免使用空洞的词语
如 tmp, result 这种很常见,但是实际上并没有包含有用的信息的词语,要避免使用。
选择合适的长度
我们给代码命名的原则都是为了增加可读性,因此一般只要能准确表述其意,稍微长些是没什么问题的,何况现在的代码补全工具非常发达。具体选择怎样的长度显然是没有一个硬性规定的,但是有一些建议:
作用域越大,一般命名更长
如果单词有常见的缩写,那么使用这些缩写(见副表),如
msg表示message如果单词没有常见的缩写,那么就不要缩写。
有目的的使用特定的前后缀、下划线, 如给
password加上plainText_表示其未加密的状态
避免使用具有二义性的词语
- 用
min_或max_前缀表示极限 - 用
first_或last_前缀表示包含的范围 - 用
begin或end表示包含/排除的范围
避免使用相似的字符
如 I 和 1, 0 和 o, 0 和 O, S 和5 , G 和 6
避免变量名使用数字
这一点并不是一定的,但是像那种表示数目的添加数字,如 str1, str2, str3,请避免这样写,如果它们之间的确有关系,请使用数组来区分,如果没有关系,更不要使用这种难以取分的名词,最好使用能描述它们本来意义的词语。
特殊类型
布尔值
原则:使用非真即假的名字给布尔值命名。
如 status,就不只非真即假,那么使用这个作为名字是不合理的,我们可以给它加后缀,变成 statusOk, 就显然只有两种值了。
加前缀
如果表示是不是,加前缀
is如果表示有没有,加前缀
has如果表示能不累,加前缀
can
加后缀
- 如果词语不是形容词,则变为形容词,如加 able
- 如果表示已经完成,则加 Done 或 complete 或 Sucess 或 Ok
- 如果表示找到某个值,则加 Found
- 如果表示发生了错误,则加 Error
循环变量
通常使用 i, j, k 等字母作为循环变量,如果迭代的次数比较少,比如一、两次,那么使用这些是没有问题的,因为这是约定俗成的,大家都知道它们代表什么。但是迭代的次数多起来之后,或则我们在循环外也需要使用这些变量,那么我们就很难直接看出它代表什么。
- 对于迭代次数较多,如下:
for (i = 0; i < clubs.size(); i++)
for (j = 0; j < clubs.members.size(); j++)
for (k = 0; k < users.size(); k++)
if (club[i].members[k] == users[j])
在 if 语句中, 显然 members 和 users 用错了索引,但是这种逻辑错误并不是语法错误, Ide 很难检查出来。
对于像这种多层迭代的索引,建议把每个索引的位置加在命名中。如 clubsIndex, membersIndex, usersIndex, 或
clubsI, membersI, usersI, 或更加简洁 ci, mi, ui。 当然,你也可以把 i 变为前缀表示索引,如 ic, im, iu。这样做大大的增加了索引的可读性。
- 对于迭代外需要使用的,如:
for i, k := range "Hello" {
//
}
对于这种情况,最好按照普通的变量那样命名,即将使用描述性的语句表达出变量的意义。如此处,i 表示 index, k 表示 value, 我们可以直接命名为 strIndex, strValue
常量
不同编程语言,不同的项目团队都有着不同的规范。对于常量的命名不同人也有不同规范。有人全用大写字母,也有人用驼峰式,google 的 c++ 约定常量加一个前缀 k。这个只要有规范并遵守就好,并不强求。
我个人一般加 _C 后缀表示常量。
暂时变量
暂时使用单首字母。如:
var u User;
全局变量
加上 g_ 前缀
枚举
加上 _e 后缀
文件命名
一般文件/文件夹的命名遵循以下规则:
- 全小写
- 使用下划线分割单词
特殊:
Makefile, README.md 等
ex:
my_test_file.go
Q&A
- 代码是越少越好吗?
代码过又臃肿的话显然效率不会太高,但是反之代码就越少越好吗?让我们看这段代码
- 我该使用什么命名规范?
实际不同于书本,并不存在某种方法能应对所有的情况。实际项目中一般是取多种规范的优点,再根据实际情况使用。推荐 public 变量和 public 方法使用帕斯卡命名法,private 变量和方法使用小驼峰式命名法。这种命名是现在项目比较常用的。
相关文章
参考书籍
- 《编写可读代码的艺术》
- 《代码大全》
- 《代码整洁之道》
检查表
- 名字完整并且准确的表达了变量所代表的含义吗?
- 名字足够长,可以让你无需苦苦思索吗?
- 如果有计算限定符,它被放在名字后面吗?
- 名字中用 Count 或者 index 来掉提 Num 了吗?
- 循环变量的名字有意义吗?
- 所有临时的变量都重新命名为更有意义的名字了吗?
- 当布尔变量为真时,变量能准确表达其含义吗?
- 枚举中的名字含有能够表示其类别的前缀或者后缀吗?
- 命名常量是否代表的是实体而非其代表的数值?
- 命名规则能够区分局部数据,类的数据和全局数据吗?
- 名字能够读出来吗?
- 名字没有无法辨别的字符吗?
常见缩写表
| 缩 写 | 全 称 |
|---|---|
| addr | address |
| adm | Administrator |
| app | application |
| adm | administrator |
| arg | Argument |
| asm | assemble |
| asyn | asynchronization |
| avg | average |
| bk | back |
| bmp | bitmap |
| btn | button |
| buf | buffer |
| calu | calculate |
| chg | change |
| clk | click |
| clr | color |
| cmd | command |
| cmp | compare |
| col | column |
| coord | coordinates |
| cpy | copy |
| ctl/ctrl | control |
| cur | current |
| cyl | cylinder |
| char | character |
| dbg | debug |
| db | database |
| dbl | double |
| dec | decrease |
| def | default |
| del | delete |
| dest/des | destination |
| dev | device |
| dict | dictionary |
| diff | different |
| dir | directory |
| disp | display |
| div | divide |
| dlg | dialog |
| doc | document |
| drv | driver |
| dyna | dynamic |
| dlg | dialog |
| env | error |
| ex/ext | extend |
| exec | execute |
| flg | flag |
| frm | frame |
| func/fn | function |
| grp | group |
| horz | horizontal |
| idx/ndx | index |
| img | image |
| impl | implement |
| inc | increase |
| info | information |
| init | initial/initialize/initialization |
| ins | insert |
| inst | instance |
| intr/INT | interrupt |
| len | length |
| lib | library |
| lnk | link |
| log | logical |
| lst | list |
| max | maximum |
| mem | memory |
| mgr/man | manage/manager |
| mid | middle |
| min | minimum |
| msg | message |
| mul | multiply |
| num | number |
| obj | object |
| ofs | offset |
| org | origin/original |
| param | parameter |
| pic | picture |
| pkg | package |
| pnt/pt | point |
| pos | position |
| pre/prev | previous |
| prg | program |
| prn | |
| proc | process/procedure |
| prop | properties |
| psw | password |
| ptr | pointer |
| pub | public |
| rc | rect |
| ref | reference |
| reg | register |
| req | request |
| res | resource |
| ret | return |
| rgn | region |
| scr | screen |
| sec | second |
| seg | segment |
| sel | select |
| src | source |
| std | stqandard |
| stg | storage |
| stm | stream |
| str | string |
| sub | subtract |
| sum | summation |
| svr | server |
| sync | synchronization |
| sys | system |
| tbl | table |
| temp/tmp | temporary |
| tran/trans | translate/transation/transparent |
| tst | test |
| txt | text |
| unk | unknown |
| upd | update |
| upg | upgrade |
| util | utility |
| var | variable |
| ver | version |
| vert | vertical |
| vir | virus |
| win | window |