三、重構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; }