前言

首先當(dāng)我第一次看見這個(gè)的手冊(cè)的時(shí)候或許和和你們是一樣激動(dòng)的,因?yàn)樵趈ava行業(yè)內(nèi)我還沒有看見有中文的規(guī)范,也可能是我讀書少??傊@是我見到的第一個(gè)中午的java規(guī)范。

首先還是要感謝阿里能給出這樣一個(gè)規(guī)范,萬事還是要懷有感恩的嘛,畢竟也是別人努力的結(jié)果。

首先沒有規(guī)矩不成方圓,我覺得有了規(guī)矩,才能讓大家的代碼可讀性和魯棒性上面有所提高。而且規(guī)矩這東西是慢慢形成的,如果之后行業(yè)內(nèi)的規(guī)范越來越相同的話那么互相交流也變的方便了不少。

然后要說明的是,規(guī)矩也是人定的,所以,不同的公司肯定有不同的代碼規(guī)范,至少我所在的公司內(nèi)部也漸漸的形成了自己的規(guī)范,我想說的是,并非我們一定要每一條都參考上面的手冊(cè)(也并非不可以),有些還是要看具體情況的,但是至少阿里的實(shí)力擺在那里,所以有的規(guī)矩有它存在的道理。

其實(shí)我們要做的就是學(xué)習(xí)其中我們所不知道的,改掉我們那些壞習(xí)慣,保留我們的好習(xí)慣,那么這個(gè)手冊(cè)的價(jià)值就大大的了,不是嗎?

廢話了這么多,我知道肯定也沒有人會(huì)看的,下面趕緊上貨,我會(huì)分章節(jié)總結(jié)手冊(cè)中我認(rèn)為重要和解釋有些不太明確的地方,沒有列舉的,并非不重要,而是覺得手冊(cè)已經(jīng)寫的很棒,我沒啥好說的了。

 

編程規(guī)約

這次說的是第一章,因?yàn)槲也幌朊摰奶L,后面的我想慢慢整理,知識(shí)點(diǎn)還是很多的。所以這篇暫時(shí)只說明第一章的內(nèi)容。

 

(一)命名規(guī)范

3、說明一下DO/BO/DTO/VO是什么

看到這條的時(shí)候我對(duì)命名到是沒有疑問,但是很多人可能像我一樣看到這四個(gè)縮寫的時(shí)候有疑問。所以解釋一下。

首先要說的是他們都有一個(gè)統(tǒng)稱叫POJO。

DO Domain Object 領(lǐng)域?qū)ο螅簭默F(xiàn)實(shí)世界抽象出來的業(yè)務(wù)實(shí)體。

BO Business Obejct 業(yè)務(wù)對(duì)象:面向業(yè)務(wù)建立的實(shí)體,包含多個(gè)PO或VO。

DTO Data Transfer Object 數(shù)據(jù)傳輸對(duì)象:展示層和服務(wù)層之間的數(shù)據(jù)傳輸建立的實(shí)體。

VO Value Object(還有叫View Object) 值對(duì)象:僅包含數(shù)據(jù),不包含業(yè)務(wù)邏輯的對(duì)象,通常用于頁面顯示。

PO Persustan Object 持久對(duì)象:對(duì)應(yīng)數(shù)據(jù)庫的對(duì)象,與數(shù)據(jù)庫字段一一對(duì)應(yīng)。

在簡單的項(xiàng)目中,或者當(dāng)時(shí)在學(xué)習(xí)的時(shí)候,老師可能會(huì)不將實(shí)體分的很細(xì),多數(shù)命名會(huì)直接采用末尾加POJO或者Entity或者M(jìn)odel等,一個(gè)類從數(shù)據(jù)庫一直用到頁面顯示,確實(shí)簡單,但是也危險(xiǎn)。對(duì)于復(fù)雜的項(xiàng)目來說,對(duì)于實(shí)體來說其實(shí)分開很重要,舉個(gè)最簡單的例子,對(duì)于一個(gè)用戶實(shí)體來說,密碼不應(yīng)該在查詢的時(shí)候返回給用戶,我們之前使用的可能是在數(shù)據(jù)庫中查詢的時(shí)候不查詢出來,但是實(shí)際中需要建立一個(gè)TO對(duì)象等,根本就不包含密碼這個(gè)字段。再舉個(gè)例子,很多在數(shù)據(jù)庫中表的字段有10多個(gè),但是在頁面中需要顯示的只需要3個(gè),多余的數(shù)據(jù)會(huì)導(dǎo)致傳輸速度下降,所以需要新建VO對(duì)象去進(jìn)行頁面顯示,只取用需要的數(shù)據(jù)。

