天天看点

《编写可维护的JavaScript》——1.6 命名

本节书摘来自异步社区《编写可维护的javascript》一书中的第1章,第1.6节,作者: 【美】nicholas c. zakas 译者: 李晶 , 郭凯 , 张散集 更多章节内容可以访问云栖社区“异步社区”公众号查看。

“计算机科学只存在两个难题:缓存失效和命名。”—phil karlton。

只要是写代码,都会涉及变量和函数,因此变量和函数命名对于增强代码可读性至关重要。javascript语言的核心ecmascript,即是遵照了驼峰式大小写(camel case)1命名法。驼峰式大小写(camel case)命名法是由小写字母开始的,后续每个单词首字母都大写,比如:

一般来讲,你应当遵循你使用的语言核心所采用的命名规范,因此大部分javascript程序员使用驼峰命名法来给变量和函数命名。google的javascript风格指南、sproutcore编程风格指南以及dojo编程风格指南在大部分场景中也都采用了小驼峰(camel case)命名。

尽管小驼峰(camel case)命名法是最常见的命名方法,但我们不排斥更多其他的命名风格。

在2000年左右,javascript中流行另外一种命名方法—匈牙利命名法。这种命名方法的特点是,名字之前冠以类型标识符前缀,比如sname表示字符串,icount表示整数。这种风格已经是明日黄花风光不再了,当前主流的编程规范都不推荐这种命名法。

1.6.1 变量和函数

变量名应当总是遵守驼峰大小写命名法,并且命名前缀应当是名词。以名词作为前缀可以让变量和函数区分开来,因为函数名前缀应当是动词。这里有一些例子。

命名不仅是一门科学,更是一门技术,但通常来讲,命名长度应该尽可能短,并抓住要点。尽量在变量名中体现出值的数据类型。比如,命名count、length和size表明数据类型是数字,而命名name、title、和message表明数据类型是字符串。但用单个字符命名的变量诸如i、j、和k通常在循环中使用。使用这些能够体现出数据类型的命名,可以让你的代码容易被别人和自己读懂。

要避免使用没有意义的命名。那些诸如foo、bar和tmp之类的命名也应当避免,当然开发者的工具箱中还有很多这样可以随拿随用的名字,但不要让这些命名承载其他的附加含义。对于其他开发者来说,如果没有看过上下文,是无法理解这些变量的用处的。

对于函数和方法命名来说,第一个单词应该是动词,这里有一些使用动词常见的约定。

《编写可维护的JavaScript》——1.6 命名

以这些约定作为切入点可以让代码可读性更佳,这里有一些例子。

尽管这些函数命名细则并没有被归纳入当下流行的编程风格中,但在很多流行的库中,javascript开发者会发现存在不少这种“伪标准”(pseudostandard)。

jquery显然并没有遵循这种函数命名约定,一部分原因在于jquery中方法的使用方式,很多方法同时用作getter和setter。比如,$("body").attr("class")可以取到class属性的值,而$("body").attr("class","selected")可以给class属性赋值。尽管如此,我还是推荐使用动词作为函数名前缀。

1.6.2 常量

在ecmascript 6之前,javascript中并没有真正的常量的概念。然而,这并不能阻止开发者将变量用作常量。为了区分普通的变量(变量的值是可变的)和常量(常量的值初始化之后就不能变了),一种通用的命名约定应运而生。这个约定源自于c语言,它使用大写字母和下划线来命名,下划线用以分隔单词,比如:

需要注意的是,这里仅仅是应用了不同命名约定的变量而已,因此它们的值都是可以被修改的。使用这种不同的约定来定义普通的变量和常量,使两者非常易于区分。来看一下这段代码:

在这段代码中,一眼就能看出count是变量,其值是可变的,而max_count表示常量,它的值不会被修改。这个约定为底层代码(underlying code)增加了另外一层语义。

google的javascript风格指南、sproutcore编程风格指南以及dojo编程风格指南中都提到,要使用这种习惯来命名常量。(dojo编程风格指南中也允许使用大驼峰命名法大小写(pascal case)来命名常量,接下来会提到)。

1.6.3 构造函数

在javascript中,构造函数只不过是前面冠以new运算符的函数,用来创建对象。语言本身已经包含了很多内置构造函数,比如object和regexp,同样开发者也可以创建自己的构造函数来生成新类型。正如其他的命名约定一样,构造函数的命名风格也和本地语言(native language)保持一致,因此构造函数的命名遵照大驼峰命名法(pascal case)。

pascal case和camel case都表示“驼峰大小写”,二者的区别在于pascal case以大写字母开始。因此anothername可以替换成anothername。这样做可以将构造函数从变量和普通函数中区分出来。构造函数的命名也常常是名词,因为它们是用来创建某个类型的实例的。这里有一些例子:

遵守这条约定同样可以帮助我们快速定位问题,这接下来会提到。你知道在以大驼峰命名法(pascal case)命名的函数如果是名词的话,前面一定会有new运算符。看一下这段代码:

继续阅读