一、把信息装入名字中
1.选择专业的词
例1:使用getPage getName getData而不是单单是get这种空洞的词,更深来说可以用fetch()、download()这种词更好。
例2:
class BinaryTree{
int size();
}这里的size就是不明确的,没有承载很多信息。我们需要更专业的词比如height();nodeNum();等
例3:
class Thread{
void stop();
}对于stop我们也可以用更专业的词讲其具体化:比如pause() 、kill()、resume()
例4:找到更有表现力的词
比如对于发送send ,我们在不同情况下也可以使用不同的的词去更有表现力的表达。
在向下分发的时候可以使用dispatch,分配可以使用distibute,还有deliver,route等同样都是发送却🈶不同的表达力。
像start也有很多同义词,create、launch、begin、open等
2.避免泛泛的名字
像tmp retval,除非使用它们有特殊的理由
retval 就是表达一个没有很多信息的返回值
tmp这个名字只应用于短期存在且临时性为其主要存在因素的变量
对于 i,j,k这种可以表达式迭代器的使用,但是如果迭代器参数较多,可以更精确点,比如
if(club[ci].members[mi]==users[ui])
对于空泛名字,不是说不能使用,是要有一个理由。
3.用具体的名字代表抽象的名字
ServerCanStart()就不如CanListenrOnPort好
4.使用前缀和后缀来给名字附带更多的信息
为名字附带更多的信息:
- 带单位的值
start --start_ms
size--size_mb
limit--max_kbps - 附属你想表达的其他重要的属性
html---html_utf8
password----plaintext_password - 匈牙利表示法是一个在微软广泛应用的命名系统,它把每个变量的类型信息都编写进名字的前缀里,
比如pLast 表达某数据结构最后一个元素的指针p
比如cch 表达一个字符ch的计数count
比如psz表达一个以零结尾zero的字符串s的指针p
5.决定名字的长度
名字的长短应该和这个变量如何使用有关系。
- 在小的作用域可以使用短的名字,而如果一个标识符有较大的作用域,那么它的名字就要包含足够的信息以便含义更清楚。
比如一个变量的作用域在一个方法内,它是允许不用带上太多信息的。因为所有的信息(变量类型,初值等)都很容易被看到,所以可以用很短的名字
而如果定义的m只是一个全局变量中的类成员,那就不容易读了。 - 首字母缩略词和缩写
BEManager--BackEndManager 对于这种缩写是会让人费解的,让新成员阅读这种可能会不理解,所以要保证对于缩写的使用别人的易读的。
而doc替代document
str代替string 这种就是可以的, - 丢掉没用的词
ConvertToString()----ToString()这样有时名字中的某些词拿掉也不会损失任何信息就可以丢掉这种词
6.利用名字的格式来表达含义
类:名词,采用大驼峰命名法--所有单词的第一个字母大写,尽量避免缩写。ActivityManager
方法:动词或动名词,采用小驼峰命名法,除首单词外,其余所有单词的第一个字母大写
例如 onCreate()
变量:小驼峰命名法,可把统一的量词放在结尾处。
常量:下划线命名法,MIN_WIDTH
二、不会被误解的名字
不会被误解的名字是最好的名字,让阅读代码的人理解本意,不会有其他歧义。
例子1:filter("age<20");这就会让人误解,是挑出年龄小于20的还是把小于20的去掉 同样的还有limit
例子2:clip(text,lenght)---truncate(text,max_chars) length 也是会有歧义的 是字节数、字符数还是字数。
- 用min和max来表示包含极限 大于等于 少于等于 max_ min_ 是很好的前缀
- 用first和last来表示包含的范围
- 用begin和end来表示包含/排除范围
- 布尔值命名 通常来讲:加上像is、has、can、should这样的词,可以把布尔值变得更明确。