l

2016年3月2日 星期三

用Replace Temp With Query移除Long Method怪味道

Feb. 14 22:15~22:42

螢幕截圖 2016-02-14 22.41.41

▲Google搜尋圖片結果


Long Method怪味道是一個很常見而且很容易找到的怪味道,關於它的說明請參考〈談談壞味道(2):Long Method & Large Class〉。今天介紹如何用Replace Temp With Query重構移除這個怪味道。

▼以下範例節錄自《Refactoring》。你有一個Product類別用來代表顧客購買的產品單價與數量,它的getPrice()函數傳回該產品折扣後的總價。如果金額大於1000打95折,小於1000打98折。你在getPrice()函數中使用basePrice暫時變數來代表打折前的金額。

螢幕截圖 2016-02-14 22.25.13

***

▼套用Replace Temp With Query,新增一個basePrice()函數用以取代原本的basePrice暫時變數。

螢幕截圖 2016-02-14 22.30.47

***

把暫時變數用查詢函數取代有一個好處,就是同一類別其他函數也可以呼叫到這個查詢函數,因此有機會可以減少其它函數的長度。這一招在將一個大函數拆解成若干個小函數的時候特別有用,否則抽離出去的函數將無法存取到暫時變數,除非你將這個暫時變數透過參數傳遞給被抽離出去的函數。

***

友藏內心獨白:數大便是美,函數大問題多。

2 則留言:

  1. 想請問,最後 getPrice() 的使用下 basePrice() 會被呼叫兩次,這種狀況算是 OK 的嗎? 還是另有更好的解呢?

    回覆刪除
    回覆
    1. 你指的是效能問題嗎?通常小method有機會被inline, 呼叫成本往往沒想像中高。而且refactoring之後會更模組化,往往針對效能瓶頸可以比較針對性的修改。當然,也的確存在模組化後效能下降過多的案例(而且無法從演算法層面改善),那時就要另想出路了。

      刪除