二、有意义的命名

525 阅读4分钟

可读性:★★★★✰ 理解难度:★★★✰✰

概要

让读你代码的人感觉到开心!

编码一小时,命名半小时,是什么让我们如此纠结,我认为最大的问题是语言的限制,如果让我们用中文命名也许没这么难,多积攒一些词汇量,做到更好吧!

起初按规范命名确实会花一些时间,但是请坚持下去,让自己的代码变得像散文一般优美吧。

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,长期有效

上一篇:《一、整洁代码》

下一篇:《三、函数》