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

1.6 命名

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

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

var thisIsMyName;
var anotherVariable;
var aVeryLongVariableName;

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

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

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

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

// 好的写法
var count = 10;
var myName = "Nicholas";
var found = true;
// 不好的写法:变量看起来像函数
var getCount = 10;
var isFound = true;
// 好的写法
function getName() {
     return myName;
}
// 不好的写法:函数看起来像变量
function theName() {
     return myName;
}

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

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

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

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

if (isEnabled()) {
     setName("Nicholas");
}
if (getName() === "Nicholas") {
     doSomething();
}

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

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

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

var MAX_COUNT = 10;
var URL = "http://www.nczonline.net/";

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

if (count < MAX_COUNT) {
     doSomething();
}

在这段代码中,一眼就能看出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。这样做可以将构造函数从变量和普通函数中区分出来。构造函数的命名也常常是名词,因为它们是用来创建某个类型的实例的。这里有一些例子:

// 好的做法
function Person(name) {
     this.name = name;
}
Person.prototype.sayName = function() {
     alert(this.name);
};
var me = new Person("Nicholas");

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

``` var me = Person("Nicholas"); var you = getPerson("Michael");

这段代码中,根据上文提到的命名约定,我们一眼就可以看出第一行出了问题,但第二行看起来还ok。

Crockford的编程规范、Google的JavaScript风格指南以及Dojo编程风格指南都推荐这种实践。如果构造函数的首字母不是大写,或者构造函数之前没有new运算符,JSLint都会给出警告。而在JSHint中,只有你开启了一个特殊的newcap选项后,才会对首字母不是大写的构造函数给出警告。

时间: 2025-01-01 16:51:18

《编写可维护的JavaScript》——1.6 命名的相关文章

《编写可维护的JavaScript》——第 1 章 基本的格式化1.1 缩进层级

第一部分 编程风格 编写可维护的JavaScript"程序是写给人读的,只是偶尔让计算机执行一下." --Donald Knuth.1 当你刚刚组建一个团队时,团队中的每个人都各自有一套编程习惯.毕竟,每个成员都有着不同的背景.有些人可能来自某个"皮包公司"(one-man shop),身兼数职,在公司里什么事都做:还有些人会来自不同的团队,对某种特定的做事风格情有独钟(或恨之入骨).每个人都觉得代码应当按照自己的想法来写,这些通常被归纳为个人编程嗜好.在这个过程中

《编写可维护的JavaScript》——2.3 使用注释

2.3 使用注释 何时添加注释是程序员经常争论的一个话题.一种通行的指导原则是,当代码不够清晰时添加注释,而当代码很明了时不应当添加注释.比如这个例子中,注释是画蛇添足. // 不好的写法 // 初始化count var count = 10; 因为代码中初始化count的操作是显而易见的.注释并没有提供其他有价值的信息.换个角度讲,如果这个值10具有一些特殊的含义,而且无法直接从代码中看出来,这时就有必要添加注释了. // 好的写法 // 改变这个值可能会让它变成青蛙 var count =

《编写可维护的JavaScript》——第 1 章 基本的格式化 1.1缩进层级

第 1 章 基本的格式化 编程风格指南的核心是基本的格式化规则(formatting rule).这些规则直接决定了如何编写高水准的代码.与在学校学习写字时所用的方格纸类似,基本的格式化规则将指引开发者以特定的风格编写代码.这些规则通常包含一些你不太在意的有关语法的信息,但对于编写清晰连贯的代码段来说,每一条信息都是非常重要的.1.1 缩进层级 关于JavaScript编码风格,我们首先要讨论的是(几乎所有的语言都是如此)如何处理缩进.对这个话题是可以争论上好几个小时的,缩进甚至关系到软件工程师

《编写可维护的JavaScript》——1.2 语句结尾

1.2 语句结尾 有一件很有意思且很容易让人困惑的事情,那就是JavaScript的语句要么独占一行,要么以分号结尾.类似C的编程语言,诸如C++和Java,都采用这种行结束写法,即结尾使用分号.下面这两段示例代码都是合法的JavaScript. // 合法的代码 var name = "Nicholas"; function sayName() { alert(name); } // 合法的代码,但不推荐这样写 var name = "Nicholas" func

《编写可维护的JavaScript》——2.4 文档注释

2.4 文档注释 从技术的角度讲,文档注释并不是JavaScript的组成部分,但它们是一种普遍的实践.文档注释有很多种格式,但最流行的一种格式来自于JavaDoc文档格式:多行注释以单斜线加双星号(/**)开始,接下来是描述信息,其中使用@符号来表示一个或多个属性.来看一段来自YUI的源码的例子. /** 返回一个对象,这个对象包含被提供对象的所有属性. 后一个对象的属性会覆盖前一个对象的属性. 传入一个单独的对象,会创建一个它的浅拷贝(shallow copy). 如果需要深拷贝(deep

《编写可维护的JavaScript》——1.7 直接量

1.7 直接量 JavaScript中包含一些类型的原始值:字符串.数字.布尔值.null和undefined.同样也包含对象直接量和数组直接量.这其中,只有布尔值是自解释(self-explanatory)的,其他的类型或多或少都需要思考一下它们如何才能更精确地表示出来. ** 1.7.1 字符串** 在JavaScript中,字符串是独一无二的.字符串可以用双引号括起来,也可以用单引号括起来.比如: // 合法的JavaScript代码 var name = "Nicholas says,

《编写可维护的JavaScript》——第 2 章 注释 2.1单行注释

第 2 章 注释 注释是代码中最常见的组成部分.它们是另一种形式的文档,也是程序员最后才舍得花时间去写的.但是,对于代码的总体可维护性而言,注释是非常重要的一环.打开一个没有任何注释的文件就好像趣味冒险,但如果给你的时间有限,这项任务就变成了折磨.适度的添加注释可以解释说明代码的来龙去脉,其他开发者就可以不用从头开始读代码,而是直接去读代码的任意部分.编程风格通常不会包含对注释的风格约定,但我认为从注释的作用即可看出它们的重要性不容忽视. JavaScript支持两种不同类型的注释:单行注释和多

《编写可维护的JavaScript》——第 2 章 注释2.1 单行注释

第 2 章 注释 注释是代码中最常见的组成部分.它们是另一种形式的文档,也是程序员最后才舍得花时间去写的.但是,对于代码的总体可维护性而言,注释是非常重要的一环.打开一个没有任何注释的文件就好像趣味冒险,但如果给你的时间有限,这项任务就变成了折磨.适度的添加注释可以解释说明代码的来龙去脉,其他开发者就可以不用从头开始读代码,而是直接去读代码的任意部分.编程风格通常不会包含对注释的风格约定,但我认为从注释的作用即可看出它们的重要性不容忽视. JavaScript支持两种不同类型的注释:单行注释和多

《编写可维护的JavaScript》——2.2 多行注释

2.2 多行注释 多行注释可以包裹跨行文本.它以/开始,以/结束.多行注释不仅仅可以用来包裹跨行文本,这取决于你.下面这些都是合法的注释. /* 我的注释 */ /* 另一段注释 这段注释包含两行 */ /* 又是一段注释 这段注释同样包含两行 */ 尽管从技术的角度看,这些注释都是合法的,但我比较青睐Java风格的多行注释.Java风格的注释至少包含三行:第一行是/,第二行是以开始且和上一行的保持左对齐,最后一行是/.这种注释看起来像下面这样. /* * 另一段注释 * 这段注释包含两行文本