Java開發規範之命名篇(下)

阿里巴巴早在2017年就推出了《Java開發手冊》,旨在規範Java開發人員在開發過程中的編碼,這套Java統一規範標準將有助於提高行業編碼規範化水平,幫助行業人員提高開發質量和效率、大大降低代碼維護成本。

爲了讓開發者更加方便、快速的將規範推動並實行起來,阿里巴巴基於手冊內容,研發了一套自動化的IDE檢測插件, 該插件在掃描代碼後,將不符合手冊規範的代碼顯示在界面中。我們可以在IDEA中選擇 Preferences - Plugins - Browse repositories ,輸入框中輸入"alibaba",選擇"Alibaba Java Coding Guidelines"進行安裝,重啓IDEA後即可使用。

Google也在2016年推出了《Java編程規範》,它是Google公司對Java編程風格規範的完整定義,主要內容包含編碼格式是否美觀的問題, 同時也討論一些約定及編碼標準。國內已經有人將其翻譯爲中文,具體請參考 Google《Java編程規範》中文版 ,另外如果需要PDF文檔可以在 這裏 去下載 。另外在Eclipse IDE和 IntelliJ IDE可以導入代碼風格配置文件,可以方便使用該編碼規範,請點擊 傳送門,具體方法是依次點擊 Window -> Preferences -> Java -> Code Style -> Formatter -> Import,導入下載文件後即可使用。

本系列文章將結合兩個《Java規範》進行總結,通過具體編碼案例給出編碼規範的原因,如果總結內容存在問題還望指出。


目錄

11.縮寫

12.避免隨意命名

13.常量與變量表示類型的名詞放在詞尾

14.設計模式體現在命名中

15.接口類方法和屬性不加修飾符

16.接口和實現類命名

17.枚舉類型命名

18.各層命名規約


本篇文章內容承接上一篇文章《Java開發規範之命名篇(上)》,進一步介紹Java開發的命名規範,主要針對阿里巴巴規範條目,同時結合Google規範。由於阿里巴巴規範比較詳細,文章內容順序以該規範爲準。

11.縮寫

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

【Google】比起其它類型的名稱,局部變量名可以有更爲寬鬆的縮寫。雖然縮寫更寬鬆,但還是要避免用單字符進行命名,除了臨時變量和循環變量。

說明:不正確的縮寫會誤導理解代碼功能含義

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

區別:Alibaba規範更加嚴格,避免國人不熟悉英文單詞而不規範的命名,Google規範只在局部變量名提到縮寫規範但也只是避免單字符命名

補充:由於母語不是英語,中國開發人員開發過程經常會出現這個問題,但縮寫問題也不能一概而論,不同的公司應該都會有自己的標準,只要統一標準這類問題也可以很好解決

12.避免隨意命名

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

【Google】類名通常是名詞或名詞短語,接口名稱有時可能是形容詞或形容詞短語,方法名通常是動詞或動詞短語,常量名和非常量名通常是名詞或名詞短語,參數和局部變量名應該避免用單個字符命名。類型變量可以是單個的大寫字母,後面可以跟一個數字(如:E, T, X, T2),或者以類命名方式,後面加個大寫的T(如:RequestT, FooBarT)。

說明:隨意命名是不負責任的行爲,後期項目維護對他人閱讀極不友好

正例:

【Alibaba 】在JDK中,表達原子更新的類名爲:AtomicReferenceFieldUpdater。

【Google】定義泛型類:EmployeeDOMapper<T> / EmployeeDOMapper<E>,定義泛型變量 ArrayList<T> / ArrayList<E>

反例:【Alibaba 】int a的隨意命名方式。

區別:Alibaba和Google規範都在強調單詞命名,但Google對不同類型命名更加嚴格

補充:在IDEA中一般定義變量會自動提示寫法,可以參考修正

13.常量與變量表示類型的名詞放在詞尾

【Alibaba 】在常量與變量的命名時,表示類型的名詞放在詞尾,以提升辨識度。

【Google】未做類似要求

說明:該要求只是推薦,這種方式可以更好識別變量和常量

正例:【Alibaba 】startTime / workQueue / nameList / TERMINATED_THREAD_COUNT

反例:【Alibaba 】startedAt / QueueOfWork / listName / COUNT_TERMINATED_THREAD

14.設計模式體現在命名中

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

【Google】未做類似要求

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

正例: 【Alibaba 】public class OrderFactory  /  public class LoginProxy  /  public class ResourceObserver

15.接口類方法和屬性不加修飾符

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

【Google】未做類似要求

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

正例:【Alibaba 】接口方法簽名 void commit(); 接口基礎常量 String COMPANY = "alibaba";

反例:【Alibaba 】接口方法定義 public abstract void f();

16.接口和實現類命名

【Alibaba 】接口和實現類的命名有兩套規則: 1)對於Service和DAO類,基於SOA的理念,暴露出來的服務一定是接口,內部的實現類用Impl的後綴與接口區別。 2)如果是形容能力的接口名稱,取對應的形容詞爲接口名(通常是–able的形容詞)。

【Google】未做類似要求

說明:如果接口和實現類不按照規則定義會引起歧義,上述規則只是推薦,可以自定義其他規則

正例:【Alibaba 】CacheServiceImpl實現CacheService接口。AbstractTranslator實現 Translatable接口。

17.枚舉類型命名

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

【Google】未做類似要求,適用於其它類的格式規則也適用於枚舉類。

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

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

18.各層命名規約

【Alibaba 】

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

  • 1) 獲取單個對象的方法用get做前綴。
  • 2) 獲取多個對象的方法用list做前綴,複數形式結尾如:listObjects。
  • 3) 獲取統計值的方法用count做前綴。
  • 4) 插入的方法用save/insert做前綴。
  • 5) 刪除的方法用remove/delete做前綴。
  • 6) 修改的方法用update做前綴。

B) 領域模型命名規約

  • 1) 數據對象:xxxDO,xxx即爲數據表名。
  • 2) 數據傳輸對象:xxxDTO,xxx爲業務領域相關的名稱。
  • 3) 展示對象:xxxVO,xxx一般爲網頁名稱。
  • 4) POJO是DO/DTO/BO/VO的統稱,禁止命名成xxxPOJO。

【Google】未做類似要求

說明:該規範適合團隊開發,這樣規範非本人開發功能可以快速定位使用,一般大公司都會有這樣的要求。

 

 

 

 

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