重構(Refactoring)就是通過調整程式代碼改善軟體的質量、性能,使其程式的設計模式和架構更趨合理,提高軟體的擴展性和維護性,
遺留系統,程式員們為了快速完成需求和上線而寫出了最基本的代碼,而在功能的不斷擴充程序中,以打補丁的方式對代碼進行擴充,中間還會面臨著開發人員的變更和離職,逐漸的,代碼就會越來越臃腫,漸漸的變得難以維護,
程式員,特別是做遺留系統維護作業的程式員,清理代碼是他們的日常作業之一,這是基本作業,是必須要做的,首要的任務是為此系統撰寫單元測驗,搭建重構的測驗保護網,并能夠形成可讀與可作業的測驗用例檔案,在發現遺留系統中代碼的壞味道時,及時地對代碼進行重構,并保證重構的小步前進,小規模的、獨立的、穩妥的對代碼進行結構上的調整,每次調整完后都要進行測驗,確保你沒有改變代碼的行為特征——功能和以前一樣,只是代碼上看著不同,重構模式和現代化的 IDE里的重構工具使重構變得容易、安全和代價低廉,
單元測驗是指,對軟體中的最小可測驗單元在與程式其他部分相隔離的情況下進行檢查和驗證的作業,這里的最小可測驗單元通常是指函式或者類,單元測驗都是以自動化的方式執行,
單元測驗的用例是一個“輸入資料”和“預計輸出”的集合,需要針對確定的輸入,根據邏輯功能推算出預期正確的輸出,并且以執行被測驗代碼的方式進行驗證,即“在明確了代碼需要實作的邏輯功能的基礎上,什么輸入,應該產生什么輸出”,
上面介紹了什么是重構與單元測驗,接下來我們通過一個實際示例來學習一一下重構與單元測驗,先來聊一下該示例的使用場景,就是我們現在街上最常見共享場景之一——共享充電寶,一個客戶去共享充電寶機柜上進行消費,下方的程式是給店主用的,來根據用戶在不同地段所借充電寶和數量來計算該用戶消費的金額和積分,需求很簡單而且也不難理解,
一、創建充電寶計費專案
1.我們先來創建這個共享充電寶專案,啟動Visual Studio 2019,在啟動頁面點擊右下方的“創建新專案”按鈕,如下圖,

2.在“創建新專案”界面中,選擇”c#”、“Windows”、“控制臺”,此時會出現兩個專案模板,一個是.net Core的,一個是.Net Framework的,我選擇了.NET Core的控制臺應用程式,如下圖, 
3.在“配置新專案”界面中,填寫“專案名稱”為LeasePowerBank,在“位置”中輸入你的目錄名稱,然后點擊“下一步”按鈕,如下圖, 
4.在“其他資訊”界面中選擇“目標框架”下拉框,如下圖1,在下拉框中選擇“NET50”,然后點擊“創建”按鈕,如下圖2.

圖1

圖2.
5. 到此一個充電寶計費專案已經創建成功了,接下來我們要添加相應的代碼,首先我們給出了充電寶類的實作,在PowerBank類中有充電寶的地段種類(靜態常量):高人流地段(每天人流x>10000)、中人流地段(3000<x<10000)、低人流地段(x<3000),然后有兩個成員變數/常量是PriceCode(價格代碼)、Title(充電寶名稱),最后就是我們的構造方法了,該PowerBank類比較簡單,在此就不做過多的贅述了,代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LeasePowerBank { /// <summary> /// 充電寶類 /// </summary> public class PowerBank { //地段人流量種類 static int LowTraffic = 0;//低人流量地段 static int MiddleTraffic = 1;//中人流量地段 static int HighTraffic = 2; //高人流量地段 int PriceCode; //價格代碼 string Title;//充電寶名稱 public PowerBank(string title,int priceCode) { PriceCode = priceCode; Title = title; } } }
其次,在定義了PowerBank類之后,接下來就是租賃類Rental,這個Rental類的職責就是負責統計某個充電寶租賃的時間,下方就是這個租賃類,該類也是比較簡單的,其中有兩個欄位,一個是租用了哪個地段的充電寶,另一個就是租賃的時間了,代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LeasePowerBank { /// <summary> /// 租賃類 /// </summary> public class Rental { PowerBank Power ; //充電寶名稱 int RentedTime;//租賃時間 public Rental(PowerBank powerbk,int rentedTime) { Power = powerbk; RentedTime = rentedTime; } } }
第三,我們來設計一個消費者類,也就是Customer類,在Customer類中有消費者的名字Name和一個陣列,該陣列中存盤的就是租賃充電寶的集合,其中的Statement()方法就是結算該用戶的消費金額與積分的方法,并將結果進行列印,在此我們需要了解的需求是每種地段的充電寶價格的計價方式以及積分的計算規則,
充電寶價格計算規則:
低人流量地段的充電寶:1小時之內含1小時,每小時收費1元,每天最多收取12元
中人流量地段的充電寶:每小時間 3元,每天最高收取24元
高人流量地段的充電寶:每小時收取5元,每天最高收取50元
積分計算規則:
每消費一元,積分加1,高人流量地段的充電寶,租賃超過4小時,每一元積1.5積分
Statement()方法中所做的事情就是根據上面的計算規則,根據用戶所租賃的充電寶的不同來進行金額的計算和積分的計算的,Customer類的具體代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LeasePowerBank { /// <summary> /// 客戶類 /// </summary> public class Customer { string Name;//用戶名稱 public List<Rental> listRentals=new List<Rental>();//用戶租賃的充電寶 public Customer(string name) { Name = name; } public void AddRental(Rental rental) { listRentals.Add(rental); } /*充電寶價格計算規則: 低人流量地段的充電寶—1小時之內含1小時,每小時收費1元,每天最多收取12元 中人流量地段的充電寶--每小時間 3元,每天最高收取24元 高人流量地段的充電寶—每小時收取5元,每天最高收取50元 積分計算規則: 每消費一元,積分加1,高人流量地段的充電寶,租賃超過4小時,每一元積1.5積分 */ public string Statement() { decimal totalAmount = 0M; int frequentRenterPoints = 0; string result = $"{Name} 的租賃賬單:\n"; foreach (var item in listRentals) { 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; } //總價計算 totalAmount += amount; } //計算積分 if (item.Power.PriceCode == PowerBank.HighTraffic && item.RentedTime > 4) { frequentRenterPoints += (int)Math.Ceiling(amount * 1.5M); } else frequentRenterPoints += (int)Math.Ceiling(amount); result += $"總金額為:{totalAmount}\n"; result += $"你本次獲得了:{frequentRenterPoints}積分 "; return result; } } }
6.如果你看代碼不太直觀的話,下面我使用了Visual Studio 2019中的代碼圖來說明上述三個類中的依賴關系,具體如下所示:

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/288821.html
標籤:.NET技术
上一篇:C#中時間相關知識點小結
