使用存储库,数据转换和数学公式设计原则/模式

时间:2012-04-24 00:48:15

标签: c# asp.net-mvc design-patterns

更新

我有一个RiskReport类型,它从IReportRepository获取数据,操纵数据,并根据预定义的公式计算风险。

有人可能认为RiskReport类型应该以精确格式获取数据而不执行数据操作。 RiskReport应该只关注如何根据公式计算数据,而IReportRepository应该只返回RiskReport类所需的数据。

是否应在IReportRepository和RiskReport之间引入新类?因为,目前,从IReportRepository返回的数据被操纵为所需的格式以计算风险。

class RiskReport 
{
    private IReportRepository reportRepository;

    public RiskReport(IReportRepository reportRepository)
    {
        this.reportRepository = reportRepository;
    }




    public decimal CalculateDataBasedOnFormula()
    {
        var result = from d in reportRepository.GetReportRelatedData()
                     group d by d.Id into dgp   //potentially complex grouping
                     select new
                                {
                                    TotalPage = dgp.Sum(x=>x.Pages)  //potentially complex projection
                                };


        decimal risk=  //use the result variable to calculate data based on complex formula not shown here

        return risk;

    }
}


interface IReportRepository
{
    IEnumerable<ReportRelatedData> GetReportRelatedData();
}

public class ReportRepository: IReportRepository
{

    public IEnumerable<ReportRelatedData> GetReportRelatedData()
    {
       //return data from underlying data source
        return new BindingList<ReportRelatedData>();
    }
}

public class ReportRelatedData
{
    public int Id { get; set; }
    public int Name { get; set; }
    public int Pages { get; set; }
    //... more properties here
}

任何想法都会受到赞赏!

2 个答案:

答案 0 :(得分:1)

  

我有一个Report类型,它从IReportRepository获取数据,操纵数据,以及   根据预定义的公式计算费率。

我认为答案在你的第一句话中。如果您希望代码良好,请将其设为SOLID。 “S”代表单一责任原则。换句话说,如果你描述一个类的作用,不要使用“和”这个词。相应地改变你的设计。

答案 1 :(得分:0)

我认为这是其中一个问题,如果你问1000个开发者你可以得到1000个答案,但是,我会说应该使用另一个类。这是我的理由:

  1. “数学” - 课程可以独立测试
  2. 可以重复使用单独的类,保留其余代码DRY
  3. 如果公式发生变化,重构将不会嵌入到您的报告代码中
  4. 如果我必须继承代码库,我想在这里看到三个类,所以如果我正在开发它,那就是我想留下的下一个dev。

    干杯。