命名規範 常量定義 代碼格式

我的博客網站:http://www.caoyong.xin:8080/blogger(歡迎訪問!有我更多的文章)

今天 老大把我說了一頓(不止一次),主要就是編碼規範的問題,後來給我說,要我參靠阿里的Java開發手冊來編寫代碼,我就整理了一下阿里的Java開發手冊,很詳細,幾乎都包含在內。在剛進公司中,要求最多的不是你能不能實現什麼功能,代碼編的的質量如何。而是代碼規範。規範很重要,很重要,我也要潛心研究,並努力做到規範,好了,話不多說,咋們開始


1:命名規範

    

1. 【強制】代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束。反例:_name / __name / $name / name_ / name$ / name__

 

2. 【強制】代碼中的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。

 

說明:正確的英文拼寫和語法可以讓閱讀者易於理解,避免歧義。注意,即使純拼音命名方式也要避免採用。

 

正例:alibaba / taobao / youku / hangzhou 等國際通用的名稱,可視同英文。

 

反例:DaZhePromotion [打折/ getPingfenByName() [評分/ int 某變量 = 3

 

3. 【強制】類名使用 UpperCamelCase 風格,但以下情形例外:DO / BO / DTO / VO / AO /PO 等。

 

正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion

 

反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion

 

4. 【強制】方法名、參數名、成員變量、局部變量都統一使用 lowerCamelCase 風格,必須遵從駝峯形式。

 

正例: localValue / getHttpMessage() / inputUserId

 

5. 【強制】常量命名全部大寫,單詞間用下劃線隔開,力求語義表達完整清楚,不要嫌名字長。正例:MAX_STOCK_COUNT

 

反例:MAX_COUNT

 

6. 【強制】抽象類命名使用 Abstract  Base 開頭;異常類命名使用 Exception 結尾;測試類命名以它要測試的類名開始,以 Test 結尾。

 

7. 【強制】類型與中括號緊挨相連來定義數組。正例:定義整形數組 int[] arrayDemo;

 

反例: main 參數中,使用 String args[]來定義。

 

8. 【強制】POJO 類中布爾類型的變量,都不要加 is 前綴,否則部分框架解析會引起序列化錯誤。反例:定義爲基本數據類型 Boolean isDeleted;的屬性,它的方法也是 isDeleted()RPC框架在反向解析的時候,“誤以爲”對應的屬性名稱是 deleted,導致屬性獲取不到,進而拋出異常。

 

   9. 【強制】包名統一使用小寫,點分隔符之間有且僅有一個自然語義的英語單詞。包名統一使用單數形式,但是類名如果有複數含義,類名可以使用複數形式。

 

   正例:應用工具類包名爲 com.alibaba.ai.util、類名爲 MessageUtils(此規則參考 spring的框架結構

 

 10. 【強制】杜絕完全不規範的縮寫,避免望文不知義。

 

   反例:AbstractClass“縮寫”命名成 AbsClasscondition“縮寫”命名成 condi,此類隨意縮寫嚴重降低了代碼的可閱讀性。

 

 11. 【推薦】爲了達到代碼自解釋的目標,任何自定義編程元素在命名時,使用盡量完整的單詞組合來表達其意。

 

   正例:從遠程倉庫拉取代碼的類命名爲 PullCodeFromRemoteRepository

 

   反例:變量 int a; 的隨意命名方式。

 

 12. 【推薦】如果模塊、接口、類、方法使用了設計模式,在命名時體現出具體模式。

 

   說明:將設計模式體現在名字中,有利於閱讀者快速理解架構設計理念。

 

   正例:public class OrderFactory;

 

public class LoginProxy;

 

public class ResourceObserver;

 

  13. 【推薦】接口類中的方法和屬性不要加任何修飾符號public 也不要加),保持代碼的簡潔性,並加上有效的 Javadoc 註釋。儘量不要在接口裏定義變量,如果一定要定義變量,肯定是與接口方法相關,並且是整個應用的基礎常量。

 

  正例:接口方法簽名 void f();

 

  接口基礎常量 String COMPANY = "alibaba"反例:接口方法定義 public abstract void f();

 

  說明:JDK8 中接口允許有默認實現,那麼這個 default 方法,是對所有實現類都有價值的默認實現。

 

 14. 接口和實現類的命名有兩套規則:

 

    1)【強制】對於 Service  DAO 類,基於 SOA 的理念,暴露出來的服務一定是接口,內部的實現類用 Impl 的後綴與接口區別。

 

  正例:CacheServiceImpl 實現 CacheService 接口。

 

    2【推薦】 如果是形容能力的接口名稱,取對應的形容詞爲接口名(通常是able 的形式)。

 

  正例:AbstractTranslator 實現 Translatable


  15. 【參考】枚舉類名建議帶上 Enum 後綴,枚舉成員名稱需要全大寫,單詞間用下劃線隔開。

 

說明:枚舉其實就是特殊的常量類,且構造方法被默認強制是私有。

 

正例:枚舉名字爲 ProcessStatusEnum 的成員名稱:SUCCESS / UNKNOWN_REASON

 

16. 【參考】各層命名規約:

 

A) Service/DAO 層方法命名規約

 

