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規範》進行總結,通過具體編碼案例給出編碼規範的原因,如果總結內容存在問題還望指出。


目錄

1. 類名開始和結尾

2.拼音與英文混合命名

3.UpperCamelCase風格命名

4.lowerCamelCase風格命名

5.常量名命名

6.特殊類命名前綴和後綴

7.類型和括號位置

8.POJO類變量禁止命名方式

9.包名命名方式

10.變量重名


本篇文章總結的內容是Java開發規範的命名規範,主要涉及Java的類、方法、變量和包名等命名規範,對應阿里巴巴的Java開發手冊的第一章第一節命名風格和谷歌Java開發手冊第五章命名,該規範只是作爲建議,具體實施過程可以根據場景變動。

1. 類名開始和結尾

【阿里巴巴】代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束。

【Google】標識符只能使用ASCII字母和數字,因此每個有效的標識符名稱都能匹配正則表達式 \w+ 。

說明:雖然Java命名沒有強制定義命名的字符,但是如果命名規範對後期代碼閱讀和維護有很大幫助。

反例:

【阿里巴巴】_name / __name / $name / name_ / name$ / name__

【Google】其它編程語言風格中使用的特殊前綴或後綴,如 name_ , mName ,s_name 和 kName ,在Java編程風格中都不再使用。

區別:Google規範要求更加嚴格,特殊前綴也無法使用

2.拼音與英文混合命名

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

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

正例:【阿里巴巴】renminbi / alibaba / taobao / youku / hangzhou 等國際通用的名稱,可視同英文。

反例:【阿里巴巴】DaZhePromotion [打折] / getPingfenByName() [評分] / int 某變量 = 3

補充:這個問題可能是很多中國開發人員頭疼的問題,不要着急,請參考 傳送門1 和 傳送門2

3.UpperCamelCase風格命名

【阿里巴巴】類名使用UpperCamelCase風格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等。

【Google】類名都以 UpperCamelCase 風格編寫。

說明:該規範可以更好的識別命名的邏輯層次,區分每個英文單詞和理解含義,不建議使用下劃線等符號分隔單詞

正例:【阿里巴巴】JavaServerlessPlatform / UserDO / XmlService / TcpUdpDeal / TaPromotion

反例:【阿里巴巴】javaserverlessplatform / UserDo / XMLService / TCPUDPDeal / TAPromotion

區別:無區別,應該是業界默認的要求,具體場景可以修正

4.lowerCamelCase風格命名

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

【Google】方法名、非常量字段名、參數名、成員變量、局部變量都以 lowerCamelCase 風格編寫。

說明:該規範類似UpperCamelCase風格,不同是首字母小寫

正例:【阿里巴巴】 localValue / getHttpMessage() / inputUserId

區別:谷歌規範更加嚴格,增加了非常量字段名的要求

5.常量名命名

【阿里巴巴】常量命名全部大寫,單詞間用下劃線隔開,力求語義表達完整清楚,不要嫌名字長。

【Google】常量名命名模式爲 CONSTANT_CASE ,全部字母大寫,用下劃線分隔單詞。

說明:常量需要和一般變量區分開,儘量使用好理解含義的命名方式

正例:【阿里巴巴】MAX_STOCK_COUNT / CACHE_EXPIRED_TIME

反例:【阿里巴巴】MAX_COUNT / EXPIRED_TIME  ——> 語義表達不清

6.特殊類命名前綴和後綴

【阿里巴巴】抽象類命名使用Abstract或Base開頭;異常類命名使用Exception結尾;測試類命名以它要測試的類的名稱開始,以Test結尾。

【Google】類名通常是名詞或名詞短語,接口名稱有時可能是形容詞或形容詞短語。測試類的命名以它要測試的類的名稱開始,以 Test 結束。

說明:類名是最能直接反映類功能的,規範定義方便後期閱讀和維護

7.類型和括號位置

【阿里巴巴】類型與中括號緊挨相連來表示數組。

【Google】數組的中括號是類型的一部分:String[] args, 而非String args[]

說明:雖然Java沒有強制規定括號的位置,但類型緊跟括號更能體現數組類型或其他含義

正例:【阿里巴巴】定義整形數組int[] arrayDemo;

反例:【阿里巴巴】【Google】在main參數中,使用String args[]來定義。

8.POJO類變量禁止命名方式

【阿里巴巴】POJO類中布爾類型變量都不要加is前綴,否則部分框架解析會引起序列化錯誤。

說明:Spring會根據getter和setter來解析POJO類,如創建isXxx,那麼自動生成的getter方法會是isXxx方法,然後解析時會去掉is變成Xxx。該規範是很多開發人員會犯的錯誤,發生問題再逐個debug非常浪費時間。

反例:【阿里巴巴】定義爲基本數據類型Boolean isDeleted的屬性,它的方法也是isDeleted(),RPC框架在反向解析的時候,“誤以爲”對應的屬性名稱是deleted,導致屬性獲取不到,進而拋出異常。

9.包名命名方式

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

【Google】包名全部小寫,連續的單詞只是簡單地連接起來,不使用下劃線。

說明:包名反映了該包下所有類的功能含義,因此意義比較重要

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

區別:阿里巴巴規範更加嚴格,單詞不能連接,點分隔符之間有且僅有一個自然語義的英語單詞

10.變量重名

【阿里巴巴】避免在子父類的成員變量之間、或者不同代碼塊的局部變量之間採用完全相同的命名,使可讀性降低。

說明:子類、父類成員變量名相同,即使是public類型的變量也是能夠通過編譯,而局部變量在同一方法內的不同代碼塊中同名也是合法的,但是要避免使用。對於非setter/getter的參數名稱也要避免與成員變量名稱相同。

 

 

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