对程序员来说,下面的几个任务,你认为哪个或哪些最难?
- 给函数,变量等命名
- 向别人解释我们做什么(或者不做什么)
- 任务估时
- 与别人沟通
- 在别人代码的基础上工作
- 实现你不认同的功能
- 写文档
- 写测试
- 设计解决方案
Quora 和 Ubuntu Forums thread 上的 4500 个程序员对上面的问题进行投票。49%的程序员认为给函数、变量等命名是最难的任务。
你或许给函数取过这样的名字:
function doSth(){} // 实在怎么起名字,先凑合叫这个吧。
function zds(){} // zds 拼音缩写,做大事?做点事?坐电视?
function doThing1AndDoTing2(){}// 做事1和事2
// 还有更多惨不忍睹的
当我们编码渐多,越来越意识到到好的命名对我们理解代码是多么的重要。那么,什么样的名字算是合适的呢?我觉得,如果通过看函数名字能明确的知道函数做了什么,那就是合适的命名。上面的三个名字:
- doSth: 这函数名就是废话。不看函数的内容,完全不知道这函数做什么。
- zds: 鬼知道zds是什么简称。
- doThing1AndDoTing2: 虽然我们知道是做了两件事,但也太罗嗦了。比如,我们有一个来做肉的函数,我们这样写:
如果把这个函数改成 cookMeat 是否更好?funcion washAndFireAndWrapMeat(){
washMeat();// 洗肉
fireMeat();// 煮肉
wrapMeet();// 将肉装盘
}
明确函数要做什么
在给函数命名前,明确函数三要素中的“功能”,即该功能到底要做什么,这有利于给函数命名。
以动词开头
尽量不要以 do 开头
do 并不能给我们提供任何函数的信息。相比之下,search, compute, handle 之类的动词暗示着函数大概做了什么。
返回布尔值的方法以 is 或 are 开头
用 is 还是 are 取决于判断主体是单个还是多个。如:isButtonEnabled
,areButtonsEnable
。
合理的使用 get 作为函数名字的开头
所有有返回值的函数,好像都可以用 get 作为函数名字的开头。但以 get 开头的函数应该表示取某属性,如:
let user = {
firstName: '',
lastName: '',
getFirstName: function(){
return this.firstName;
},
getFullName: function(){
return this.firstName + this.lastName;
}
}
否则就不应该用 get 开头。比如,从服务器上获取用户列表,这个方法可以叫 fetchUserList
,而不是 getUserList
;获取某个范围内的所有质数,可以叫 caculatePrime
。
不要包含上下文信息
如有个 user 对象,有个获取 user 的 id 的函数,应该叫 getId
而不是 getUserId
。
不要包含函数参数的信息
如用一个 id 和 token 找用户的方法,应该叫 findUser(userId, token)
而不是 findUserByUserIdAndToken(userId, token)
。如果以 findUserByUserIdAndToken
来命名,那么如果以后函数要支持用其他方式查找用户怎么办,又或是不支持用 token 查找怎么办。