使用DateTime.Now

时间:2019-06-28 11:36:36

标签: c# .net ado.net refactoring

我有一个针对实体的长时间运行的进程,为此我在数据库表中更新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)进行更新。

因此,采用这样的单独方法(UpdateRegionStartTimeUpdateRegionEndTime)是有意义的,因为它虽然提高了可读性,但是付出了代码重复的代价,或者可以更好地重构为减少代码重复但仍保持不变的东西。可读性?

1 个答案:

答案 0 :(得分:1)

如果过程稳定,并且在您的要求允许的情况下,则可以用一种方法来更新开始时间和结束时间。

如果这不是一个选项,那么当前的两种方法设置就可以了。它以清晰的描述方式将实际的动作/行为分开,这实际上是一件好事,甚至比“不重复自己”范式更好。

尽管如此;一个例子:

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