對(duì)于各個(gè)對(duì)象的定義參考來自:http://www.open-open.com/lib/view/open1450427478266.html

 

8、POJO布爾類型不要加is,這個(gè)是真的細(xì)節(jié),本人遇到過boolean isSuccess的錯(cuò)誤,千萬不要這樣命名,其實(shí)就是不要使用翻譯軟件直接去翻譯或者直接想著中式英語去翻譯你的變量就行了,規(guī)范一點(diǎn)就能避免很多錯(cuò)誤。

 

15、DAO中,接口后綴Dao實(shí)現(xiàn)用Impl就不多說了,主要是這點(diǎn)對(duì)于方法的命名很重要。

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

1) 獲取單個(gè)對(duì)象的方法用 get 做前綴。   

2) 獲取多個(gè)對(duì)象的方法用 list 做前綴。   

3) 獲取統(tǒng)計(jì)值的方法用 count 做前綴。   

4) 插入的方法用 save(推薦)或 insert 做前綴。   

5) 刪除的方法用 remove(推薦)或 delete 做前綴。  

6) 修改的方法用 update 做前綴。

B) 領(lǐng)域模型命名規(guī)約   

1) 數(shù)據(jù)對(duì)象:xxxDO,xxx 即為數(shù)據(jù)表名。   

2) 數(shù)據(jù)傳輸對(duì)象:xxxDTO,xxx 為業(yè)務(wù)領(lǐng)域相關(guān)的名稱。   

3) 展示對(duì)象:xxxVO,xxx 一般為網(wǎng)頁名稱。   

4) POJO 是 DO/DTO/BO/VO 的統(tǒng)稱,禁止命名成 xxxPOJO。

首先為什么要使用前綴,因?yàn)槲覀兊腎DE都有自動(dòng)識(shí)別你要的方法,當(dāng)我們使用的時(shí)候很方便,方法前綴的統(tǒng)一,可以讓多人開發(fā)的時(shí)候想要找別人寫好的接口方法很容易。sava和remove我之前在github上面看見過,不知道是不是國外這么寫的,insert和delete太數(shù)據(jù)庫化了感覺。

這里還要補(bǔ)充一點(diǎn)的是,每個(gè)公司最好定義一下分頁方法的規(guī)則,對(duì)于分頁來說用到的很多,而且特別的命名讓別人知道這個(gè)是分頁的方法。有時(shí)還有特別的用處。

補(bǔ)充第二點(diǎn),如果是系統(tǒng)的項(xiàng)目,后臺(tái)管理系統(tǒng)和前臺(tái)的系統(tǒng)方法最好分開命名,比如在方法中加入back,雖然代碼量上去了,但是為了保證以后進(jìn)行修改的時(shí)候,一旦修改后臺(tái)要?jiǎng)拥角芭_(tái)這種麻煩,還有就是,前臺(tái)和后臺(tái)查詢的數(shù)據(jù)肯定是不同的,有些數(shù)據(jù)不應(yīng)該顯示的就不要查詢出來。

 

(二)常量定義

這里主要總結(jié)一點(diǎn),把常量進(jìn)行區(qū)域范圍管理,不要總是不動(dòng)腦子的全部全局變量。

 

(三)格式規(guī)范

5、這里我使用的tab不喜歡空格,空格容易敲錯(cuò)。其他均同意。

10、關(guān)于空行,空行的使用是這樣的,首先我們?cè)趯懘a的時(shí)候,我習(xí)慣先寫注釋,然后用很多的空行把業(yè)務(wù)邏輯分塊,這樣出現(xiàn)的代碼會(huì)是一塊塊的,這樣容易識(shí)別,但是要注意的是,最后需要?jiǎng)h除多余的空行,保留最需要的,利用注釋去分塊業(yè)務(wù)。

 

(四)OOP規(guī)約

6、不要使用Object的equals,使用常量調(diào)用equals

 

