我有一个针对实体的长时间运行的进程,为此我在数据库表中更新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
)是有意义的,因为它虽然提高了可读性,但是付出了代码重复的代价,或者可以更好地重构为减少代码重复但仍保持不变的东西。可读性?
答案 0 :(得分:1)
如果过程稳定,并且在您的要求允许的情况下,则可以用一种方法来更新开始时间和结束时间。
如果这不是一个选项,那么当前的两种方法设置就可以了。它以清晰的描述方式将实际的动作/行为分开,这实际上是一件好事,甚至比“不重复自己”范式更好。
尽管如此;一个例子:
var startTime = DateTime.Now;
LongRunningProcess();
var endTime = DateTime.Now; //used for clarity.
dbModule.UpdateStats(100,101,startTime,endTime);