阿里JAVA開發(fā)手冊(cè)的思考理解

姓名:榮皓宇

學(xué)號(hào):17101223406

轉(zhuǎn)載自開發(fā)者頭條app: http://mp.weixin.qq.com/s/dDR21k30s6ZVfDvl8BVQmA冶共,有部分刪改

【嵌牛導(dǎo)讀】:阿里官方的Java代碼規(guī)范標(biāo)準(zhǔn),這份開發(fā)手冊(cè)不僅規(guī)范了一些開發(fā)細(xì)節(jié)庙楚,也提出了很多工程開發(fā)的哲學(xué)趴樱,

幾乎日常Java開發(fā)中方方面面都有所涉及纳账,每一條都是前人踩過(guò)的坑航揉,通過(guò)血的教訓(xùn)總結(jié)出來(lái)的议薪。

本文就其中分支選擇的規(guī)范做了一些思考

【嵌牛鼻子】:代碼規(guī)范斯议,if-else哼御,圈復(fù)雜度

【嵌牛提問(wèn)】:switch語(yǔ)句是否也符合文中所述的策略模式恋昼?

【嵌牛正文】:

阿里Java開發(fā)手冊(cè)下載鏈接: https://yq.aliyun.com/articles/69327?utm_content=m_10088

阿里JAVA開發(fā)手冊(cè)已經(jīng)發(fā)表有很長(zhǎng)時(shí)間了液肌,值得認(rèn)真研究思考推廣

阿里官方的Java代碼規(guī)范標(biāo)準(zhǔn)嗦哆,這份開發(fā)手冊(cè)不僅規(guī)范了一些開發(fā)細(xì)節(jié),也提出了很多工程開發(fā)的哲學(xué)粥喜,值得好好閱讀。

可謂包羅萬(wàn)象缩挑,幾乎日常Java開發(fā)中方方面面都有所涉及供置。

每一條都是前人踩過(guò)的坑芥丧,通過(guò)血的教訓(xùn)總結(jié)出來(lái)的坊罢。

能公布出來(lái)真是造福全部Java開發(fā)者物遇。

開發(fā)手冊(cè)詳細(xì)列舉如何開發(fā)更加高效憾儒,更加容錯(cuò)询兴,更加有協(xié)作性,力求知其然起趾,更知其不然诗舰,結(jié)合正反例,提高代碼質(zhì)量训裆。比如眶根,異常日志處理時(shí)的各種不規(guī)范行為;集合轉(zhuǎn)換的各種坑边琉;創(chuàng)建線程池出現(xiàn)的等待隊(duì)列OOM等属百。

的確阿里JAVA開發(fā)手冊(cè)值得我們好好閱讀和思考,每一條都是前人踩過(guò)的坑变姨,通過(guò)血的教訓(xùn)總結(jié)出來(lái)的别伏。所以今天就其中一點(diǎn)自己的思考理解進(jìn)行分享类茂。

看完這條兢哭,個(gè)人覺(jué)得主要是圈復(fù)雜度舍咖,由于代碼是人寫的攻柠,并且需要人來(lái)進(jìn)行維護(hù)飞涂,如果足夠的復(fù)雜的話梁呈,那么編寫出現(xiàn)錯(cuò)誤的可能性都很大哮翘,并且維護(hù)理解起來(lái)難度也非常高,以及后期如果需要擴(kuò)展本來(lái)就很復(fù)雜再加一個(gè)很簡(jiǎn)單的功能都變得很困難(相信大家一定都有這樣的經(jīng)歷)。

圈復(fù)雜度

圈復(fù)雜度(Cyclomatic complexity)是一種代碼復(fù)雜度的衡量標(biāo)準(zhǔn)。在軟件測(cè)試的概念里,圈復(fù)雜度用來(lái)衡量一個(gè)模塊判定結(jié)構(gòu)的復(fù)雜程度,數(shù)量上表現(xiàn)為獨(dú)立線性路徑條數(shù)洒试,即合理的預(yù)防錯(cuò)誤所需測(cè)試的最少路徑條數(shù)畔裕。圈復(fù)雜度大說(shuō)明程序代碼可能質(zhì)量低且難于測(cè)試和維護(hù)甜无,根據(jù)經(jīng)驗(yàn)畔乙,程序的可能錯(cuò)誤和高的圈復(fù)雜度有著很大關(guān)系咖摹。

看看上面阿里JAVA開發(fā)手冊(cè)里面提到的嗦枢,如果非得使用if()...else if()...else...方式表達(dá)邏輯,【強(qiáng)制】避免后續(xù)代碼維護(hù)困難丸相,請(qǐng)匆超過(guò)3層。如果超過(guò)3層的if-else的邏輯判斷代碼可以使用衛(wèi)語(yǔ)句彼棍、策略模式更舞、狀態(tài)模式等來(lái)實(shí)現(xiàn)。

