C # Методы абстрагирования - PullRequest
       19

C # Методы абстрагирования

2 голосов
/ 24 февраля 2011

У меня есть набор методов, которые принимают даты и bool. Эти методы затем используют некоторый SQL, затем передают его другому методу и возвращают список. Каждый метод практически одинаков, за исключением SQL и возвращаемого списка. Теперь я знаю, что есть лучший способ сделать эти методы, но я не уверен, как.

У кого-нибудь есть идеи относительно того, как я могу абстрагировать это или использовать лучший дизайн, поскольку методы почти идентичны?

Вот код:

private List<ENT_Message> GetMessageData(DateTime? startDate, DateTime? endDate, bool IsSelectAll)
{
    List<ENT_Message> ret = new List<ENT_Message>();
    string sql = "";

    if (IsSelectAll)
    {
        sql = "select * from tbl_message";
    }
    else
    {
        sql = " Select * from tbl_message where created_Date between @start_Date and @end_date";
    }

    return Converter.SerializeToMessageList(this.GetData(startDate, endDate, IsSelectAll, sql));                   
}

private List<ENT_SensorData> GetSensorData(DateTime? startDate, DateTime? endDate, bool IsSelectAll)
{
    List<ENT_SensorData> ret = new List<ENT_SensorData>();
    string sql = "";

    if (IsSelectAll)
    {
        sql = "select * from tbl_sensor_data";
    }
    else
    {
        sql = "select * from tbl_sensor_data where Timestamp between @start_date and @end_Date";
    }

    return Converter.SerializeToSensorDataList(this.GetData(startDate, endDate, IsSelectAll, sql)); 
}

private List<ENT_SensorDataEvent> GetSensorDataEvents(DateTime? startDate, DateTime? endDate, bool IsSelectAll)
{
    List<ENT_SensorDataEvent> ret = new List<ENT_SensorDataEvent>();
    string sql = "";

    if (IsSelectAll)
    {
        sql = "select * from tbl_sensor_data_event";
    }
    else
    {
        sql = "select * from tbl_sensor_data_event where start_time between @start_date and @end_Date";
    }

    return Converter.SerializeToSensorEventDataList(this.GetData(startDate, endDate, IsSelectAll, sql)); 
}

private List<ENT_SensorDataState> GetSensorDataState(DateTime? startDate, DateTime? endDate, bool IsSelectAll)
{
    List<ENT_SensorDataState> ret = new List<ENT_SensorDataState>();
    string sql = "";

    if (IsSelectAll)
    {
        sql = "select * from tbl_sensor_data_state";
    }
    else
    {
        sql = "select * from tbl_sensor_data_state where start_time between @start_date and @end_Date";
    }

    return Converter.SerializeToSensorDateStateList(this.GetData(startDate, endDate, IsSelectAll, sql)); 
}

private List<ENT_WorkOrder> GetWorkOrders(DateTime? startDate, DateTime? endDate, bool IsSelectAll)
{
    List<ENT_WorkOrder> ret = new List<ENT_WorkOrder>();
    string sql = "";

    if (IsSelectAll)
    {
        sql = "select * from tbl_workorder";
    }
    else
    {
        sql = "select * from tbl_sensor_data_state where completed_date between @start_date and @end_Date";
    }

    return Converter.SerializeToWorkOrderList(this.GetData(startDate, endDate, IsSelectAll, sql));   
}

Ответы [ 6 ]

2 голосов
/ 24 февраля 2011

Вы можете значительно сократить свои функции.Например, вместо

private List<ENT_SensorDataState> GetSensorDataState(DateTime? startDate, DateTime? endDate, bool IsSelectAll)
{
    List<ENT_SensorDataState> ret = new List<ENT_SensorDataState>();
    string sql = "";

    if (IsSelectAll)
    {
        sql = "select * from tbl_sensor_data_state";
    }
    else
    {
        sql = "select * from tbl_sensor_data_state where start_time between @start_date and @end_Date";
    }

    return Converter.SerializeToSensorDateStateList(this.GetData(startDate, endDate, IsSelectAll, sql));
}

