思維導圖
點擊下圖,查看大圖。
Consolidate Conditional Expression 狀況:你有一些條件測試,都得到相同的結果,那麼將這些測試合並為一個條件式,並將這個條件提煉稱為一個獨立的函數。 動機: 1、合並後的條件代碼會告訴你“實際上只有一次條件檢查,只不過有數個並列條件需要檢查而已“,——使檢查的用意更清晰。 2、為Extract Method做好准備。——將檢查條件提煉成一個獨立函數,對於理清代碼意義非常有用。它把描述“做什麼”的語句換成了“為什麼這樣做”。
條件語句的“合並理由”也同時指出了“不要合並”的理由:如果你認為你的這些檢查的確彼此獨立,的確不應該被視為同一次檢查,那麼就不要使用本項重構。因為在這種情況下,你的代碼已經清楚表達出自己的意義。
Consolidate Duplicate Conditional Fragments 狀況:在條件式的每個分支上有著相同的一段代碼,那麼將這段重復代碼搬移到條件之外。 Remove Control Flag 狀況:在一系列布爾表達式中,某個變量帶有“控制標記”的作用,那麼以break語句或return語句取代控制標記。 Replace Nested Conditional with Guard Clauses 狀況:函數中的條件邏輯使人很難看清正常的執行路徑,那麼使用衛語句(Guard Clauses)表現所有特殊情況。
此代碼的壞味道:
1、它太長,當視頻有新類型的時候,它會變得更長。
2、它明顯做了不止一件事。
3、它違反了單一權責原則,因為它有好幾個修改它的理由。
4、它違反了開放閉合原則,因為每當添加新類型時,必須修改它。不過最麻煩的可能是到處皆有類似結構(_get類型名Rank())的函數。
Introduce Assertion 狀況:某一段代碼需要對程序狀態(state)做出某種假設,那麼以斷言(assertion)明確表現這種假設。
運行結果:
運行結果:
采點: 1、常常會有這樣的代碼,只有當某個條件為真時,該段代碼才能正常運行。——實際上程序最後成品往往將assertion統統刪除。 2、這樣的假設通常並沒有在代碼中明確表現出來,你必須閱讀整個算法才能看出。——有時候程序員會以注釋寫出這樣的假設,而assetion是一種更好的技術。 3、assertion是一個條件式,應該總是為真。如果失敗,表示程序員犯了錯誤。 4、assertion可以作為交流與調試的輔助。——交流:可以幫助程序員閱讀理解代碼所做的假設。調試:幫助程序員找到bug,可以在距離最近的地方抓住bug。 5、assertion並不改變程序的任何行為。 6、assertion價值:幫助程序員理解代碼正確運行的必要條件。 7、建議最好把assertion的條件式使用Extract Method,為了將若干地方的重復碼提煉到同一個函數中,也許只是為了更清楚說明條件式的用途。 總結 這一章我比較喜歡“Replace Nested Conditional with Guard Clauses “這個方式,我在平時的代碼中也經常這樣用,還有人給這種方式取名叫”衛從句“。 還有一個就是我經常在php開發中用的調試是var_dump()或print_r(),我也第一次發現php中還有assert這種方式,不錯! 在學習和實踐的過程中,我也學到了很多不錯的方式。但是我覺得在團隊開發中,有的時候還是”大局為重“,按照團隊的習慣方式去編碼,或者你可以跟團隊溝通,得到大家的認可之後,在使用這裡面的方法,這樣大家彼此調試和閱讀對方代碼的時候比較方便。