其實(shí)在我看來(lái),使用衛(wèi)語(yǔ)句咸产、策略模式、狀態(tài)模式就是來(lái)降低圈復(fù)雜度,讓代碼更加簡(jiǎn)單痛阻,這樣不管是編寫代碼人員以及維護(hù)人員都可以非常方便了解到本質(zhì)意思菌瘪。

雖然阿里JAVA開發(fā)手冊(cè)提到的是if()...else if()...else...方式表達(dá)邏輯,延伸下阱当,關(guān)于多次嵌套循環(huán)等道理也一樣俏扩,需要考慮優(yōu)化的。

思路分析

如上圖弊添,其實(shí)看起來(lái)就是一顆樹結(jié)構(gòu)录淡,相對(duì)來(lái)說(shuō)其實(shí)比較復(fù)雜了,優(yōu)化的思路其實(shí)就是把樹結(jié)構(gòu)變成順序結(jié)構(gòu)即可油坝,那樣條理就清晰了嫉戚,總體思路是這樣的刨裆,下面看看使用衛(wèi)語(yǔ)句、策略模式彬檀、狀態(tài)模式怎么達(dá)到的帆啃。

衛(wèi)語(yǔ)句

衛(wèi)語(yǔ)句?衛(wèi)語(yǔ)句就是把復(fù)雜的條件表達(dá)式拆分成多個(gè)條件表達(dá)式窍帝,比如一個(gè)很復(fù)雜的表達(dá)式努潘,嵌套了好幾層的if - then-else語(yǔ)句,轉(zhuǎn)換為多個(gè)if語(yǔ)句坤学,實(shí)現(xiàn)它的邏輯疯坤,這多條的if語(yǔ)句就是衛(wèi)語(yǔ)句。

其中衛(wèi)語(yǔ)句示例如下:

publicvoidtoday(){

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;

}

其實(shí)這個(gè)比較簡(jiǎn)單拥峦,每一個(gè)if對(duì)應(yīng)葉子節(jié)點(diǎn)的一條路徑(每個(gè)if基本就return了)贴膘。

策略模式

概述:使用這個(gè)模式來(lái)將一組算法封裝成一系列對(duì)象。通過(guò)傳遞這些對(duì)象可以靈活的改變程序的功能略号。

策略模式比較有名的就是諸葛亮的三個(gè)錦囊妙計(jì)說(shuō)起,如圖:

諸葛亮為什么要這么麻煩洋闽,做三個(gè)錦囊玄柠?他完全可以只做一個(gè)錦囊,將這三個(gè)妙計(jì)都寫在它上面诫舅∮鹄可他沒(méi)有這么做,而是正確的運(yùn)用了策略模式做了三個(gè)錦囊刊懈。這樣做的好處十分明顯諸葛亮一個(gè)錦囊寫一個(gè)妙計(jì)这弧,他的思路十分清晰,不會(huì)三個(gè)計(jì)策相互混亂虚汛。趙云看妙計(jì)的時(shí)候也十分方便匾浪,什么時(shí)候看哪個(gè)妙計(jì),使用十分方便卷哩,如果三個(gè)妙計(jì)混在一起蛋辈,他就沒(méi)這么方便了。

在JDK中java.util.Comparator#compare()就是使用的策略模式将谊,比如我們經(jīng)常對(duì)商品進(jìn)行排序冷溶,條件有很多啊,按照商品瀏覽量尊浓、價(jià)格逞频、更新時(shí)間、【價(jià)格栋齿、時(shí)間】苗胀、【瀏覽量襟诸、更新時(shí)間】(進(jìn)行升序、降序操作)其實(shí)這個(gè)也是上面那顆樹柒巫,需要做的就是每次取其中一條葉子節(jié)點(diǎn)励堡。很多時(shí)候這些判斷都是寫在一個(gè)公用的方法里面,進(jìn)行大量的判斷之后寫排序堡掏,而JDK怎么做的呢应结?把變化的比較判斷拿出來(lái),其實(shí)判斷樹中每個(gè)葉子結(jié)點(diǎn)就是一種策略泉唁,想象我們平時(shí)怎么做的呢鹅龄? 都是把Comparator#compare()寫好(可能有很多實(shí)現(xiàn)Comparator接口的排序算法)每次我們調(diào)用的時(shí)候選擇其中一種即可。

與衛(wèi)語(yǔ)句不同的是亭畜,衛(wèi)語(yǔ)句把每一個(gè)if對(duì)應(yīng)葉子節(jié)點(diǎn)的一條路徑扮休。而策略模式是所以葉子都在實(shí)現(xiàn)Comparator接口了,具體開始用那個(gè)是調(diào)用的直接用(所以不會(huì)像衛(wèi)語(yǔ)句那樣看見很多if了)

狀態(tài)模式

