轉載請註明原創出處,謝謝!java
阿里JAVA開發手冊已經發表有很長時間了,值得認真研究思考推廣程序員
- 阿里官方的Java代碼規範標準,這份開發手冊不只規範了一些開發細節,也提出了不少工程開發的哲學,值得好好閱讀。
- 可謂一應俱全,幾乎平常Java開發中方方面面都有所涉及。
- 每一條都是前人踩過的坑,經過血的教訓總結出來的。
- 能公佈出來真是造福所有Java開發者。
- 開發手冊詳細列舉如何開發更加高效,更加容錯,更加有協做性,力求知其然,更知其否則,結合正反例,提升代碼質量。好比,異常日誌處理時的各類不規範行爲;集合轉換的各類坑;建立線程池出現的等待隊列OOM等。
的確阿里JAVA開發手冊值得咱們好好閱讀和思考,每一條都是前人踩過的坑,經過血的教訓總結出來的。因此今天就其中一點本身的思考理解進行分享。算法
看完這條,我的以爲主要是圈複雜度,因爲代碼是人寫的,而且須要人來進行維護,若是足夠的複雜的話,那麼編寫出現錯誤的可能性都很大,而且維護理解起來難度也很是高,以及後期若是須要擴展原本就很複雜再加一個很簡單的功能都變得很困難(相信你們必定都有這樣的經歷)。ide
圈複雜度(Cyclomatic complexity)是一種代碼複雜度的衡量標準。
在軟件測試的概念裏,圈複雜度用來衡量一個模塊斷定結構的複雜程度,數量上表現爲獨立線性路徑條數,即合理的預防錯誤所需測試的最少路徑條數。圈複雜度大說明程序代碼可能質量低且難於測試和維護,根據經驗,程序的可能錯誤和高的圈複雜度有着很大關係。測試
看看上面阿里JAVA開發手冊裏面提到的,若是非得使用if()...else if()...else...方式表達邏輯,【強制】避免後續代碼維護困難,請匆超過3層。若是超過3層的if-else的邏輯判斷代碼可使用衛語句、策略模式、狀態模式等來實現。優化
其實在我看來,使用衛語句、策略模式、狀態模式就是來下降圈複雜度,讓代碼更加簡單,這樣不論是編寫代碼人員以及維護人員均可以很是方便了解到本質意思。ui
雖然阿里JAVA開發手冊提到的是if()...else if()...else...方式表達邏輯,延伸下,關於屢次嵌套循環等道理也同樣,須要考慮優化的。spa
如上圖,其實看起來就是一顆樹結構,相對來講其實比較複雜了,優化的思路其實就是把樹結構變成順序結構便可,那樣條理就清晰了,整體思路是這樣的,下面看看使用衛語句、策略模式、狀態模式怎麼達到的。線程
衛語句?衛語句就是把複雜的條件表達式拆分紅多個條件表達式,好比一個很複雜的表達式,嵌套了好幾層的if - then-else語句,轉換爲多個if語句,實現它的邏輯,這多條的if語句就是衛語句。3d
其中衛語句示例以下:
public void today() {
if (isBusy()) {
System.out.println("change time.");
return;
}
if (isFree()) {
System.out.println("go to travel.");
return;
}
System.out.println("stay at home to learn Alibaba Java Coding Guidelines.");
return;
}複製代碼
其實這個比較簡單,每個if對應葉子節點的一條路徑(每一個if基本就return了)。
概述:使用這個模式來將一組算法封裝成一系列對象。經過傳遞這些對象能夠靈活的改變程序的功能。
策略模式比較有名的就是諸葛亮的三個錦囊妙計提及,如圖:
諸葛亮爲何要這麼麻煩,作三個錦囊?他徹底能夠只作一個錦囊,將這三個妙計都寫在它上面。可他沒有這麼作,而是正確的運用了策略模式作了三個錦囊。這樣作的好處十分明顯:諸葛亮一個錦囊寫一個妙計,他的思路十分清晰,不會三個計策相互混亂。而趙雲看妙計的時候也十分方便,何時看哪一個妙計,使用十分方便,若是三個妙計混在一塊兒,他就沒這麼方便了。
在JDK中java.util.Comparator#compare()就是使用的策略模式,好比咱們常常對商品進行排序,條件有不少啊,按照商品瀏覽量、價格、更新時間、【價格、時間】、【瀏覽量、更新時間】(進行升序、降序操做)其實這個也是上面那顆樹,須要作的就是每次取其中一條葉子節點。不少時候這些判斷都是寫在一個公用的方法裏面,進行大量的判斷以後寫排序,而JDK怎麼作的呢?把變化的比較判斷拿出來,其實判斷樹中每一個葉子結點就是一種策略,想象咱們平時怎麼作的呢? 都是把Comparator#compare()寫好(可能有不少實現Comparator接口的排序算法)每次咱們調用的時候選擇其中一種便可。
與衛語句不一樣的是,衛語句把每個if對應葉子節點的一條路徑。而策略模式是因此葉子都在實現Comparator接口了,具體開始用那個是調用的直接用(因此不會像衛語句那樣看見不少if了)
概述:當一個對象的內在狀態改變時容許改變其行爲,這個對象看起來像是改變了其類。主要解決的是對象的行爲依賴於它的狀態(屬性),而且能夠根據它的狀態改變而改變它的相關行爲。
因爲狀態模式是封裝了轉換規則,因此通常樹的深度最少須要2層以及上,我的理解的感受就是一個流程了,好比*水低於0度是冰的狀態--> 大於0度又變成液態--> 100度又變成沸騰的狀態
狀態模式與策略模式很像,策略模式是外驅動,而狀態模式是內驅動。本質也是把判斷樹裏面只取其中一條葉子的路徑。
狀態模式有一個明顯的缺點:狀態模式對"開閉原則"的支持並不太好,對於能夠切換狀態的狀態模式,增長新的狀態類須要修改那些負責狀態轉換的源代碼,不然沒法切換到新增狀態,並且修改某個狀態類的行爲也需修改對應類的源代碼。
老婆給當程序員的老公打電話:下班順路買十個包子,若是看到賣西瓜的,買一個。當晚老公手捧一個包子進了家門…老婆怒道:你怎麼只買一個包子?!老公甚恐,喃喃道:由於我真看到賣西瓜的了。」
若是使用策略模式就簡單了,2條信息,1:買十個包子。2:買一個西瓜,沒有就算了。
雖然是個笑話,可是順序的就是比判斷的要簡單。
彙總:本質就是把較深的判斷樹,使用的時候,就是把判斷樹結構變成順序結構便可,就是給出每一個葉子的路徑而不須要看起來是一顆複雜的樹結構。
這是阿里JAVA開發手冊其中一條明細,爲何呢,結果是啥,怎麼出乎意料啦??期待你的留言和分析!!!
上面的一些分析都是我的本身的理解和思考,若是發現有不對的但願留言指出,謝謝!!!
若是讀完以爲有收穫的話,歡迎點贊加關注。
查閱歷史文章,歡迎關注我的公衆號!!!