Summary: java
從if、then、else三個段落中分別提煉出獨立函數 程序員
Motivation: 函數
程序之中,複雜的邏輯是最常致使複雜度上升的地點之一。你必須編寫代碼來檢查不一樣的條件分支、根據不一樣的分支作不一樣的事,而後,你很快就會獲得一個至關長的函數。大型函數自身就會使代碼的可讀性降低,而條件邏輯則會使代碼更難閱讀。在帶有複雜條件邏輯的函數中,代碼(包括檢查條件分支的代碼和真正實現功能的代碼)會告訴你發生的事,但經常讓你弄不清楚爲何會發生這樣的事,這就說明代碼的可讀性的確大大下降了。 測試
和任何大塊頭代碼同樣,你能夠將它分解爲多個獨立函數,根據沒個小塊代碼的用途,爲分解而獲得的新函數命名,並將原函數中對應的代碼改成調用新建函數,從而更清楚地表達本身的意圖。對於條件邏輯,將每一個分支條件分解成新行數還能夠給你帶來更多好處:能夠突出條件邏輯,更清楚地代表每一個分支的做用,而且突出每一個分支的緣由。 code
Mechanics: it
1.將if段落提煉出來,構成一個獨立函數。 io
2.將then段落和else段落都提煉出來,各自構成一個獨立函數 編譯
若是發現嵌套的條件邏輯,能夠先觀察是否可使用Replace Nested Conditional with Guard Clauses。若是不行,纔開始分解其中的每一個條件 class
範例假設要計算購買牟陽商品的總價(總價=數量x單價),而這個商品在冬季和夏季的單價是不一樣的 重構
if (date.before(SUMMER_START)||date.after(SUMMER_END)) charge = quantity * _winterRate + _winterServiceCharge; else charge = quantity * _summerRate
咱們把每一個分支的判斷條件都提煉到一個獨立函數中,以下所示:
if(notSummber(date)) charge = winterCharge(quantity); else charge = summerCharge(quantity); private boolean notSummer(Date date){ return date.before(SUMMER_START)|| date.after(SUMMER_END); } private double summerCharge(int quantity){ return quantity * _summerRate; } private double winterCharge(int quantity){ return quantity * _winterRate + _winterServiceCharge; }
經過這段代碼能夠看出整個重構帶來的清晰性。實際工做中,咱們應該逐步進行每一次提煉,並在每次提煉以後編譯並測試。
像這樣的狀況下許多程序員都不會去提煉分支條件。由於這些分支條件每每很是短,看上去彷佛並無提煉的必要。可是,儘管這些條件每每很短,在代碼意圖和代碼自身之間每每存在不小的差距。哪怕在上面這樣一個小小例子中,notSummer(date)這個語句也可以比本來的代碼更好地表達本身的用途。對於原來的代碼,咱們必須看着它,想想,才能說出其做用。固然,在這個簡單的例子中,這並不困難。不過即便如此,提煉出來的額函數可讀性也更高一些--它看上去就像一段註釋那樣清楚而明白。