[重構技巧]-Replace Temp with Query
暫時變數一直是寫程式過程的好夥伴,但隨著長時間的開發,他們會使你寫出更長的程式,仔細想想,此時如果可以把暫時變數轉換成一個查詢方法(Query method),便可以讓你的程式碼更加的附有彈性及閱讀性。
根據「Refactoring Improving The Design of Existing Code」一書定義:「將運算式提煉到一個獨立函式中,將這個暫時變數的所有被引用點轉換為對新函式的呼叫」。
其實使用此方法相當的普遍,說不定在你日常生活的Coding中已經在使用,以下以之前所舉的飲料店為範例進行說明:
首先以一家新開幕飲料店,計算飲料訂單價格為範例,當客戶訂購外送飲料總金額超過1000元時,採取八折優惠,不足以開幕價九折為優惠。
以下為原始的程式碼
public static double getPrice()
{
//飲料總金額
int totalPrice = _quantity * _itemPrice;
//優惠方式
double discountType;
if (totalPrice > 1000) discountType = 0.8;
else discountType = 0.9;
return totalPrice * discountType;
}
首先觀察到,totalPrice及discountType為暫時變數,由於此兩個暫時變數只被賦予值一次,因為可以將之宣告為sealed或readonly,
接著在在將暫時變數的運算式抽出,此時程式碼為
private sealed int totalPrice;
private sealed double discountType;
double getPrice()
{
if (calTotalPrice() > 1000) discountType = 0.8;
else discountType = 0.9;
return calTotalPrice() * discountType;
}
private int calTotalPrice()
{
return _quantity * _itemPrice;
}
相同的方式,此時我們再次處理discountType暫時變數,最終程式碼變成
private sealed int totalPrice;
private sealed double discountType;
double getPrice()
{
return calTotalPrice() * calDiscountType();
}
private int calTotalPrice()
{
return _quantity * _itemPrice;
}
private double calDiscountType()
{
if (calTotalPrice() > 1000) return 0.8;
else return 0.9;
}
此時的程式碼便相當好理解,本文同之前[重構技巧]-Replace Parameter with Method 有異曲同工之妙!
以上範例如需詳細說明可參考「Refactoring Improving The Design of Existing Code」一書。
小小工程師