代碼重構與單元測試——“提取方法”重構(三)


 
 

三、重構1對Statement方法中的代碼使用“提取方法”重構

       我們觀察 代碼重構與單元測試(一)文章中的共享充電寶計費代碼中,發現Customer類的Statement ()方法首先需要進行重構。Statement ()方法最大的問題就是這個方法里邊做的事情太多,我們第一步就是對其進行拆分。也就是使用重構中的“Extract Method”(提取方法)原則對該方法進行簡化和拆分。將Statement ()中可以獨立出來的代碼進行提取。經過仔細分析后的,我們發現如下圖中所框選的代碼是一個完整的功能模塊,其中框1中的代碼是進行單價計算的功能,紅框2中的代碼是進行積分計算的功能,我們可以將這兩塊代碼分別進行提取並封裝成一個新的方法。在封裝成新方法時,要給這個新的方法取一個恰當的方法名,見名知意。

   

1.下面我們就首先對方框1中的代碼進行提取方法。在代碼編輯器中選中方框1中的代碼,並單擊鼠標右鍵,在彈出菜單中選擇“快速操作和重構”。如下圖。

 

2.使用鼠標左鍵點擊“快速操作和重構”,代碼編輯器會出現“提取方法”菜單,並會出現我們提取方法的預覽代碼。如下圖。

3. 我們使用鼠標左鍵點擊上圖中的“預覽更改”。如下圖,我們會看到提取方法及代碼更改的地方。如果確認沒有問題,點擊“應用”按鈕。

 

4.我們已經把這段代碼提取到新的方法中。把“NewMethod”方法名改為“GetAmount”。如下圖。

 

5.  我們提取的新方法GetAmount(),具體代碼如下:

  public  decimal GetAmount(Rental item)
        {

            decimal amount = 0M;
            switch (item.Power.PriceCode)
            {

                case 0:
                    amount = item.RentedTime;
                    if (item.RentedTime > 12)
                    {
                        amount = 12;
                    }

                    break;

                case 1:
                    amount = item.RentedTime * 3;
                    if (item.RentedTime > 24)
                    {
                        amount = 24;
                    }

                    break;

                case 2:
                    amount = item.RentedTime * 5;
                    if (item.RentedTime > 50)
                    {

                        amount = 50;
                    }
                    break;
                default:
                    break;

            }
            return amount;
        }

 

      6. 重復上面第1步到第4步的操作,我們對紅框2中的代碼進行提取。在提取時,將依賴於Statement()方法中的數據作為新方法的參數即可。封裝后的方法如下,在Statement()方法中相應的地方調用下方的計算積分的方法即可。下方就是我們封裝的計算積分的方法。代碼如下:

 public  int GetFrequentRenterPoints(int frequentRenterPoints, Rental item, decimal amount)
        {
            //計算積分
            if (item.Power.PriceCode == PowerBank.HighTraffic && item.RentedTime > 4)

            {

                frequentRenterPoints += (int)Math.Ceiling(amount * 1.5M);
            }

            else
                frequentRenterPoints += (int)Math.Ceiling(amount);
            return frequentRenterPoints;
        }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM