五、重構2:對GetFrequentRenterPoints方法的引數進行重構
重構最重要的思想就是普通程式也能寫出優秀的程式。重構一個專案的巨大工作量就是修改變數名、提取方法、抽取介面、修改方法引數等簡單的工作。作為一個普通的程式就可以通過這些簡單且容易完成的工作目標來提升自己的編碼能力,加深自己對專案的認知,從而為最高層次的重構打下基礎。在這個過程中發現Bug、修改Bug,這不是重構。優化不是重構。強化異常捕捉、增加預防性程式碼不是重構。讓程式碼更容易測試不是重構——儘管重構能達到相同的效果。這些所有的事都是有益的。但這些都不是重構。
我們觀察 程式碼重構與單元測試(一)文章中的共享充電寶計費程式碼中,發現Customer類的GetFrequentRenterPoints()方法也需要進行重構,GetFrequentRenterPoints方法有三個引數,這三個引數不是所有引數都是必須的,本文使用重構中的“刪除引數”,對這個方法的引數進行重構。
1.在Visual Studio 2019程式碼編輯器中開啟Customer.cs檔案,找到GetFrequentRenterPoints方法並選中,讓其突出顯示。如下圖。
2. 接下來,執行以下操作之一:
在Visual Studio 2019的選單欄上選擇“編輯 > 重構 > 刪除引數” 。
在Visual Studio 2019的選單欄上選擇“編輯 > 重構 > 重新排列引數” 。
3. 在彈出的“更改簽名”對話方塊中,可以使用右側的按鈕更改方法的引數數量與位置。然後點選“確定”按鈕。如下圖。
4.在進行了方法引數重構之後,GetFrequentRenterPoints方法程式碼如下:
public int GetFrequentRenterPoints(Rental item, decimal amount)
{
int frequentRenterPoints = 0;
//計算積分
if (item.Power.PriceCode == PowerBank.HighTraffic && item.RentedTime > 4)
{
frequentRenterPoints += (int)Math.Ceiling(amount * 1.5M);
}
else
frequentRenterPoints += (int)Math.Ceiling(amount);
return frequentRenterPoints;
}
5. 在Visual Studio 2019中開啟測試專案LeasePowerBankTest中的UnitTest1.cs測試類檔案,修改測試類中的測試方法ValidGetFrequentRenterPointsTest,程式碼如下:
[TestMethod]
public void ValidGetFrequentRenterPointsTest()
{
int expected = 5;
//建立使用者
var customer = new Customer("張三");
//建立充電寶
PowerBank regularPowerBank = new PowerBank("低-充電寶", PowerBank.LowTraffic);
//建立租賃資料
var rental1 = new Rental(regularPowerBank, 5);
// Act
int actual = customer.GetFrequentRenterPoints(rental1,5);
// Assert
Assert.AreEqual(expected, actual, 0.001, "積分計算錯誤");
}
6. 在Visual Studio 2019的選單欄上找到“測試-->執行所有測試”選單項。或者在“測試資源管理器中”選擇 “在檢視中執行所有測試”按鈕, 以執行測試。測試全部通過。如下圖。
7.在經過上面的重構之後,GetFrequentRenterPoints方法的引數減少到了兩個。現在再仔細品品這個方法的引數,發現方法中的amount引數也不是必須的,也是可以減少的。繼續進行重構。
8.在Visual Studio 2019程式碼編輯器中開啟Customer.cs檔案,選中GetFrequentRenterPoints方法,讓其突出顯示,然後單擊滑鼠右鍵,在彈出的快捷選單中選擇“快速操作和重構”,會顯示如圖中方框中的選單,選擇“更改簽名”。如下圖。
9. 在彈出的“更改簽名”對話方塊中,可以使用右側的按鈕更改方法中的引數數量與位置。然後點選“確定”按鈕。如下圖。
10.經過上面的重構步驟之後,GetFrequentRenterPoints方法的程式碼如下:
public int GetFrequentRenterPoints(Rental item)
{
int frequentRenterPoints = 0;
decimal amount = GetAmount(item);
//計算積分
if (item.Power.PriceCode == PowerBank.HighTraffic && item.RentedTime > 4)
{
frequentRenterPoints += (int)Math.Ceiling(amount * 1.5M);
}
else
frequentRenterPoints += (int)Math.Ceiling(amount);
return frequentRenterPoints;
}
11.在Visual Studio 2019中開啟測試專案LeasePowerBankTest中的UnitTest1.cs測試類檔案,修改測試類中的測試方法ValidGetFrequentRenterPointsTest,程式碼如下:
[TestMethod]
public void ValidGetFrequentRenterPointsTest()
{
int expected = 5;
//建立使用者
var customer = new Customer("張三");
//建立充電寶
PowerBank regularPowerBank = new PowerBank("低-充電寶", PowerBank.LowTraffic);
//建立租賃資料
var rental1 = new Rental(regularPowerBank, 5);
// Act
int actual = customer.GetFrequentRenterPoints(rental1);
// Assert
Assert.AreEqual(expected, actual, 0.001, "積分計算錯誤");
}
12. 在Visual Studio 2019的選單欄上找到“測試-->執行所有測試”選單項。或者在“測試資源管理器中”選擇 “在檢視中執行所有測試”按鈕, 以執行測試。測試全部通過。如下圖。