(翻译)编程中的命名约定

序:此文是译文,有选择性的翻译了Wikipedia上的原文,原文题目:Naming convention (programming)。因能力有限,难免存在讹误;如果你有能力,建议你阅读英文原文。原文链接见文末。

在计算机编程中,命名约定是用于程序源码和文档的一套规则,根据此规则来选取合适的字符串作为变量、类型和函数等的标识符。

之所以采用命名约定(而不允许程序员随意选取字符串)的原因在于:

  • 便于阅读、理解程序源码;
  • 美化程序源码(如,不允许过长的命名及缩写命名)。

命名约定是一个极易引起争论的话题,因为不同的“党派”都坚信自己使用的规则是最完美的的,其他人的规则都“略逊一筹”。通俗得来说,这属于“宗教信仰”的问题。好多公司或群体量身定制了自己的命名规则。

  1. 潜在的好处

    使用命名约定有不少潜在的好处,包括:

    • 可以“顾名思义”;
    • 可以保持开发团队内部的一致性;
    • 方便使用自动化的搜索或替换工具,而不会引入太多的错误;
    • 避免出现歧义;
    • 可以帮助美化代码使其显得更加专业(如,不允许使用太长的命名、滑稽搞笑的命名以及缩写命名);
    • 在团队协作时避免命名冲突;
    • 便于程序项目(源码及其文档)的移交;
    • 便于他人或以后自己对于源码的重新利用。
  2. 存在的挑战

  3. 命名约定的选择永远是一个争议的话题!谁不认为“自家的孩子好”?

    此外,虽然已经存在非常好的命名约定,一些机构也不去坚持使用,从而造成冲突或困惑。

    如果命名约定本身就存在不一致、太过随意、难记、弊大于利等缺点,以上问题将会严重恶化。

  4. 商业价值

  5. 虽然商业用户没有意识到这一点,但清晰明确的命名确实更加利于后续的开发、程序员对源码的理解以及对原程序的扩展。

    举个例子,虽然

    a = b * c;

    在语法上没有问题,但却无法让人理解这段代码的目的为何。与此相反,

    weekly_pay = hours_worked * pay_rate;

    则表明了这段代码的目的与作用,起码知道上下文的读者一看就懂。

  6. 常见的命名元素

    具体的命名约定要看它所处的上下文。尽管如此,在日常应用中仍有一些基本的命名元素与大部分命名约定相关。

    (1)标识符的长度

    命名约定中的基本元素便是对标识符长度的规定(换言之,标识符必须使用有限的字符)。有些规则严格规定了数字的表示方式,其他的则主要是一些指导性的规则。

    标识符长度的规定常常在实践中争论不休,类似于学术辩论。

    需要考虑的因素:

    • 短的标识符方便作为权宜之计,因为越短越容易输入
    • 太短的标识符(如“i”或“j“)很难用自动化的工具来搜索、替换
    • 与短的标识符相比,长的更加清晰明确、包含的信息更多
    • 太长的标识符可能会让人感觉纷繁芜杂

    与长的标识符相比,程序员们更加喜欢短的标识符,这到底是因为短的更加方便输入呢,还是因为在多数情况下长的标识符不但没有提供更多的方便、反而使得代码有失美观呢?这个问题值得探讨。
    编程中的简洁部分归因于:

    • 早期的linker(连接器?)为了节省内存把变量名限制在6个字符内。后来的升级版本允许更长的变量名以便于人们的理解,但通常只 有开头的几个字符有意义。在BASIC的某些版本中,是允许长的变量名的存在的,但只有开头的2个字符有意义;当你使用”VALUE“和”VAT“两个变 量来表示不同的东西时,这会造成严重的问题。
    • 早期的代码编辑器没有自动补全的功能
    • 早期低分辨率的显示器限制了行长(如,只允许80个字符)
    • 好多计算机科学源于数学,你知道,数学中通常只用一个字符来表示变量

    (2)字母的大小写与数字

    有些命名约定限制了字母的大小写,而其他的命名约定虽然没有限制大小写,却根据字母的大小写来进行判读。某些命名约定规定了是使用字母、数字还是字母与数字来进行命名,以及字母与数字之间的顺序。

    (3)多单词的标识符

    通常的建议是”使用有意义的标识符“。一个单词往往不如多个单词更加有意义、更加明确。有鉴于此,有的命名约定制定了处理含有多个单词的”复合“标识符的规定。

    大多数编程语言都不允许在标识符中使用空格,因此需要指定分隔单词的方法(便于其他读者分辨那个字符属于那个单词)。

    用分隔符分隔单词

    一种方法便是使用非字母数字的字符来分隔单词。常用的两种字符便是连字符(”-“)和下划线(”_“)(如,”two words“这个名字将会表示成”two-words“或”two_words“)。COBOL和Lisp的程序员几乎都是用连字符;同时,连字符在Cascading Style Sheets的selector names(选择器名字?)中也很常见。在其他大多数编程语言(如C和Pascal家族的编程语言)中,连字符都是内置的减法操作符,因此不能用于标识符中;此时,下划线便代替连字符用来分隔单词。

    用字母的大小写分隔单词

    另一种分隔单词的办法便是在名字中大写单词的首字母(通常称为”CamelCase”,还有好多其他其他名字)。此时,”two words“就会写成”twoWords” 或者 “TwoWords”。

    易读性

    在C/C++程序员的”保皇派“中,以分隔符来分隔单词仍然是最常见的方法。他们宣称这种方式更加易读,特别是当名字中包含首字母缩略词或词首字母缩略词的时候,如表示”get a C CVS URL”的”getACCVSURL”。但在Java等“现代化”的编程语言中,以字母的大小写来分隔单词则是大势所趋。这种方式按键更少、一行中能包含更多得信息,其拥护者认为它更加易读,尤其是当使用复杂的命名空间与命名等级的时候。

  7. 元数据与命名约定的杂烩

  8. 有些命名约定早已不在局限于某个特定的项目或问题领域,而达到了软件等级或交叉项目所要求的综合级别。

    (1)匈牙利符号系统

    也许最著名的便是匈牙利符号系统,它在变量名中同时包含了目的(“Apps Hungarian”)与类型(“Systems Hungarian”)的信息。

    (2)位置符号系统

    一个非常短(不多于8个字符)的标识符可能会是下面这个样子:LCCIIL01,其中的LC可能表示application (Letters of Credit),C表示COBOL,IIL表示特定进程的子集,而01则表示序列号。

    这种命名约定仍在基于JCL的计算机中央处理机以及8.3(maximum 8 characters with period separator followed by 3 character file type)MS-DOS中继续使用。

    (3)混合型的方案(OF语言)

    20世纪80年代,IMS(Information Management System,信息管理系统)中的IBM的“OF语言”是最早发布的命名约定之一。

    它详细阐述了主词-修饰语-类(PRIME-MODIFIER-CLASS)方案,在此方案中可以用”CUST-ACT-NO”来表示”customer account number”。

    主词用来向表示主要的实体;修饰语用来进一步深化、量化并增加可读性;类则是与特定应用相关的数据类型的缩写。常见的类词有:NO表示number,ID表示identifier,TXT表示text,AMT表示amount,QTY表示quantity,FL表示flag,CD表示code,W表示work,等等。在实际应用中,类词的个数最好不要超过两打。

    类词通常都放于右侧(即作为后缀),它的作用与匈牙利符号系统中的前缀类似。使用类词,除了保持一致性外,还可以向程序员指示它的数据类型。

  9. Perl语言的命名约定

  10. Perl语言从C那里继承了一部分命名约定。局部变量与子例程通常使用用下划线分隔开的小写单词来命名;如果是私有变量或子例程,则在前面加一个下划线以表明其私有性;Perl包中的变量命名则采用单词首字母大写的方式(像英文标题那样);如果是声明的常量,需要全部大写;Perl包的名字,除了pragmata(如strict),则一律采用”CamelCase”的方式。

  11. 原文链接

  12. Wikipedia上的原文