[重構技巧]-Replace Parameter with Method
往往在開發專案的過程中,函式內過長的參數會增加閱讀者的理解程度。加上如果是根據前人訂定的介面而實做的函式,在現實狀況下想要修改介面常常會造成內部團隊的一番革命,因此本文介紹如何以函式取代過長的參數,目的在於讓函式內部對參數的使用替換為對新函式的呼叫。
首先以一家新開幕飲料店,計算飲料訂單價格為範例,當客戶訂購外送飲料超過10杯時,採取八折優惠,不足10杯以開幕價九折為優惠。
以下為原始的程式碼
public static double getPrice()
{
//飲料總金額
int totalPrice = _quantity * _itemPrice;
//優惠方式
int discountType;
if (_quantity > 10) discountType = 1;
else discountType = 2;
double finalPrice = discountedPrice(totalPrice, discountType);
return finalPrice;
}
private static double discountedPrice(int totalPrice, int discountLevel)
{
//八折優惠
if (discountLevel == 1) return totalPrice * 0.8;
else return totalPrice * 0.9;
}
思考以上程式碼,我們可以將「discountType」的程式碼擷取成為獨立的「getDiscountType」函式
public static double getPrice()
{
int totalPrice = _quantity * _itemPrice;
int discountType = getDiscountType();
double finalPrice = discountedPrice(totalPrice, discountType);
return finalPrice;
}
//將優惠方式抽出為一個獨立的函式
private static int getDiscountType()
{
if (_quantity > 10) return 1;
else return 2;
}
接者將「discountedPrice」函式對「discountType」參數的引用替換
private static double discountedPrice(int totalPrice, int discountType)
{
if (getDiscountType() == 1) return totalPrice * 0.8;
else return totalPrice * 0.9;
}
此時觀察程式碼,我們可以將「discountType」參數移除並將計算總金額抽出為「getTotalPrice」函式,此時重新整理程式碼為
public static double getPrice()
{
return discountedPrice();
}
private static int getDiscountType()
{
if (_quantity > 10) return 1;
else return 2;
}
private static double discountedPrice(int totalPrice)
{
if (getDiscountType() == 1) return getTotalPrice() * 0.8;
else return getTotalPrice() * 0.9;
}
//計算飲料總金額
private static double getTotalPrice()
{
return _quantity* _itemPrice;
}
此時便將將函式中多餘的參數進行縮短的功效,個人寫作習慣為盡可能一個函式最多只有兩個參數就好。
以上範例如需詳細說明可參考「Refactoring Improving The Design of Existing Code」一書。
小小工程師