7、注意包裝類的數(shù)值比較用equals(是不是很疑惑為什么要列這一條,而且這條你還從來不注意??聪乱粭l!)

 

8、(這里的RPC可以理解為通信獲取數(shù)據(jù))

1) 所有的 POJO 類屬性必須使用包裝數(shù)據(jù)類型。

2) RPC 方法的返回值和參數(shù)必須使用包裝數(shù)據(jù)類型。 

3) 所有的局部變量【推薦】使用基本數(shù)據(jù)類型。

說實(shí)話,我看見這條的時(shí)候嚇?biāo)懒耍驗(yàn)槲抑霸趯?shí)體類中使用的一直是int double,幾乎沒用過包裝類。 但是更嚇人的是阿里的反例說明正是我之前遇到的情況,而且我正是在這種情況下才使用的包裝類,其他都沒用過。真的是被嚇?biāo)懒恕?/span>

這里給出我的意見,包裝類的好處是可以有null,基本類型是必須有值的。

在頁面顯示的時(shí)候,有的數(shù)據(jù)其實(shí)查詢的是null應(yīng)該顯示的是空白,而不是0,那么必須使用包裝類,其他我真的找不到的其他的必要。所以要不要尊重這一條就看你們自己了。

 

9、之前已經(jīng)我們公司已經(jīng)有人試過了,設(shè)置實(shí)體類默認(rèn)值會(huì)導(dǎo)致一系列問題,最后崩盤,所以千萬不要中招。

 

12、POJO必須寫toString,我這個(gè)人比較懶,所以沒寫過。(應(yīng)該不止我一個(gè)人吧~害怕)因?yàn)榇蠖鄶?shù)時(shí)間我都使用斷點(diǎn)調(diào)試,并不需要輸出數(shù)據(jù)進(jìn)行調(diào)試,但是當(dāng)一些日志調(diào)試的時(shí)候還真的需要使用,所以我之后會(huì)考慮加上的。同時(shí)如果你覺得沒有必要,我也不反對(duì)。

 

16、不要在get和set方法中加入業(yè)務(wù)邏輯,注意這里指的是業(yè)務(wù)邏輯,如果是對(duì)數(shù)據(jù)的處理是沒關(guān)系的,比如對(duì)于一些數(shù)據(jù)字段的拼接。

 

17、一句話,盡量使用StringBuilder,不要怕麻煩,內(nèi)存不是用來給你浪費(fèi)的。

 

18和20一起說,時(shí)時(shí)刻刻都要注意final關(guān)鍵字的使用,這個(gè)關(guān)鍵字其實(shí)我們很多時(shí)候都會(huì)忘記掉,我就是,除了全局變量,我還真的很少用,其實(shí)這里列舉的很好,不需要重新賦值,不允許修改引用的指向,不允許被重寫,都要使用final,會(huì)避免很多問題,真的。變量的控制永遠(yuǎn)從嚴(yán),我覺得舉的例子特別形象,就在下面列一下。

20. 【推薦】類成員與方法訪問控制從嚴(yán): 

1) 如果不允許外部直接通過 new 來創(chuàng)建對(duì)象,那么構(gòu)造方法必須是 private。 

2) 工具類不允許有 public 或 default 構(gòu)造方法。 

3) 類非 static 成員變量并且與子類共享,必須是 protected。  

4) 類非 static 成員變量并且僅在本類使用,必須是 private。 

5) 類 static 成員變量如果僅在本類使用,必須是 private。 

6) 若是 static 成員變量,必須考慮是否為 final。 

7) 類成員方法只供類內(nèi)部調(diào)用,必須是 private。  

8) 類成員方法只對(duì)繼承類公開,那么限制為 protected。

說明:任何類、方法、參數(shù)、變量,嚴(yán)控訪問范圍。過寬泛的訪問范圍,不利于模塊解耦。思 考:如果是一個(gè) private 的方法,想刪除就刪除,可是一個(gè) public 的 Service 方法,或者一 個(gè) public 的成員變量,刪除一下,不得手心冒點(diǎn)汗嗎?變量像自己的小孩,盡量在自己的視 線內(nèi),變量作用域太大,如果無限制的到處跑,那么你會(huì)擔(dān)心的。

 

(五)集合處理

