起名的艺术

发表于 · 阅读完需 3 分钟 · 报告错误

计算机科学中仅存在两件难事:缓存失效和事物命名。
Phil Karlton


定理 1:代码应该是写给人来读的,只不过顺便能在机器执行而已。

代码大部分时候是用来维护的,而不是用来实现功能的,这个准则适用于大部分的软件工程。比如我所知道的一个软件系统,开发了三个月即上线使用,而用于维护的时间却是以年为单位的,开发者花大量的时间用于调整代码以确保其正确运行。

因此,编写可读代码成了用于衡量代码质量的重要标准之一(另外一个熟知的标准是正确性)。

代码质量衡量标准


定理 2:好的代码胜过好的注释。

好的代码自己本身就是最好的文档。当你打算加注释的时候,问问自己“我如何才能把我的代码改善到不需增加注释?”重构自己的代码,然后使文档让其更清楚。

注释的恰当用法是弥补我们在用代码表达意图时遭遇的失败。比如解释为什么要这么做,或者是对一个复杂晦涩的代码段做必要的阐释。

下面这种毫无意义的注释,只会增加你代码文件的字节数:

num += 1;           // 用户人数加 1

正确的做法应该是把变量起一个具有准确含义的名字:

userCount += 1;

再如,一个受过正规训练的程序员绝不会同意把一个函数名起成 killBill,职业直觉告诉他们应该去写一个 killPeople 的函数,然后把 Bill 当作这个函数的参数。

如此看来,给变量(函数)起名也成了一种艺术。


起名的首要原则是把信息装到名字中。代码中的名字,便是你和其他读代码的人之间的桥梁,准确的名字,才能传递准确的信息。

避免使用抽象的名字。例如不要使用 tmpgetData 这样空洞抽象的名字。

可以在名字中增加额外的信息。例如 string hex_idsize_kb 等。在给布尔类型命名时,加上 ishascanshould 让含义更清晰,比如 bool use_ssl = true 好于 bool disable_ssl = false

有目的地使用大小写、下划线进行命名。例如用 CamelCase 表示类名,用 lower_separated 表示变量名,用 CONSTANT_NAME 表示常量名。在使用 jQuery 的代码中,一个非常有用的规范是,给 jQuery 返回的结果加上 $ 作为前缀:

var $all_images = $('img');   // $all_images is a jQuery object
var height = 250;             // height is not

为作用域大的名字采用更长的名字。同理,可以在小的作用域里使用短的名字。

使用不会被误解的名字。例如用 firstlast 来表示包含的范围(闭区间),用 beginend 来表示排除的范围(开区间):

print integer_range(start=2, stop=4)
# Does this print [2,3] or [2,3,4] (or something else)?

set.PrintKeys(first="Bart", last="Maggie")

使用英文来命名。有一些国内的程序员为了方便,喜欢用拼音甚至缩写来命名,这应该被严令禁止。