天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

PHP 雜談《重構(gòu)-改善既有代碼的設(shè)計(jì)》之四 簡化條件表達(dá)式

思維導(dǎo)圖
點(diǎn)擊下圖,查看大圖。


 介紹  條件邏輯有可能十分復(fù)雜,因此本章提供一些重構(gòu)的手法,專門用來簡化它們。 全文簡述(你可直接跳過下面的內(nèi)容)  核心重構(gòu):Decompose Conditional――分離”轉(zhuǎn)轍邏輯“(switching logic)和”操作細(xì)節(jié)“(details)分離?! 《嗵帨y試有相同結(jié)果:Consolidate Conditional Expresssion  條件代碼中去掉重復(fù)成分:Consolidate Duplicate  標(biāo)識特殊情況:Replace Nested Conditional with Guard Clauses  去除討厭的控制標(biāo)記:Remove Control Flag   專業(yè)術(shù)語 decompose:分解,分離consolidate:合并eligible:合適的,合格的fragment:碎片,片段nest:嵌套guard:保衛(wèi)clause:從句polymorphism:多態(tài)assertion:斷言unchecked exception:不可控異常  Decompose Conditional 狀況:你有一個(gè)復(fù)雜的條件(if-else if-else)語句,那么從if、else if、else三個(gè)段落中分別提煉出函數(shù)。

 

 

 

 Consolidate Conditional Expression 狀況:你有一些條件測試,都得到相同的結(jié)果,那么將這些測試合并為一個(gè)條件式,并將這個(gè)條件提煉稱為一個(gè)獨(dú)立的函數(shù)。動(dòng)機(jī): 1、合并后的條件代碼會(huì)告訴你“實(shí)際上只有一次條件檢查,只不過有數(shù)個(gè)并列條件需要檢查而已“,――使檢查的用意更清晰?!  ?nbsp; 2、為Extract Method做好準(zhǔn)備。――將檢查條件提煉成一個(gè)獨(dú)立函數(shù),對于理清代碼意義非常有用。它把描述“做什么”的語句換成了“為什么這樣做”。

 

條件語句的“合并理由”也同時(shí)指出了“不要合并”的理由:如果你認(rèn)為你的這些檢查的確彼此獨(dú)立,的確不應(yīng)該被視為同一次檢查,那么就不要使用本項(xiàng)重構(gòu)。因?yàn)樵谶@種情況下,你的代碼已經(jīng)清楚表達(dá)出自己的意義。

 

 

 Consolidate Duplicate Conditional Fragments 狀況:在條件式的每個(gè)分支上有著相同的一段代碼,那么將這段重復(fù)代碼搬移到條件之外。 

  Remove Control Flag 狀況:在一系列布爾表達(dá)式中,某個(gè)變量帶有“控制標(biāo)記”的作用,那么以break語句或return語句取代控制標(biāo)記。 

  

  Replace Nested Conditional with Guard Clauses 狀況:函數(shù)中的條件邏輯使人很難看清正常的執(zhí)行路徑,那么使用衛(wèi)語句(Guard Clauses)表現(xiàn)所有特殊情況。


條件式的兩種形式:  1、所有分支都屬于正常行為:使用[if ... else..]  2、條件式極其罕見:應(yīng)該單獨(dú)檢查該條件,并在該條件為真時(shí),立刻從函數(shù)中返回。――這樣的單獨(dú)檢查常常被稱為”衛(wèi)語句“Replace Nested Conditional with Guard Clauses精髓:給某一分支以特別重視。

  Replace Conditional with Polymorphism 狀況:你手上有個(gè)表達(dá)式,它根據(jù)對象型別的不同而選擇不同的行為,那么將這個(gè)條件式的每個(gè)分支放進(jìn)一個(gè)subclass內(nèi)的覆寫函數(shù)中,然后將原始函數(shù)聲明為抽象函數(shù)。 

此代碼的壞味道:

  1、它太長,當(dāng)視頻有新類型的時(shí)候,它會(huì)變得更長。

  2、它明顯做了不止一件事。

  3、它違反了單一權(quán)責(zé)原則,因?yàn)樗泻脦讉€(gè)修改它的理由。

  4、它違反了開放閉合原則,因?yàn)槊慨?dāng)添加新類型時(shí),必須修改它。不過最麻煩的可能是到處皆有類似結(jié)構(gòu)(_get類型名Rank())的函數(shù)。

 

 Introduce Assertion 狀況:某一段代碼需要對程序狀態(tài)(state)做出某種假設(shè),那么以斷言(assertion)明確表現(xiàn)這種假設(shè)。 

 

 

