這里陸陸續(xù)續(xù)添加一些自己總結(jié)或借鑒的erlang代碼規(guī)約
[強制] [推薦] [建議]
=============================
命名
原則—— 命名首先應(yīng)該清晰耻矮,然后才是簡潔
模塊名:
[強制] 除了像util, time_util, list_util這種通用的util模塊外背伴, 項目里其他模塊的名字都要統(tǒng)一加上前綴要销,如: xs_......
函數(shù)名:
變量名:
[強制] 函數(shù)內(nèi)變量更新“賦值”金顿,后綴序號不取1,而是直接從2開始(1不如2明顯赛蔫,而且容易和字母 l 混淆)
反例: ? Player1 = ?Player#player{exp = ...},
? ? ? ? ? ? % 此處是一些邏輯處理
? ? ? ? ? ? Player2 = Player1#player{lv = ...},
正例: Player2 =? Player#player{exp = ...},
? ? ? ? ? ? % 此處是一些邏輯處理
? ? ? ? ? ? Player3 = Player2#player{lv = ...},
宏名:
進程字典的key名:
[推薦]
============================
函數(shù)相關(guān)
1. ?[推薦] ?除非有充分的理由炫惩, 否則不要拿“參數(shù)匹配某個特定值”這種做法來代替業(yè)務(wù)邏輯的case或if 判斷(這種寫法不直觀清晰扁瓢,不便于代碼閱讀和維護)
反例:
foo(#player{last_save_time=0}) ->
% 執(zhí)行l(wèi)ast_save_time為0時的處理
% ...;
foo(#player{last_save_time=LastSaveTime}) ->
% 執(zhí)行l(wèi)ast_save_time不為0時的處理
% ...
正例: 寧可直接在foo()函數(shù)里寫case? LastSaveTime == 0 of的判斷, 更好的則是封裝一些判斷的小函數(shù)堕战, 然后調(diào)用這些小函數(shù)坤溃。
===========================================================
進程字典
1. [強制] 進程字典的get, put調(diào)用,必須加erlang: 前綴嘱丢,避免和自定義的函數(shù)混淆薪介,也更清晰。
反例: ?get(xxx), ? put(xxx, yyy)
正例: ? erlang:get(xxx), ? ?erlang:put(xxx, yyy)
======================================================
注釋
1. [強制]?
所有位于行末的注釋屿讽,統(tǒng)一用%(一個%)
模塊(包括頭文件昭灵,配置文件)開頭的模塊說明吠裆,用%%%(三個%)作為注釋
?函數(shù)定義處的函數(shù)說明,用%%(兩個%)作為注釋烂完, 函數(shù)內(nèi)部統(tǒng)一用%(一個%)作為注釋
記錄體定義處的記錄體說明试疙,用%%(兩個%)作為注釋, 記錄體內(nèi)部統(tǒng)一用%(一個%)作為注釋
宏定義處用%%(兩個%)作為注釋抠蚣,但如果注釋是位于行末祝旷,則用%(一個%)
===========================================
頭文件
1. [強制] 避免頭文件被重復(fù)包含的寫法,統(tǒng)一如下:
假設(shè)有一個player.hrl文件嘶窄,則:
-ifndef(__PLAYER_HRL__).
-define(__PLAYER_HRL__, 0).
.........
-endif.