There are only two hard things in Computer Science: cache invalidation and naming things. 计算机科学领域只有两大难题:缓存失效和命名。 -- Phil Karlton
相信不少程序员都为变量命名这个问题伤透了脑筋。变量名太短了别人看不懂,太长了又显得啰嗦,不长不短又考验词汇量,一不留神就跟已有变量名重复。取得一手好名字确实是一个挑战,也是一门艺术。今天我们就来聊聊,到底要怎样命名,才能显示出水平?
不同的编程语言有不同的具体命名规范,通常包含在语言的风格指南里。本文不打算讨论各种语言的代码风格问题,只讨论跟具体语言无关的命名准则。
从本质上来说,变量名只是个标识符,用于表示内存中的一个地址或者数据。按理说只要符合编程语言的语法规则,无论怎么命名都不会影响代码的执行结果。那为什么我们还要强调命名规范呢?记得有人说过,代码首先是给人看的,其次才是计算机。代码在执行前,通常要经过作者深思熟虑的编写,甚至同行评审(code review)过后,确保没有明显的问题才会交给计算机执行。计算机只负责编译执行,才不管你的代码写得好不好看,有没有逻辑问题,扩展性如何等等。从这个角度说,良好的命名规范可以提高代码质量,减少软件缺陷。
良好的命名具有自文档的作用,看变量名就知道代表什么含义。无论对于团队成员协作还是自己维护代码,都很有意义。否则就会出现下面这种尴尬的局面:
在生活中,漂亮的人名让人赏心悦目,还有着丰富的含义,让人印象深刻。虽然说给变量命名不需要这么高的文学水准,但是也要具备一些基本的要素。个人认为,好的变量名通常具备以下几个特点。
function iCanNotReadTheNumberSoIWriteThisFunctionToTransformStringsToNumber() {
}
这有点夸张了。记住一个原则:在足够表达含义的前提下尽量简短。
for
循环里用的i
变量,已经约定俗成了,属于作用域范围很小的局部变量,用完即丢。这种情况可以使用简洁的命名。data
,item
,list
等,虽然也能用,但是含义太泛了,不够具体。更好的名字是userProfile
,orderItem
,bookList
等,一眼就能看出所代表的业务模型。render
,isPrototypeOf
,toString
,getOrders
等。说到这里可能有人觉得有点装X了,是不是要把英语老师请过来?其实也不必过分解读,只要记住一个原则就行了,那就是方法代表了一个操作。这样你就不会用一个名词当做方法名。属性名通常使用名词,形容词,动词过去式等。类名基本用名词,代表了一种业务模型。isModify
,isDelete
这种表达方式了,看得我尴尬癌都犯了。这种写法,内部几个人的项目也就罢了,如果是开源项目,拿出去都丢人啊!以我多年的搬砖经验,见过一些在命名方面比较讲究的框架和库,比如微软的 .Net Framework,C# 的命名,用词准确、精炼,看起来就很舒服。还有就是 Vue.js,API 命名也相当优雅。那几个钩子函数,created
,mounted
,destroyed
,activated
,errorCaptured
等等,简洁而不失准确,词义相当到位。而相比之下,React 就稍差了。什么componentDidMount
,componentWillMount
,shouldComponentUpdate
……这一看就没什么文化嘛,表义有余而精炼不足。
好了,装X到此结束。以上纯属个人观点,请各位看官酌情而喷。本文只是从编码规范方面谈谈自己的看法,不涉及任何技术层面的东西。有人会说,真正的高手还在乎这些吗?操起键盘就是干,完成需求就好了,代码写那么漂亮有什么用?
有些人觉得代码写得越晦涩难懂,越能显示出水平。对此我只能说,打扰了!个人认为,只要代码还需要人阅读(哪怕只有自己一个人),就应该对可读性有点追求,把代码当成一件艺术品来看待。
其实看到这里,很多人心里有点犯难了。上面说得是有点道理,可是我英语很菜,词汇量完全不够用啊,怎么办?
别害怕,编程都能学会,还怕几个英语单词?词汇量不够,不是有有道词典吗?再不济用百度也行吧。总之,英语不好不能拿来当借口哟。