可读性:★★★★✰ 理解难度:★★★✰✰
概要
让读你代码的人感觉到开心!
编码一小时,命名半小时,是什么让我们如此纠结,我认为最大的问题是语言的限制,如果让我们用中文命名也许没这么难,多积攒一些词汇量,做到更好吧!
起初按规范命名确实会花一些时间,但是请坚持下去,让自己的代码变得像散文一般优美吧。
1. 名副其实
名称表明用途,如果名称需要注释来补充,那就不算名副其实。
bad:
let d; // elapsed time in days
good:
let elapsedTimeInDays;
bad:
getList() {
let list1 = []
theList.forEach(item => {
if (item === 4) {
list1.push(item)
}
})
return list1
}
good:
const FLAGGED = 4 // 常量注释
getFlaggedCells() {
let flaggedCells = []
gameBoard.forEach((cell) => {
if (isFlagged(cell)) {
flaggedCells.push(cell)
}
})
return flaggedCells
}
isFlagged(cell) {
return cell === FLAGGED
}
为了使代码更加清晰,还可以考虑对cell进行一次封装(es6)
const FLAGGED = 4 // 常量注释
class Cell {
constructor(positionNumber) {
this.positionNumber = positionNumber
}
isFlagged() {
return this.positionNumber === FLAGGED
}
}
export default Cell
2. 避免误导
bad
// 一个object或者map对象,用list来命名,容易产生误解
let accountList = {
'name': 'wang'
}
// 取的是宽度的值,用height来命名
let boxHeight = dom.clientWidth
3. 做有意义的区分
bad 1
let student = 'wang'
// 当需要声明“好学生”的时候,应该使用 goodStudent比较好,如果用如下声明就很糟糕
// 只把首字母s改成了a
let atudent = 'li'
bad 2
// a1, a2 没有意义
function(a1, a2)
// 这样会更好
function(target, source)
bad 3
// 这几个命名从意义上并没有什么区别
let product
let productInfo
let productData
// 像这样的区分,调用时根本不知道应该调用哪个方法
getActiveAccount()
getActiveAccounts()
getActiveAccountInfo()
4. 使用读得出来的名称
人类善于记忆和使用单词。
bad
// 生成日期、年、月、日、时、分、秒
const genymdhms = () => {}
// 这样会更好
const generateTimestamp
5. 使用方便搜索的名称
开发的过程中经常会使用到搜索功能,试想如果想搜索某一个变量在什么地方被引用到,怎样的命名会更方便。
bad
// 其中的5就不方便搜索
findRelaxCompany(company) {
company.workDays = 5
}
// 这样会更好
const WORK_DAYS_PER_WEEK = 5
findRelaxCompany(company) {
company.workDays = WORK_DAYS_PER_WEEK
}
6. 多余的前后缀
bad
// 使用名称说明类型
let booleanIsBlack = true
let numberStudentCount = 100
// 不必要的成员前缀
let student = {
studentName: 'wang',
studentAge: 10
}
// 或者
let student = {
attributeName: 'wang',
attributeAge: 10
}
// 在模块命名时,如下命名也不好,page前缀不需要加
--page
|
---pageHome
|
---pageLogin
// 这样更好
let student = {
name: 'wang',
age: 10
}
7. 类和方法命名
类:名词或名词短语。
方法:动词或动词短语。
命名时不要抖机灵,严谨。幽默的暗语可能没有人能理解。
8. 一致性
相同类型的概念,使用同一种约定,并且从一而终。
fetchUser getOrder retrieveUserFamily queryUserAddress
如果上面的方法都是表示从后端接口获取数据这一种场景,那么应该统一前缀,不应该在fetch、get、retrieve、query之间随意使用。
同样
如果generator、producer都表示生成器,那么就应该统一使用一种命名方式。
保持一致性,在使用编辑器检索功能时,将会带来极大的好处。
9. 使用通用的领域名称
只有程序员才会阅读你的代码,所以在命名时可以使用一些大家都共识的名称,比如计算机术语、算法名、模式名、数学术语。
比如:
CDN - Content Delivery Network
RAM - Random Access Memory
10. 添加语境
很少有名称能自我说明,所以你需要用命名良好的类、函数或名称空间来放置名称,给读者提供语境。如果不方便,给名称添加前缀是最后一招。
比如:state这个命名,你单独拎出来,可能不能明确它的意思,但是加上 addrState,就能知道它表示地址。
或者增加一个语境对象:
let address = {
state: 'xx',
city: 'yy'
}
本文参考《代码整洁之道》(Robert C. Martin著,韩磊译)。
浙江大华技术股份有限公司-软研-智慧城市产品研发部招聘高级前端,欢迎来撩,有意向可发送简历到chen_zhen@dahuatech.com,长期有效
上一篇:《一、整洁代码》
下一篇:《三、函数》