運(yùn)行結(jié)果:

運(yùn)行結(jié)果:

  采點(diǎn):

  1、常常會(huì)有這樣的代碼,只有當(dāng)某個(gè)條件為真時(shí),該段代碼才能正常運(yùn)行。――實(shí)際上程序最后成品往往將assertion統(tǒng)統(tǒng)刪除?! ?、這樣的假設(shè)通常并沒有在代碼中明確表現(xiàn)出來,你必須閱讀整個(gè)算法才能看出。――有時(shí)候程序員會(huì)以注釋寫出這樣的假設(shè),而assetion是一種更好的技術(shù)?! ?、assertion是一個(gè)條件式,應(yīng)該總是為真。如果失敗,表示程序員犯了錯(cuò)誤?! ?、assertion可以作為交流與調(diào)試的輔助。――交流:可以幫助程序員閱讀理解代碼所做的假設(shè)。調(diào)試:幫助程序員找到bug,可以在距離最近的地方抓住bug。  5、assertion并不改變程序的任何行為。  6、assertion價(jià)值:幫助程序員理解代碼正確運(yùn)行的必要條件。  7、建議最好把a(bǔ)ssertion的條件式使用Extract Method,為了將若干地方的重復(fù)碼提煉到同一個(gè)函數(shù)中,也許只是為了更清楚說明條件式的用途。  總結(jié)        這一章我比較喜歡“Replace Nested Conditional with Guard Clauses “這個(gè)方式,我在平時(shí)的代碼中也經(jīng)常這樣用,還有人給這種方式取名叫”衛(wèi)從句“。      還有一個(gè)就是我經(jīng)常在php開發(fā)中用的調(diào)試是var_dump()或print_r(),我也第一次發(fā)現(xiàn)php中還有assert這種方式,不錯(cuò)!         在學(xué)習(xí)和實(shí)踐的過程中,我也學(xué)到了很多不錯(cuò)的方式。但是我覺得在團(tuán)隊(duì)開發(fā)中,有的時(shí)候還是”大局為重“,按照團(tuán)隊(duì)的習(xí)慣方式去編碼,或者你可以跟團(tuán)隊(duì)溝通,得到大家的認(rèn)可之后,在使用這里面的方法,這樣大家彼此調(diào)試和閱讀對方代碼的時(shí)候比較方便。

php技術(shù)PHP 雜談《重構(gòu)-改善既有代碼的設(shè)計(jì)》之四 簡化條件表達(dá)式,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产伦精品一区二区三区精品 | 久久成人伊人欧洲精品AV | 9277在线观看免费高清完整版 | 免费毛片在线播放 | 日韩精品 中文字幕 有码 | 99国产精品久久人妻无码 | 99视频精品全部 国产 | 国产成人免费a在线资源 | 欧美精品一区二区三区视频 | 99久久就热视频精品草 | 欧美人与动牲交A精品 | 欧美日韩中文国产一区 | 恋夜直播午夜秀场最新 | 武侠艳妇屈辱的张开双腿 | 亚洲精品中文字幕无码A片蜜桃 | 饥渴难耐的浪荡艳妇在线观看 | 日日撸影院在线 | 亚洲中文有码字幕日本 | 国产亚洲精品97在线视频一 | 国产AV精品无码免费看 | 久久久久久久免费 | jizz黑丝| 国产亚洲精品久久久久久国 | 777午夜精品久久AV蜜臀 | 久久99精品国产自在自线 | 久久视频这里只精品99热在线观看 | 首页 国产 亚洲 中文字幕 | 一本之道高清在线观看免费 | 国内精品视频在线播放一区 | 第七色男人天堂 | 超嫩校花被灌醉在线观看 | 精品久久久久久久久免费影院 | 涩涩免费网站 | 国产亚洲精品看片在线观看 | 国产精品一区二区在线观看 | 久久本道久久综合伊人 | 成人性生交大片免费看中文 | 亚洲视频无码中字在线 | 精品高清国产a毛片 | 亚洲伊人情人综合网站 | 小柔的性放荡羞辱日记动漫 |