重構學習2-消除過長參數
查看本人文章索引請通過http://www.rzrgm.cn/seesea125/archive/2012/04/17/2453256.html
動機:一個方法里的參數過長,過長的參數列導致方法很難使用,因為這些參數太長難以理解,而且調用者和被調用者都必須記住這些參數的用途,另一個原因是一旦需要更多數據,就可能要增加參數或者重載這個方法。所以消除過長參數往往能提高代碼的可讀性。
方法:一、如果參數的值是通過調用某個函數的結果得來的,則去掉該參數,讓接受該參數的函數直接調用該函數。
二、如果這些參數是來自同一實體對象,則傳遞這個實體對象過去即可,如果這個實體不存在,那就先創建一個。
注意:如果被調用函數使用了 [來自另一個對象的很多項數據」,這可能意味該函數實際上應該被定義在「那些數據所屬的對象」中。這時候可以考慮移動方法。
示例:
比如公司OA,有一個頁面顯示某天某個人打卡記錄是否正常,顯示的格式如下:
| 當前日期 | 打卡人 | 上班打卡時間 | 下班打卡時間 | 是否正常上下班 | 描述 |
| 2012-04-17 | ZXZ | 09:10 | 18:00 | 非正常 | 遲到10分鐘 |
已知的數據值有“當前日期,打卡人,上班打卡時間,下班打卡時間”,根據已知的數據判斷“是否正常上下班,備注”,代碼如下:
//顯示考勤記錄
public void ShowCheckOnWorkAttendanceRecords()
{
string currentDate = DateTime.Now.ToString("yyyy-MM-dd");//當前日期
string userID = "ZXZ";//打卡人
DateTime workOnTime = Convert.ToDateTime("2012-04-17 09:10:00");//上班打卡時間
DateTime workOffTime = Convert.ToDateTime("2012-04-17 18:00:00");//下班打卡時間
//判斷是否正常上下班,并返回備注
string description = "";
bool isNormalWork = IsNormalWork(currentDate, userID, workOnTime, workOffTime, out description);
//顯示內容調用isNormalWork 和description這兩個值
}
//判斷是否正常上下班,并返回備注
public bool IsNormalWork(string currentDate, string userID, DateTime workOnTime, DateTime workOffTime, out string description)
{
//邏輯判斷的方法省略......
//public bool calculate()......
description = "遲到10分鐘";
return true;
}
重構后的代碼如下:
//首先建立一個實體存放參數里的字段以及把返回的內容也放入字段中
public class CheckOnWorkAttendanceRecords
{
public string CurrentDate { get; set; }
public string UserID { get; set; }
public DateTime WorkOnTime { get; set; }
public DateTime WorkOffTime { get; set; }
public bool IsNormalWork { get; set; }
public string Description { get; set; }
}
//顯示考勤記錄
public void ShowCheckOnWorkAttendanceRecords()
{
//判斷是否正常上下班,并返回備注
CheckOnWorkAttendanceRecords checkOnWorkAttendanceRecords = new CheckOnWorkAttendanceRecords();
checkOnWorkAttendanceRecords.CurrentDate = DateTime.Now.ToString("yyyy-MM-dd");//當前日期
checkOnWorkAttendanceRecords.UserID = "ZXZ";//打卡人
checkOnWorkAttendanceRecords.WorkOnTime = Convert.ToDateTime("2012-04-17 09:10:00");//上班打卡時間
checkOnWorkAttendanceRecords.WorkOffTime = Convert.ToDateTime("2012-04-17 18:00:00");//下班打卡時間
IsNormalWork(checkOnWorkAttendanceRecords);
//顯示內容可以直接調用checkOnWorkAttendanceRecords對象里的內容即可
}
//判斷是否正常上下班,并返回備注
public void IsNormalWork(CheckOnWorkAttendanceRecords checkOnWorkAttendanceRecords)
{
//邏輯判斷的方法省略......
//public bool calculate()......
checkOnWorkAttendanceRecords.Description = "遲到10分鐘";
}
重構后,代碼更清晰易懂,不用在每次看IsNormalWork方法時,去查詢和思考每個參數的內容,同時返回多個參數不用在OUT了,另外IsNormalWork應該屬于邏輯層的邏輯,因此接下來可以把這個方法移到邏輯層相應的類中。

浙公網安備 33010602011771號