欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2012年04月09日 22:36:55   作者:  
條件邏輯有可能十分復(fù)雜,因此本章提供一些重構(gòu)的手法,專門用來簡化它們
思維導(dǎo)圖
點擊下圖,查看大圖。


 介紹
 
 條件邏輯有可能十分復(fù)雜,因此本章提供一些重構(gòu)的手法,專門用來簡化它們。
 
全文簡述(你可直接跳過下面的內(nèi)容)
  核心重構(gòu):Decompose Conditional——分離”轉(zhuǎn)轍邏輯“(switching logic)和”操作細(xì)節(jié)“(details)分離。
  多處測試有相同結(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
 
狀況:你有一個復(fù)雜的條件(if-else if-else)語句,那么從if、else if、else三個段落中分別提煉出函數(shù)。

 

 

 

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

 

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

 

 

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

 
 Remove Control Flag
 
狀況:在一系列布爾表達式中,某個變量帶有“控制標(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)該單獨檢查該條件,并在該條件為真時,立刻從函數(shù)中返回?!@樣的單獨檢查常常被稱為”衛(wèi)語句“
Replace Nested Conditional with Guard Clauses精髓:給某一分支以特別重視。

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

此代碼的壞味道:

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

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

  3、它違反了單一權(quán)責(zé)原則,因為它有好幾個修改它的理由。

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

 

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

 

 

運行結(jié)果:

運行結(jié)果:

 
采點:

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

    Godaddy空間Zend Optimizer升級方法

    雖然購買了godaddy的空間,期間也遇到很多的問題,在慢慢的額摸索中,也有的一些解決的方法。
    2010-05-05
  • php設(shè)計模式 Visitor 訪問者模式

    php設(shè)計模式 Visitor 訪問者模式

    表示一個作用于某對象結(jié)構(gòu)中的各元素的操作,可以在不改變各元素的類的前提下定義作用于這些元素的新操作
    2011-06-06
  • PHP排序算法之快速排序(Quick Sort)及其優(yōu)化算法詳解

    PHP排序算法之快速排序(Quick Sort)及其優(yōu)化算法詳解

    這篇文章主要介紹了PHP排序算法之快速排序(Quick Sort)及其優(yōu)化算法,結(jié)合實例形式分析了php快速排序的原理、實現(xiàn)方法,并分析了各種優(yōu)化技巧與操作注意事項,需要的朋友可以參考下
    2018-04-04
  • php抽獎小程序的實現(xiàn)代碼

    php抽獎小程序的實現(xiàn)代碼

    本篇文章是對php實現(xiàn)抽獎的程序代碼進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • php實現(xiàn)圖片上傳并利用ImageMagick生成縮略圖

    php實現(xiàn)圖片上傳并利用ImageMagick生成縮略圖

    這篇文章主要為大家詳細(xì)介紹了php實現(xiàn)圖片上傳并利用ImageMagick生成縮略圖的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • php反序列化之字符串逃逸詳解

    php反序列化之字符串逃逸詳解

    這篇文章主要為大家詳細(xì)介紹了php反序列化之字符串逃逸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • PHP警告Cannot use a scalar value as an array的解決方法

    PHP警告Cannot use a scalar value as an array的解決方法

    PHP警告Cannot use a scalar value as an array的解決方法,需要的朋友可以參考下。
    2012-01-01
  • PHP中iconv函數(shù)轉(zhuǎn)碼時截斷字符問題的解決方法

    PHP中iconv函數(shù)轉(zhuǎn)碼時截斷字符問題的解決方法

    這篇文章主要介紹了PHP中iconv函數(shù)轉(zhuǎn)碼時截斷字符問題的解決方法,本文給出的解決方法是使用mb_convert_encoding代替iconv,需要的朋友可以參考下
    2015-01-01
  • 最新評論