嵌套代碼表現(xiàn)為在 case/if/receive
語句中又包含著 case/if/receive
語句。這種深度嵌套的編程風(fēng)格非常糟糕,代碼很容易跨越一個屏幕頁面,變得難以閱讀。應(yīng)該把大多數(shù)代碼限定到最多兩級縮進(jìn)的程度。將代碼分割為較短的函數(shù)可以解決這個需求。
超過 400 行代碼的模塊實在是太大了。最好用一系列小模塊來代替大型模塊。
不要讓函數(shù)代碼超過 15 到 20 行。應(yīng)將大型函數(shù)分割為一些小型函數(shù),也不要寫把代碼行寫得過長。
過長的代碼行是不可取的。每行代碼最多不宜超過 80 個字符(一張 A4 紙就能容納得下)。
自 Erlang 4.3 起,字符串常量可以自動連接。比如:
io:format("Name: ~s, Age: ~w, Phone: ~w ~n"
"Dictionary: ~w.~n", [Name, Age, Phone, Dict])
選擇有意義的變量名——盡管這一點很難辦到。
如果變量名包含一些單詞,使用 _
或某個大寫字母來分隔它們。比如:My_variable
或 MyVariable
。
對于不會用到的變量(don't care variable),則不要在變量名中間使用 _
,而應(yīng)在變量名前加上 _
。比如說 _Name
。如果將來需要該變量值,則只需去掉變量名前面的下劃線即可。這樣就不會有確定應(yīng)替換具體哪個下劃線的麻煩,而且代碼也易于閱讀。
函數(shù)名必須要和函數(shù)的功能相符。函數(shù)名應(yīng)能反映出函數(shù)所返回的參數(shù)類型,不能讓閱讀代碼的人感到詫異。另外,對于常見的函數(shù),應(yīng)采用常見的名稱(比如 start
、stop
、init
,main_loop
等)。
對于不同模塊中的用來解決相同問題的函數(shù),其函數(shù)名應(yīng)相同。比如,Module:module_info()
。
糟糕的函數(shù)名是最常見的編程錯誤之一,從而也反映出取一個合適的名稱是多么難!
在編寫大量不同的函數(shù)時,有些命名規(guī)范非常有用。比如,名稱前綴 is_
用來標(biāo)識函數(shù)返回原子 true 或 false。
is_...() -> true | false
check_...() -> {ok, ...} | {error, ...}
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_...
編程風(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)一。