我在C#中有这个方法,看起来我应该重构它。我应该使用设计模式吗?我现在看到的重复次数过多,尤其是如果语句被添加为更多条件
更改方法?
public void CreateOrUpdateReportDefinition(ReportGroupSubReport reportGroupSubReport, bool isNew, int report)
{
if (report == 1)
{
var entity = _envyUnitOfWork.ReportDefinitions.GetById(reportGroupSubReport.Id) ?? new ReportDefinition();
if (isNew)
entity.SetNew();
_envyUnitOfWork.ReportDefinitions.InsertOrUpdate(entity, true);
}
else if (report == 2)
{
var entity = _envyUnitOfWork.TraxReports.GetById(reportGroupSubReport.Id) ?? new TraxReport();
if (isNew)
entity.SetNew();
_envyUnitOfWork.TraxReports.InsertOrUpdate(entity, true);
}
Mapper.Map(reportGroupSubReport, entity);
_envyUnitOfWork.Commit();
}
答案 0 :(得分:0)
所以我要做的是将每个条件行为放入单独的方法中。为避免重复,您可以使用模板方法模式。您还应该在所有if语句之前声明报表变量,以便Mapper.Map()可以访问它。
编辑: 好吧,假设_envyUnitOfWork.TraxReports和_envyUnitOfWork.ReportDefinitions共享一些公共通用接口(我在代码中命名为Repository)定义了GetById和InsertOrUpdate方法,您不需要使用任何设计模式 - 简单的通用方法就可以完成这项工作。以下是代码示例:
private void createOrUpdateReportDefinition<Report>(ReportGroupSubReport reportGroupSubReport, bool isNew, Repository<Report> repository/*, Action<Report> insertOrUpdate*/) where Report : new()
{
var entity = repository.GetById(reportGroupSubReport.Id) ?? new Report();
if (isNew)
entity.SetNew();
repository.InsertOrUpdate(entity, true);//insertOrUpdate(entity, true);
Mapper.Map(reportGroupSubReport, entity);
_envyUnitOfWork.Commit();
}
public void CreateOrUpdateReportDefinition(ReportGroupSubReport reportGroupSubReport, bool isNew, int report)
{
if (report == 1)
{
createOrUpdateReportDefinition(reportGroupSubReport, isNew, _envyUnitOfWork.ReportDefinitions/*, _envyUnitOfWork.ReportDefinitions.InsertOrUpdate*/);
}
else if (report == 2)
{
createOrUpdateReportDefinition(reportGroupSubReport, isNew, _envyUnitOfWork.TraxReports/*, _envyUnitOfWork.TraxReports.InsertOrUpdate*/);
}
}
请注意,此代码只处理代码中的一个问题,即代码重复,您可以通过将方法分成几个方法从方法中删除int report
参数来改进。或者至少用一些有意义名称的枚举替换它。我也建议对bool isNew
参数进行相同的(划分方法),因为使用它意味着你的函数不会只做一件违反SOLID单一责任原则的事情 - 你可以阅读更多关于它的信息here.
答案 1 :(得分:-2)
以下重构模式可能会为您提供一些线索,说明如何管理激增的条件问题:https://sourcemaking.com/refactoring/replace-conditional-with-polymorphism
编辑:最简单的方法是定义一个TraxReports和ReportDefinition实现具有InsertOrUpdate方法的接口。