1 獲取單個對象的方法用 get 作前綴。

 

2 獲取多個對象的方法用 list 作前綴。

 

3 獲取統計值的方法用 count 作前綴。

 

4 插入的方法用 save/insert 作前綴。

 

5 刪除的方法用 remove/delete 作前綴。

 

6 修改的方法用 update 作前綴。

 

B) 領域模型命名規約

 

1 數據對象:xxxDOxxx 即爲數據表名。

 

2 數據傳輸對象:xxxDTOxxx 爲業務領域相關的名稱。

 

3 展示對象:xxxVOxxx 一般爲網頁名稱。

 

4 POJO  DO/DTO/BO/VO 的統稱,禁止命名成 xxxPOJO



 2:常量定義


1. 【強制】不允許任何魔法值(即未經預先定義的常量)直接出現在代碼中。反例:String key = "Id#taobao_" + tradeId;

 

cache.put(key, value);

 

2. 【強制】long 或者 Long 初始賦值時,使用大寫的 L,不能是小寫的 l,小寫容易跟數字 1 混淆,造成誤解。

 

說明:Long a = 2l; 寫的是數字的 21,還是 Long 型的 2?

 

3. 【推薦】不要使用一個常量類維護所有常量,按常量功能進行歸類,分開維護。

 

說明:大而全的常量類,非得使用查找功能才能定位到修改的常量,不利於理解和維護。

 

正例:緩存相關常量放在類 CacheConsts 下;系統配置相關常量放在類 ConfigConsts 下。

 

4. 【推薦】常量的複用層次有五層:跨應用共享常量、應用內共享常量、子工程內共享常量、包內共享常量、類內共享常量。

 

1 跨應用共享常量:放置在二方庫中,通常是 client.jar 中的 constant 目錄下。

 

2 應用內共享常量:放置在一方庫中,通常是子模塊中的 constant 目錄下。

 

反例:易懂變量也要統一定義成應用內共享常量,兩位攻城師在兩個類中分別定義了表示的變量:

 

類 A 中:public static final String YES = "yes";

 

類 B 中:public static final String YES = "y";

 

A.YES.equals(B.YES),預期是 true,但實際返回爲 false,導致線上問題。

 

3 子工程內部共享常量:即在當前子工程的 constant 目錄下。

 

4 包內共享常量:即在當前包下單獨的 constant 目錄下。

 

5 類內共享常量:直接在類內部 private static final 定義。

 

5. 【推薦】如果變量值僅在一個固定範圍內變化用 enum 類型來定義。

 

說明:如果存在名稱之外的延伸屬性使用 enum 類型,下面正例中的數字就是延伸信息,表示一年中的第幾個季節。

 

正例:

 

public enum SeasonEnum {

 

SPRING(1), SUMMER(2), AUTUMN(3), WINTER(4);

 

int seq;

 

SeasonEnum(int seq){

 

this.seq = seq;

 

}

 

}

 

 

 