2、這個(gè)點(diǎn)我遇到過,參考我之前寫的博客,比較好理解的。

http://www.cnblogs.com/linkstar/p/5710116.html

 

7、foreach中不要進(jìn)行remove和add

 

11、這張表格是重點(diǎn)(考試是重點(diǎn),記一下咯)

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動(dòng)畫培訓(xùn)

 

(六)并發(fā)處理

對(duì)于并發(fā),本人經(jīng)驗(yàn)不足,而且在下載地址的最底下的評(píng)論,你們可以看見,有人對(duì)其中一些產(chǎn)生了質(zhì)疑,我暫時(shí)真的在實(shí)際中運(yùn)用過,所以等有經(jīng)驗(yàn)我在告訴你們,雖然我知道很重要,但我也很無奈?。ɑ槪?/span>

 

(七)控制語句

3、多使用if+return,你們懂的。我們老師有一句經(jīng)典的話,盡早退出能更好選擇對(duì)的人。

 

7和8一起說:很多人都在編程中糾結(jié)這個(gè)問題,我到底判不判斷這個(gè)參數(shù)對(duì)不對(duì)空不空啊,判的太多,性能就下去了,判的太少,那么容易出問題。

這里我給出我的建議,首先你大可不比去記手冊(cè)上面說的,情況,我覺得有點(diǎn)多,我給出我自己的方法,你們看著接住。

1、循環(huán)調(diào)用,盡可能不判,性能太低,或者判斷之前就應(yīng)該解決掉。

2、dao不判,接觸數(shù)據(jù)庫,這種底層是不會(huì)出錯(cuò)的,否則就是你代碼有問題,上層再去判斷。

3、私有不判,這個(gè)參數(shù)上面剛用過,不可能是空的,要錯(cuò)上面早就之前這個(gè)參數(shù)早就錯(cuò)了,所以不判。

4、如果不確定,先判再刪,不判不知道會(huì)不會(huì)出錯(cuò),那么就判,判最多就是效率低,但是不會(huì)出錯(cuò),優(yōu)化性能的時(shí)候在考慮要不要把判斷的語句刪除即可。

5、我們只記住不需要判斷的情況剩下的都是要判的。

 

(八)注釋規(guī)范

對(duì)于注釋就總結(jié)一下:

對(duì)于注釋的要求:第一、能夠準(zhǔn)確反應(yīng)設(shè)計(jì)思想和代碼邏輯;第二、能夠描述業(yè)務(wù)含 義,使別的程序員能夠迅速了解到代碼背后的信息。完全沒有注釋的大段代碼對(duì)于閱讀者形同 
天書,注釋是給自己看的,即使隔很長時(shí)間,也能清晰理解當(dāng)時(shí)的思路;注釋也是給繼任者看 的,使其能夠快速接替自己的工作。 好的命名、代碼結(jié)構(gòu)是自解釋的,注釋力求精簡準(zhǔn)確、表達(dá)到位。避免出現(xiàn)注釋的 一個(gè)極端:過多過濫的注釋,代碼的邏輯一旦修改,修改注釋是相當(dāng)大的負(fù)擔(dān)。

特殊標(biāo)記:TODO我們經(jīng)常用,F(xiàn)IXME還沒開發(fā)或者有錯(cuò)誤,///////吃飯之前我剛寫到這(別小看這個(gè)注釋,救了很多人的),//-----業(yè)務(wù)邏輯….(利用這個(gè)分離還沒寫的業(yè)務(wù)邏輯),OTHER需要調(diào)用別人的接口(開發(fā)的時(shí)候并接口都是你自己寫的,有可能別人還沒寫好,注釋一下自己就不會(huì)忘記,或者自己寫多了。),當(dāng)然你們可以規(guī)定你們自己的。這些是我常用的。

 

(九)其他

3、這個(gè)點(diǎn)我保留懷疑態(tài)度,我覺的有的業(yè)務(wù)下面是允許空的,所以不應(yīng)該為強(qiáng)制。

4、使用 Random 對(duì)象的 nextInt 或者 nextLong 方法獲取整數(shù)隨機(jī)數(shù)。

 

以上就是我需要整理出來的點(diǎn),如果有什么地方說的不對(duì)的,謙虛求評(píng)論,我馬上改正。

你們需要的就拿走不要的就留下就行咯。