天天看點

《編寫可維護的JavaScript》——1.6 命名

本節書摘來自異步社群《編寫可維護的javascript》一書中的第1章,第1.6節,作者:【美】nicholas c. zakas著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

隻要是寫代碼,都會涉及變量和函數,是以變量和函數命名對于增強代碼可讀性至關重要。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運算符。看一下這段代碼:

繼續閱讀