我正在重构我的代码。考虑这个例子......
public virtual List<Student> FetchEnrollmentList(DateTime admissionDateFrom,
DateTime admissionDateTo)
{
var students = new List<Student>();
using (oconn = new OleDbConnection(OracleConnection))
{
oconn.Open();
query = "SELECT * FROM Enrollment Where AdmissionDate between @AdmissionDateFrom and @AdmissionDateTo ";
using (ocmd = new OleDbCommand(query, oconn))
{
ocmd.Parameters.Add("@AdmissionDateFrom", OleDbType.Date).Value = admissionDateFrom;
ocmd.Parameters.Add("@AdmissionDateTo", OleDbType.Date).Value = admissionDateTo;
using (odr = ocmd.ExecuteReader())
{
while (odr.Read())
students.Add(new Student { Name = odr["StudentName"].ToString() });
}
}
}
return students;
}
我只想消除From和To,所以我创建了一个类似这样的类型
public virtual List<Student> FetchEnrollmentList(DateSpan admissionDate)
{
var students = new List<Student>();
using (oconn = new OleDbConnection(OracleConnection))
{
oconn.Open();
query = "SELECT * FROM Enrollment Where AdmissionDate between @AdmissionDateFrom and @AdmissionDateTo ";
using (ocmd = new OleDbCommand(query, oconn))
{
ocmd.Parameters.Add("@AdmissionDateFrom", OleDbType.Date).Value = admissionDate.Start;
ocmd.Parameters.Add("@AdmissionDateTo", OleDbType.Date).Value = admissionDate.End;
using (odr = ocmd.ExecuteReader())
{
while (odr.Read())
students.Add(new Student { Name = odr["StudentName"].ToString() });
}
}
}
return students;
}
这样可以吗?还有其他想法吗?感谢....
答案 0 :(得分:2)
我同意Martin,只有两个DateTime
参数定义了列表的边界,实际上没有太多需要重构,那里根本就没有“代码味道”。
另一方面,如果你引入其他方法,如你所说使用几个日期范围参数,我会重构一旦我实际拥有DateSpan
的方法。通常YAGNI直到你真正介绍这些方法,只有这样才能重构现有方法以实现均匀性。
在真正需要它之前我不会介绍太多的一般性,重构不是关于你在不久的将来可能需要的东西,而是你可以用你的代码库来创建更易读和可维护的代码拥有你想要添加的功能。
答案 1 :(得分:1)
重新“想象我有3”评论:然后你有3;)(或3对)
那里的一个替代方案(如params增加)是创建一个表示查询参数的类,然后只有一个形式参数。另外,您可以轻松添加选项。例如:
public class StudentSearchRequest {
public DateTime FooStart {get;set;}
public DateTime FooEnd {get;set;}
public bool PublicDataOnly {get;set;}
public int SomethigElse {get;set;}
}