计算机领域的至理名言:
Phil Karlton: 计算机科学中只有两个难题:缓存失效和命名。——
Martin Flower:任何人都能写出计算机能够理解的代码,只有好程序员才能写出人能够理解的代码。
首先,看一个变量命名渐入佳境的过程:
/** bad */
const fruit = ['apple', 'banana'];
/** ok */
const fruitArr = ['apple', 'banana'];
/** good */
const fruits = ['apple', 'banana'];
/** great */
const fruitNames = ['apple', 'banana'];
/** prefect */
const fruits = [
{ name: 'apple', color: 'red' },
{ name: 'banana', color: 'yellow' },
];
变量的命名首先要「符合规范」,其次就是得「有意义」。
遵守命名约定
1. 用小驼峰形式命名
2. 常量可以采用全大写的形式,但普通的 const
修饰的变量不应该大写
3. 两个字母的缩略词都大写,大于两个则改小驼峰
IO
AppID
/** bad */
Io
APPID
4. 下划线的使用场景
下划线一般只用于私有变量,占位变量,常量:
this._myPrivateMethod = function () { /* ... */ };
const USER_AGE = 30;
命名有意义
1. 使用有意义的名称
- 命名要精确表意,不能太宽泛,更不能词不达意
- 同一个事物可能有多个单词适配,选最合适的
- 同一个词有多种含义
- 使用业务术语。应避免从电脑的视角去命名,而是应该从人类认识事物的角度去命名
- 尽量避免用缩略语
- 避免使用黑话。我知道你是业内大佬,但我是小菜菜
- 单词拼对。
getUserPosts
/** bad 含义过于宽泛,不精确 */
getUserData
getUserInfo
/** bad 不要用单个单词的变量,如果只是很小的范围内使用的临时变量则无大碍 */
global.d = new Date()
2. 保证语义完整的同时,尽量用词应精简
findUserByNameOrEmail
setUserLoggedInTrue
/** bad 选词应该尽量精简,但必须保证语义的确定性 */
findUser
getUserFriend
/** bad "FromDatabase" 提供了不必要附加信息,应精简掉 */
getUserFriendFromDatabase
3. 保证命名在上下文中意义明确,不冗余
Class Employee {
constructor (name) {
/** 本身就处在 Employee 上下文中,若使用 employeeName 会信息冗余 */
this.name = name;
}
}
/** 此处已经脱离了 Employee 上下文 */
const employeeName = new Employee('gavin').name;
4. 保证动词的统一性
常用的动词有:get、
set、read、create、add、update、reset、delete、
remove,尽量保证使用统一的动词:
/** 获取统一用 get */
getQuestion
getUserPosts
getUsers
/** 设置统一用 set */
setQuestion
setUserPosts
setUsers
5. 命名函数或方法
尽量采用动词或判断性词汇:
getFullYear() // 取值
toString() // 转换
isArray() // 判断
6. 命名布尔值(boolean)
布尔值一般用 is、
can、
has、
need、should
等助动词开头。返回布尔值的函数或方法,为避免函数名和变量名冲突的情况,以 check、get 动词 + is、
can、
has、
need、should 助动词开头
。
// isShow 是否显示
// checkIsShow 判断是否显示
const isShow = checkIsShow(args);
7. 命名类名(Class)
使用名词:
class Car { }
new User()
8. 命名数字(number)
首选有意义的简短命名,如 width或length或count,若无则采用 numberOfXXX xxxCount 之类的通用命名:
width
length
count
total
maxWidth
numberOfErrors
errorCount
9. 命名字典(Map)
推荐使用 valuesByKey 的方式:
/** values: users, key: id, => valuesByKey => usersByID */
const usersByID = {
id12345: { name: 'byted', age: 9 },
// ...
};