CoffeeScript 編碼風格指南

發表於2014-08-27

這份指南闡述了一些 CoffeeScript 的最佳實踐和編碼慣例。

這份指南是社群驅動的,非常鼓勵大家來貢獻內容。

請注意這還是一份正在完善的指南:仍有很多地方可以改進,有些已制定的準則也不一定是社群慣用的(基於此,在適當的情況下,這些有待斟酌的準則將有可能被修改或刪除。)

靈感

本指南中的很多細節受到了幾份現有的風格指南和其他資源的啟發。特別是:

程式碼佈局(Code Layout)

 

Tab 還是 空格?(Tabs or Spaces?)

只用 空格,每級縮排均為 2 個空格。切勿混用 Tab 和空格。

 

最大行寬(Maximum Line Length)

限制每行最多 79 個字元。

 

空行(Blank Lines)

  1. 頂級函式和類的定義用一個空行分開。
  2. 類內部的函式定義也用一個空行分開。
  3. 對於每個函式體內,只在為了提高可讀性的情況下才使用一個空行(例如:為了達到劃分邏輯的目的)。

 

結尾空白(Trailing Whitespace)

不要在任何一行保留行尾空白。

 

可選的逗號(Optional Commas)

當物件(或陣列)的屬性(或元素)作為單獨一行列出時,避免在換行符前使用逗號。如下:

編碼(Encoding)

UTF-8 是首選的原始檔編碼。

模組匯入(Module Imports)

如果需要匯入模組 (CommonJS 模組,AMD,等等.), require 語句應該單獨作為一行。如下:

這些語句應該按以下順序去分組:

  1. 標準庫的匯入 (如果標準庫存在)
  2. 第三方庫的匯入
  3. 本地匯入 (匯入這個應用程式的或庫的具體依賴)

表示式和語句中的空白(Whitespace in Expressions and Statements)

下列情況應該避免多餘的空格:

  • 緊貼著圓括號、方括號和大括號內部

緊貼在逗號前

額外建議:

  • 在下列二元操作符的左右兩邊都保留 一個空格
    • 賦值運算子: =
      注意:這同樣適用於函式定義中的預設引數

  • 自增運算子: +=-=, 等等。
  • 比較運算子: ==<><=>=unless, 等等。
  • 算術運算子: +-*/, 等等。
  • (這些操作符兩邊的空格不要多於一個)

註釋(Comments)

如果你修改了一段已有註釋說明的程式碼,則也要更新它對應的註釋。(理想狀態是,重構這段程式碼直到它不需要註釋說明,然後再把之前的註釋全刪掉。)

註釋的首字母要大寫,除非第一個單詞是以小寫字母開頭的識別符號。

如果註釋很短,可以省略末尾的句號。

 

塊註釋(Block Comments)

註釋塊通常應用於尾隨其後的一段程式碼。

每一行註釋都以 # 加一個空格開頭,而且和被註釋的程式碼有相同的縮排層次。

註釋塊內的段落以僅含單個 # 的行分割。

行內註釋(Inline Comments)

行內註釋緊貼在被描述的程式碼的上一行,如果行內註釋足夠短,則可以處在同一行行尾(由一個空格隔開)。

所有行內註釋都以 # 加一個空格開頭。

應該限制行內註釋的使用,因為它們的存在通常是一個程式碼異味的標誌。

不要給顯而易見的情況作行內註釋:

然而,行內註釋在某些情況下是有用的:

命名規範(Naming Conventions)

使用 小駝峰命名法 (第一個詞的首字母小寫,後面每個詞的首字母大寫)來命名所有的變數、方法和物件屬性。

使用 大駝峰命名法 (第一個詞的首字母,以及後面每個詞的首字母都大寫)來命名所有的類 (在其他類似的命名法中,這種風格通常也被稱為 帕斯卡命名法(PascalCase)、 大寫駝峰命名法(CamelCaps) 或 首字母大寫命名法(CapWords)。)

(CoffeeScript 官方 約定是用駝峰命名法,因為這可以簡化與 JavaScript 的相互轉化,想了解更多,請看這裡.)

對於常量,單詞全部大寫,用下劃線隔開即可:

私有函式和私有變數都應該在前面加一個下劃線:

函式(Functions)

(以下這些準則同樣適用於類中的方法。)

當宣告一個帶參函式時,應在引數列表的右圓括號後空出一個空格:

無參函式不要用圓括號:

當函式鏈式呼叫,卻在一行放不下時,則把每個函式呼叫都另起一行,且都縮排一級(即在 . 前加兩個空格)。

當呼叫函式時,我們應該為了提高可讀性而去掉圓括號。請記住,「可讀性」是我們主觀臆斷的。只有類似下面幾個例子的情況才被社群認為是最佳的:

有時候你會發現圓括號用來包裹的是函式體(而不是函式的引數)。請看下面的例子(以下簡稱為「函式體風格」):

這段程式碼會編譯為:

一些習慣鏈式呼叫的人會巧用「函式體風格」進行單獨初始化:

「函式體風格」並不得到推薦。但是, 當它適應一些特殊的專案需求時,還是得用它。

字串(Strings)

用字串插值代替字串連線符:

最好用單引號 ('') 而不是雙引號 ("") 。除非是插入到另一段現有的字串中(類似字串插值)

條件判斷(Conditionals)

用 unless 來代替 if 的否定情況。

不要用 unless...else, 而用 if...else:

多行的 if/else 語句應該縮排:

迴圈和列表解析(Looping and Comprehensions)

儘可能的使用列表解析:

還可以過濾結果:

遍歷物件的鍵值:

擴充套件本地物件(Extending Native Objects)

不要修改本地物件。

比如,不要給 Array.prototype 引入 Array#forEach 。

異常(Exceptions)

不要抑制異常丟擲。

註解(Annotations)

必要的時候應該寫註解,來指明接下來的程式碼塊具體將幹什麼。

註解應緊貼在被描述程式碼的上一行。

註解關鍵字後面應該跟一個冒號加一個空格,加一個描述性的註釋。

如果註解不止一行,則下一行縮排兩個空格。

註解有以下幾類:

  • TODO: 描述缺失的功能,以便日後加入
  • FIXME: 描述需要修復的程式碼
  • OPTIMIZE: 描述效能低下,或難以優化的程式碼
  • HACK: 描述一段值得質疑(或很巧妙)的程式碼
  • REVIEW: 描述需要確認其編碼意圖是否正確的程式碼

如果你必須自定義一個新的註解型別,則應該把這個註解型別記錄在專案的 README 裡面。

其他(Miscellaneous)

and 更優於 &&.

or 更優於 ||.

is 更優於 ==.

not 更優於 !.

or= 應在可能的情況下使用:

最好用 (::) 訪問物件的原型:

最好用 @property 而不是 this.property.

但是,避免使用 單獨的 @:

沒有返回值的時候避免使用 return ,其他情況則需要顯示 return 。

當函式需要接收可變數量的引數時,使用 splats (...)。

 

相關文章