首页 > 解决方案 > 使用 DateTime.Now 更新 2 个字段的代码重复

问题描述

我有 1 个长时间运行的进程针对我StartTime and EndTime在数据库表中更新的实体运行,并且我有 1 个单独的端点,这些端点获得显示StartTime,EndTime和实体处理所花费的总时间。

以下是2种方法:

 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)更新的 2 个字段。

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

标签: c#.netado.netrefactoring

解决方案


如果您的流程稳定,并且您的要求允许,您可以使用 1 种方法更新开始时间和结束时间。

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

尽管如此; 一个例子:

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

推荐阅读