重构学习2-消除过长参数
動(dòng)機(jī):一個(gè)方法里的參數(shù)過(guò)長(zhǎng),過(guò)長(zhǎng)的參數(shù)列導(dǎo)致方法很難使用,因?yàn)檫@些參數(shù)太長(zhǎng)難以理解,而且調(diào)用者和被調(diào)用者都必須記住這些參數(shù)的用途,另一個(gè)原因是一旦需要更多數(shù)據(jù),就可能要增加參數(shù)或者重載這個(gè)方法。所以消除過(guò)長(zhǎng)參數(shù)往往能提高代碼的可讀性。
方法:一、如果參數(shù)的值是通過(guò)調(diào)用某個(gè)函數(shù)的結(jié)果得來(lái)的,則去掉該參數(shù),讓接受該參數(shù)的函數(shù)直接調(diào)用該函數(shù)。
二、如果這些參數(shù)是來(lái)自同一實(shí)體對(duì)象,則傳遞這個(gè)實(shí)體對(duì)象過(guò)去即可,如果這個(gè)實(shí)體不存在,那就先創(chuàng)建一個(gè)。
注意:如果被調(diào)用函數(shù)使用了 [來(lái)自另一個(gè)對(duì)象的很多項(xiàng)數(shù)據(jù)」,這可能意味該函數(shù)實(shí)際上應(yīng)該被定義在「那些數(shù)據(jù)所屬的對(duì)象」中。這時(shí)候可以考慮移動(dòng)方法。
示例:
比如公司OA,有一個(gè)頁(yè)面顯示某天某個(gè)人打卡記錄是否正常,顯示的格式如下:
| 當(dāng)前日期 | 打卡人 | 上班打卡時(shí)間 | 下班打卡時(shí)間 | 是否正常上下班 | 描述 |
| 2012-04-17 | ZXZ | 09:10 | 18:00 | 非正常 | 遲到10分鐘 |
已知的數(shù)據(jù)值有“當(dāng)前日期,打卡人,上班打卡時(shí)間,下班打卡時(shí)間”,根據(jù)已知的數(shù)據(jù)判斷“是否正常上下班,備注”,代碼如下:
?| 1 2 3 4 5 6 7 8 9 10 | //顯示考勤記錄 public void ShowCheckOnWorkAttendanceRecords() { ????string currentDate = DateTime.Now.ToString("yyyy-MM-dd");//當(dāng)前日期 ????string userID = "ZXZ";//打卡人 ????DateTime workOnTime = Convert.ToDateTime("2012-04-17 09:10:00");//上班打卡時(shí)間 ????DateTime workOffTime = Convert.ToDateTime("2012-04-17 18:00:00");//下班打卡時(shí)間 ????//判斷是否正常上下班,并返回備注 ????string description = ""; ???bool isNormalWork = IsNormalWork(currentDate, userID, workOnTime, workOffTime, out description); |
| 1 2 3 4 5 6 7 8 9 10 | ???//顯示內(nèi)容調(diào)用isNormalWork 和description這兩個(gè)值 } //判斷是否正常上下班,并返回備注 public bool IsNormalWork(string currentDate, string userID, DateTime workOnTime, DateTime workOffTime, out string description) { ????//邏輯判斷的方法省略...... ????//public bool calculate()...... ????description = "遲到10分鐘"; ????return true; } |
重構(gòu)后的代碼如下:
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | //首先建立一個(gè)實(shí)體存放參數(shù)里的字段以及把返回的內(nèi)容也放入字段中 ????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");//當(dāng)前日期 ????????checkOnWorkAttendanceRecords.UserID = "ZXZ";//打卡人 ????????checkOnWorkAttendanceRecords.WorkOnTime = Convert.ToDateTime("2012-04-17 09:10:00");//上班打卡時(shí)間 ????????checkOnWorkAttendanceRecords.WorkOffTime = Convert.ToDateTime("2012-04-17 18:00:00");//下班打卡時(shí)間 ????????IsNormalWork(checkOnWorkAttendanceRecords); ????????//顯示內(nèi)容可以直接調(diào)用checkOnWorkAttendanceRecords對(duì)象里的內(nèi)容即可 ????} ????//判斷是否正常上下班,并返回備注 ????public void IsNormalWork(CheckOnWorkAttendanceRecords checkOnWorkAttendanceRecords) ????{ ????????//邏輯判斷的方法省略...... ????????//public bool calculate()...... ????????checkOnWorkAttendanceRecords.Description = "遲到10分鐘"; ????} |
重構(gòu)后,代碼更清晰易懂,不用在每次看IsNormalWork方法時(shí),去查詢和思考每個(gè)參數(shù)的內(nèi)容,同時(shí)返回多個(gè)參數(shù)不用在OUT了,另外IsNormalWork應(yīng)該屬于邏輯層的邏輯,因此接下來(lái)可以把這個(gè)方法移到邏輯層相應(yīng)的類中。
轉(zhuǎn):http://www.cnblogs.com/seesea125/archive/2012/04/17/2453256.html
總結(jié)
以上是生活随笔為你收集整理的重构学习2-消除过长参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 坚强不屈的反义词斩钉截铁(坚强不屈的反义
- 下一篇: Gridview的footer模板中放置