Параметр даты и времени для запросов SQL - PullRequest
2 голосов
/ 30 октября 2010

Я рефакторинг моего кода. Рассмотрим этот пример ...

    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;
    }

Это нормально, чтобы это было так? Есть еще идеи? спасибо ....

Ответы [ 2 ]

2 голосов
/ 30 октября 2010

Я согласен с Мартином, с двумя параметрами DateTime, определяющими границы списка, на самом деле нет нужды в рефакторинге, просто там пока нет "запаха кода".

С другой стороны, если вы введете другие методы, которые, как вы говорите, используют несколько параметров диапазона дат, я бы осуществил рефакторинг, как только у меня появятся эти методы с DateSpan.Как правило, YAGNI до тех пор, пока вы действительно не представите эти методы, только тогда вы должны провести рефакторинг существующих методов для унификации imo.

Я бы не стал вводить слишком много обобщений, пока в этом действительно не будет необходимости, рефакторингне о том, что вам может понадобиться в каком-то отдаленном будущем, а о том, что вы можете сделать, создав более читаемый и поддерживаемый код с имеющейся кодовой базой и функциями, которые вы хотите добавить в данный момент.

1 голос
/ 30 октября 2010

По поводу комментария "представь, что у меня 3": тогда у тебя 3;) (или 3 пары)

Одна альтернатива (при увеличении параметров) - создать класс, который представляет параметры запроса, тогда есть только 1 формальный параметр. Плюс вы можете добавлять варианты безболезненно. Например:

public class StudentSearchRequest {
    public DateTime FooStart {get;set;}
    public DateTime FooEnd {get;set;}
    public bool PublicDataOnly {get;set;}
    public int SomethigElse {get;set;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...