вы могли бы просто написать

private List<ENT_SensorDataState> GetSensorDataState(DateTime? startDate, DateTime? endDate, bool IsSelectAll)
{
    string sql = "select * from tbl_sensor_data_state"
                 + (IsSelectAll ? "" : "where start_time between @start_date and @end_Date");

    return Converter.SerializeToSensorDateStateList(this.GetData(startDate, endDate, IsSelectAll, sql));
}

, который в основном сводит вашу функцию к действительно важным вещам: SQL и имя функции сериализации.1007 *

2 голосов
/ 24 февраля 2011

Похоже, у вас есть возможность сделать общий метод.Я заранее извиняюсь, если у меня есть синтаксические ошибки.

private List<T> GetData<T>(DateTime? startDate, DateTime? endDate, bool IsSelectAll) where T : ENT_Data
{
    List<T> ret = new List<T>();
    string sql = "";

    if (IsSelectAll)
    {
        sql = "select * from " + T.table;
    }
    else
    {
        sql = " Select * from " + T.table + " where created_Date between @start_Date and @end_date";
    }

    return Converter.Serialize<T>(this.GetData(startDate, endDate, IsSelectAll, sql));    
}

Обратите внимание на несколько вещей, которые я сделал:

  1. Универсальный метод имеет ограничение, согласно которому T является подклассом ENT_Data,type, который я только что составил.
  2. Я дал типам ENT_Data поле table для использования в вашем запросе.
  3. Методы Converter.Serialize также были сделаны универсальными аналогичным образом.

Если я что-то упустил, просто дайте мне знать.

1 голос
/ 24 февраля 2011

Вы можете создать класс SqlRetriever, а затем подклассы каждого из них с определенным сообщением SQL для отправки.

class SqlRetriever {
    public abstract void SendSqlCmd();
    public ArrayList List {
        get; set;
    }
}

class SqlRetrieverXXX
    public const string SqlCmd = " ... ";
    public override void SendSqlCmd()
    {
       /* ... */
    }
}

Следующая возможность, включающая меньше классов, с худшим дизайном, следующая:

class SqlRetriever {
        public const string SQLCmd1 = "...";
        public const string SQLCmd2 = "...";

        public void SendSqlCmd(string sqlcmd)
        {
             /*Send the SQL Cmd and store the result in the list */
        }

        public ArrayList List {
            get; set;
        }

        public static ArrayList DoSqlCmd(string sqlCmd)
        {
             var obj = new SqlRetriever();

             obj.SendSqlCmd( sqlCmd );

             return obj.List;
        }
}
1 голос
/ 24 февраля 2011
private List<T> GetData<T>(DateTime? startDate, DateTime? endDate, bool IsSelectAll)
        {
            List<T> ret = new List<T>();

            string tableName = "";//Select the table name based on T here
            string sql = "";

            if (IsSelectAll)
            {
                sql = "select * from tbl_sensor_data";
            }
            else
            {
                sql = "select * from tbl_sensor_data where Timestamp between @start_date and @end_Date";
            }
            //Build your list using the appropriate converter based on T here        
            return Converter.SerializeToSensorDataList(this.GetData(startDate, endDate, IsSelectAll, sql)); 
        }

С этого момента вы звоните только

GetData<ENT_whatever>() 

.

0 голосов
/ 24 февраля 2011

У вас может быть один базовый класс, от которого наследуются все ваши классы ENT_ *. Затем создайте один метод List GetData (yourParams). Создайте фабричный метод, который получает список объектов в зависимости от типа ENT_Base. Ваш GetData () вызывает это и возвращает его. Вам не удастся обойти дело переключателя или если-тогда, чтобы выяснить, какие типы сущностей вы должны вернуть.

0 голосов
/ 24 февраля 2011

Если вы храните свои операторы sql и метод делегата на карте, где ключом является некоторый тип T, а затем делаете ваш метод универсальным (метод принимает тип T и возвращает список T), вы можете выполнить поиск по карте, чтобы получитьправильные операторы sql и метод делегата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...