概述:當(dāng)一個(gè)對(duì)象的內(nèi)在狀態(tài)改變時(shí)允許改變其行為拴鸵,這個(gè)對(duì)象看起來(lái)像是改變了其類玷坠。主要解決的是對(duì)象的行為依賴于它的狀態(tài)(屬性),并且可以根據(jù)它的狀態(tài)改變而改變它的相關(guān)行為劲藐。

封裝了轉(zhuǎn)換規(guī)則八堡。

枚舉可能的狀態(tài),在枚舉狀態(tài)之前需要確定狀態(tài)種類聘芜。

將所有與某個(gè)狀態(tài)有關(guān)的行為放到一個(gè)類中兄渺,并且可以方便地增加新的狀態(tài),只需要改變對(duì)象狀態(tài)即可改變對(duì)象的行為汰现。

允許狀態(tài)轉(zhuǎn)換邏輯與狀態(tài)對(duì)象合成一體挂谍,而不是某一個(gè)巨大的條件語(yǔ)句塊。

可以讓多個(gè)環(huán)境對(duì)象共享一個(gè)狀態(tài)對(duì)象瞎饲,從而減少系統(tǒng)中對(duì)象的個(gè)數(shù)口叙。

由于狀態(tài)模式是封裝了轉(zhuǎn)換規(guī)則,所以一般樹的深度最少需要2層以及上企软,個(gè)人理解的感覺(jué)就是一個(gè)流程了庐扫,比如*水低于0度是冰的狀態(tài)--> 大于0度又變成液態(tài)--> 100度又變成沸騰的狀態(tài)

狀態(tài)模式與策略模式很像,策略模式是外驅(qū)動(dòng)仗哨,而狀態(tài)模式是內(nèi)驅(qū)動(dòng)形庭。本質(zhì)也是把判斷樹里面只取其中一條葉子的路徑。

狀態(tài)模式有一個(gè)明顯的缺點(diǎn):狀態(tài)模式對(duì)"開閉原則"的支持并不太好厌漂,對(duì)于可以切換狀態(tài)的狀態(tài)模式萨醒,增加新的狀態(tài)類需要修改那些負(fù)責(zé)狀態(tài)轉(zhuǎn)換的源代碼,否則無(wú)法切換到新增狀態(tài)苇倡,而且修改某個(gè)狀態(tài)類的行為也需修改對(duì)應(yīng)類的源代碼富纸。

程序員笑話

老婆給當(dāng)程序員的老公打電話:下班順路買十個(gè)包子囤踩,如果看到賣西瓜的,買一個(gè)晓褪。當(dāng)晚老公手捧一個(gè)包子進(jìn)了家門…老婆怒道:你怎么只買一個(gè)包子堵漱?!老公甚恐涣仿,喃喃道:因?yàn)槲艺婵吹劫u西瓜的了勤庐。”

如果使用策略模式就簡(jiǎn)單了好港,2條信息愉镰,1:買十個(gè)包子。2:買一個(gè)西瓜钧汹,沒(méi)有就算了丈探。雖然是個(gè)笑話,但是順序的就是比判斷的要簡(jiǎn)單拔莱。

總結(jié)

圈復(fù)雜度概念

衛(wèi)語(yǔ)句

策略模式

狀態(tài)模式

匯總:本質(zhì)就是把較深的判斷樹碗降,使用的時(shí)候,就是把判斷樹結(jié)構(gòu)變成順序結(jié)構(gòu)即可塘秦,就是給出每個(gè)葉子的路徑而不需要看起來(lái)是一顆復(fù)雜的樹結(jié)構(gòu)遗锣。

思考

這是阿里JAVA開發(fā)手冊(cè)其中一條明細(xì)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嗤形,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弧圆,老刑警劉巖赋兵,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異搔预,居然都是意外死亡霹期,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門拯田,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)历造,“玉大人,你說(shuō)我怎么就攤上這事船庇】圆” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵鸭轮,是天一觀的道長(zhǎng)臣淤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)窃爷,這世上最難降的妖魔是什么邑蒋? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任姓蜂,我火速辦了婚禮,結(jié)果婚禮上医吊,老公的妹妹穿的比我還像新娘钱慢。我一直安慰自己,他們只是感情好卿堂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布束莫。 她就那樣靜靜地躺著,像睡著了一般御吞。 火紅的嫁衣襯著肌膚如雪麦箍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天陶珠,我揣著相機(jī)與錄音挟裂,去河邊找鬼。 笑死揍诽,一個(gè)胖子當(dāng)著我的面吹牛诀蓉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播暑脆,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渠啤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了添吗?” 一聲冷哼從身側(cè)響起沥曹,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碟联,沒(méi)想到半個(gè)月后妓美,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲤孵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年壶栋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片普监。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贵试,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凯正,到底是詐尸還是另有隱情毙玻,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布漆际,位于F島的核電站淆珊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奸汇。R本人自食惡果不足惜施符,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一往声、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧戳吝,春花似錦浩销、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至陆盘,卻和暖如春普筹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隘马。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工太防, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酸员。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓蜒车,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親幔嗦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酿愧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容