[重構技巧]-Replace Parameter with Method

[重構技巧]-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」一書。

小小工程師