如果你准备花一小时写代码,那么其中半小时得用于起名字。这句话虽然有些夸张,但体现出命名的重要性。的确,类名、函数名、变量名、文件名等等如果含混晦涩,会给维护工作造成麻烦。
命名时把握一个原则:对于函数说明其在“做什么”,对于类或变量说明其“是什么”。言简意赅是一种理想状态。首先要用词准确,特别是对英语没把握的人,请随时查一下字典。然后把这些词拼成一个短语或短句。最后,如果名字太长,再做一些简化。
- 用词准确
英语好的人在准确用词方面会比较轻松,但英语不好的人,比如我,也不要气馁,一定要多查查字典。甚至可以学学白居易写诗的方法,问问旁边的同事能不能读懂你起的名字。
曾经在一个系统中需要管理若干“检查任务”,我在给这些检查任务的基类命名时的确花了很长时间。“任务”一词在翻译软件里找到了4个结果:assignment, mission,task,duties。逐个选择,assignment主要侧重的是“分配”的意思。mission主要指“使命”,范围更大,而我们这里的任务主要是单个任务,范围小。duties的意思主要是职责、责任。相比较而言task比较适合,最终选择了task作为任务基类的名字。
还要避免出现Chinglish的单词。曾经在一个开票系统的代码中看到一个函数名叫OpenInvoice。invoice是发票,但为啥要open它,琢磨了半天才悟出是“开票”的意思(我们把“开具发票”简称为“开票”)。
在有些场景使用拼音也未尝不可。比如在保密系统中的“绝密”、“机密”、“秘密”几个术语就没有很适合的英文单词对应。不妨就直接用拼音JueMi,JiMi,MiMi。
- 拼接短语
选好单词后,就把它们连在一起。我认为以下几种方式都是可行的:
IsReadOnly //驼峰式
is_read_only //Unix短横线式
isReadOnly //Java首字母小写
或者你还有自己的方式。但我的忠告是:一旦你选定了一种方式,就一直使用它,不要在自己的代码中出现多种风格。
- 简化
不要太迷信“代码自注释”这句话,对于一些太长的名字,可以做一些简化,比如函数:
void low_level_read_write_block_devices(int rw, int nr, struct buffer_head * bhs[])
可以简化为:
/**
* ll_rw_block: low-level access to block devices
…. */
void ll_rw_block(int rw, int nr, struct buffer_head * bhs[])
这样在调用该函数的地方,可以少敲几个字母。特别是对于局部变量,我推荐使用简写,比如下面这样:
BOOL LocateFile(const CString& strFilePath)
{
PROCESS_INFORMATION pi = { 0 };
......
}
pi的命名方式,比stProcessInformation更为简洁。