3:代碼格式

 

1. 【強制】大括號的使用約定。如果是大括號內爲空,則簡潔地寫成{}即可,不需要換行;如果是非空代碼塊則:

 

1 左大括號前不換行。

 

2 左大括號後換行。

 

3 右大括號前換行。

 

4 右大括號後還有 else 等代碼則不換行;表示終止的右大括號後必須換行。

 

2. 【強制】 左小括號和字符之間不出現空格;同樣,右小括號和字符之間也不出現空格。詳見

 

 5 條下方正例提示。

 

反例:if (空格 a == b 空格)

 

3. 【強制】if/for/while/switch/do 等保留字與括號之間都必須加空格。

 

4. 【強制】任何二目、三目運算符的左右兩邊都需要加一個空格。

 

說明:運算符包括賦值運算符=、邏輯運算符&&、加減乘除符號等。

 

5. 【強制】採用 4 個空格縮進,禁止使用 tab 字符。

 

說明:如果使用 tab 縮進,必須設置 1  tab  4 個空格。IDEA 設置 tab  4 個空格時,請勿勾選 Use tab character;而在 eclipse 中,必須勾選 insert spaces for tabs

 

正例: (涉及 1-5 點)

 

 

public static void main(String[] args) {

 

縮進 4 個空格

String say = "hello";

 

運算符的左右必須有一個空格 int flag = 0;

 

關鍵詞 if 與括號之間必須有一個空格,括號內的 f 與左括號,與右括號不需要空格 if (flag == 0) {

 

System.out.println(say);

 

}

 

左大括號前加空格且不換行;左大括號後換行

 

if (flag == 1) {

 

System.out.println("world");

 

右大括號前換行,右大括號後有 else,不用換行

 

} else { System.out.println("ok");

 

在右大括號後直接結束,則必須換行

 

}

 

}

 

6. 【強制】註釋的雙斜線與註釋內容之間有且僅有一個空格。正例:

 

這是示例註釋,請注意在雙斜線之後有一個空格

 

String ygb = new String();

 

6. 【強制】單行字符數限制不超過 120 個,超出需要換行,換行時遵循如下原則:

 

1 第二行相對第一行縮進 4 個空格,從第三行開始,不再繼續縮進,參考示例。

 

2 運算符與下文一起換行。

 

3 方法調用的點符號與下文一起換行。

 

4 方法調用時,多個參數,需要換行時,在逗號後進行。

 

5 在括號前不要換行,見反例。

 

正例:

 

StringBuffer sb = new StringBuffer();

 

超過 120 個字符的情況下,換行縮進 4 個空格,點號和方法名稱一起換行 sb.append("zi").append("xin")...

 

.append("huang")...

 

.append("huang")...

 

.append("huang");

 

反例:

 

StringBuffer sb = new StringBuffer();

 

超過 120 個字符的情況下,不要在括號前換行 sb.append("zi").append("xin")...append

 

("huang");

 

參數很多的方法調用可能超過 120 個字符,不要在逗號前換行 method(args1, args2, args3, ...

 

, argsX);

 

7. 【強制】方法參數在定義和傳入時,多個參數逗號後邊必須加空格。正例:下例中實參的"a",後邊必須要有一個空格。

 

method("a", "b", "c");

 

9. 【強制】IDE  text file encoding 設置爲 UTF-8; IDE 中文件的換行符使用 Unix 格式,

 

不要使用 Windows 格式。

 

10. 【推薦】沒有必要增加若干空格來使某一行的字符與上一行對應位置的字符對齊。

 

正例:

 

int a = 3;

 

long b = 4L;

 

float c = 5F;

 

StringBuffer sb = new StringBuffer();

 

說明:增加 sb 這個變量,如果需要對齊,則給 ab都要增加幾個空格,在變量比較多的

 

情況下,是非常累贅的事情。

 

【推薦】不同邏輯、不同語義、不同業務的代碼之間插入一個空行分隔開來以提升可讀性。說明:沒有必要插入多個空行進行隔開。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章