Дублирование кода для обновления 2 полей с помощью DateTime.Now - PullRequest
1 голос
/ 28 июня 2019

У меня 1 длительный процесс, запущенный на объекте, для которого я обновляю StartTime and EndTime в таблице базы данных, и затем у меня есть 1 отдельная конечная точка, которая получает отображение StartTime,EndTime и общее время, необходимое объекту для обработки.

Ниже приведены два метода:

 public class DbModule
        {
            private readonly string _connectionString;
            public DbModule() { }

            public DbModule(string connectionString)
            {
                _connectionString = connectionString;
            }

     public void UpdateRegionStartTime(int moduleId,int regionId)
            {
                using (SqlConnection connection = new SqlConnection(_connectionString))
                {
                    string query = "Update Module_Region_Mapping set [StartDateTime]=@StartDateTime where ModuleId=@ModuleId and RegionId=@RegionId";
                    using (SqlCommand cmd = new SqlCommand(query, connection))
                    {
                        connection.Open();
                        cmd.Parameters.AddWithValue("@ModuleId", moduleId);
                        cmd.Parameters.AddWithValue("@RegionId", regionId);
                        cmd.Parameters.AddWithValue("@StartDateTime", DateTime.Now);
                        cmd.ExecuteNonQuery();
                        connection.Close();
                    }
                }
            }

            public void UpdateRegionEndTime(int moduleId,int regionId)
            {
                using (SqlConnection connection = new SqlConnection(_connectionString))
                {
                    string query = "Update Module_Region_Mapping set [EndDateTime]=@EndDateTime where                 ModuleId=@ModuleId and RegionId=@RegionId";
                    using (SqlCommand cmd = new SqlCommand(query, connection))
                    {
                        connection.Open();
                        cmd.Parameters.AddWithValue("@ModuleId", moduleId);
                        cmd.Parameters.AddWithValue("@RegionId", regionId);
                        cmd.Parameters.AddWithValue("@EndDateTime", DateTime.Now);
                        cmd.ExecuteNonQuery();
                        connection.Close();
                    }
                }
            }
      }

public class MyProcessor
{
   public void Process(int moduleId,int regionId)
   {
      var dbModule = new DbModule("connection string");
      try
      {
         dbModule.UpdateRegionStartTime(100, 101);
         LongRunningProcess();
         dbModule.UpdateRegionEndTime(100,101);
      }
      catch(){}
    }
}

Но я чувствую себя как дубликат кода, поскольку только два поля обновляются с помощью одной и той же функции (DateTime.Now).

Таким образом, наличие отдельного метода, подобного этому (UpdateRegionStartTime и UpdateRegionEndTime), имеет смысл, поскольку он улучшает читабельность, хотя и за счет дублирования кода, или его можно реорганизовать для чего-то, что уменьшает дублирование кода, но при этом сохраняет читабельность?

1 Ответ

1 голос
/ 28 июня 2019

Если ваш процесс стабилен и если ваши требования это позволяют, вы можете выполнить обновление как времени начала, так и времени окончания одним способом.

Если это не вариант, то с вашей текущей настройкой 2 метода все в порядке.Он разделяет реальное действие / поведение в четкой описательной форме, что на самом деле хорошо, даже лучше, чем парадигма «не повторяйся».

Тем не менее;пример:

var startTime = DateTime.Now;
LongRunningProcess();
var endTime = DateTime.Now; //used for clarity.
dbModule.UpdateStats(100,101,startTime,endTime);
...