c#方法看起来很冗余我该怎么做才能修复它的设计模式,方法?

时间:2016-03-28 20:41:48

标签: c# algorithm design-patterns

我在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();


    }

2 个答案:

答案 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方法的接口。