鍍金池/ 教程/ 區(qū)塊鏈/ 7 特殊的語法規(guī)范
第 三 章 軟件工程的原則
第 4 章 錯誤處理機(jī)制
9 最常見的錯誤
6 幾種 Erlang 的特殊慣例
第 5 章 進(jìn)程、服務(wù)及消息
8 文檔
7 特殊的語法規(guī)范
使用 Erlang 編程開發(fā)——編程規(guī)則及規(guī)范
第 二 章 結(jié)構(gòu)和Erlang術(shù)語
10 必備文檔

7 特殊的語法規(guī)范

7.1 代碼不要深度嵌套

嵌套代碼表現(xiàn)為在 case/if/receive 語句中又包含著 case/if/receive 語句。這種深度嵌套的編程風(fēng)格非常糟糕,代碼很容易跨越一個屏幕頁面,變得難以閱讀。應(yīng)該把大多數(shù)代碼限定到最多兩級縮進(jìn)的程度。將代碼分割為較短的函數(shù)可以解決這個需求。

7.2 模塊不宜過大

超過 400 行代碼的模塊實在是太大了。最好用一系列小模塊來代替大型模塊。

7.3 函數(shù)不宜過長

不要讓函數(shù)代碼超過 15 到 20 行。應(yīng)將大型函數(shù)分割為一些小型函數(shù),也不要寫把代碼行寫得過長。

7.4 每一行代碼不要寫得過長


過長的代碼行是不可取的。每行代碼最多不宜超過 80 個字符(一張 A4 紙就能容納得下)。

自 Erlang 4.3 起,字符串常量可以自動連接。比如:

io:format("Name: ~s, Age: ~w, Phone: ~w ~n" 
      "Dictionary: ~w.~n", [Name, Age, Phone, Dict])  

7.5 變量的取名

選擇有意義的變量名——盡管這一點很難辦到。

如果變量名包含一些單詞,使用 _ 或某個大寫字母來分隔它們。比如:My_variableMyVariable

對于不會用到的變量(don't care variable),則不要在變量名中間使用 _,而應(yīng)在變量名加上 _。比如說 _Name。如果將來需要該變量值,則只需去掉變量名前面的下劃線即可。這樣就不會有確定應(yīng)替換具體哪個下劃線的麻煩,而且代碼也易于閱讀。

7.6 函數(shù)的取名

函數(shù)名必須要和函數(shù)的功能相符。函數(shù)名應(yīng)能反映出函數(shù)所返回的參數(shù)類型,不能讓閱讀代碼的人感到詫異。另外,對于常見的函數(shù),應(yīng)采用常見的名稱(比如 start、stopinit,main_loop 等)。

對于不同模塊中的用來解決相同問題的函數(shù),其函數(shù)名應(yīng)相同。比如,Module:module_info()。

糟糕的函數(shù)名是最常見的編程錯誤之一,從而也反映出取一個合適的名稱是多么難!

在編寫大量不同的函數(shù)時,有些命名規(guī)范非常有用。比如,名稱前綴 is_ 用來標(biāo)識函數(shù)返回原子 true 或 false。

is_...() -> true | false
check_...() -> {ok, ...} | {error, ...}  

7.7 模塊的取名

Erlang 具有扁平的模塊結(jié)構(gòu)(不會出現(xiàn)模塊嵌套的情況)。然而,我們往往希望能夠模擬層級式模塊結(jié)構(gòu)的效果。通過帶有相同模塊前綴的相關(guān)模塊集合可以實現(xiàn)這種結(jié)構(gòu)。

比如,假設(shè)有一個 ISDN 處理程序,它是通過 5 個不同且相關(guān)的模塊實現(xiàn)的,這些模塊應(yīng)該按照如下方式來取名:

isdn_init 
isdn_partb 
isdn_...  

7.8 編程風(fēng)格要一致

編程風(fēng)格應(yīng)該保持一致,這樣有助于你和其他人日后理解這些代碼。不同的開發(fā)人員都有不同編程風(fēng)格,比如代碼縮進(jìn)、空格的使用,等等。

比如,在寫元組時,你可能會用一個單獨的逗號來分隔兩個元素:

{12,23,45}

而其他人可能會在逗號后面加上一個空格:

{12, 23, 45}

總之,一旦你認(rèn)準(zhǔn)了一種風(fēng)格,就要堅持使用它。

在一個較大的項目中,所有代碼部分的編程風(fēng)格應(yīng)保持統(tǒng)一。