[重構技巧]-Replace Temp with Query

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

小小工程師