2012-04-24 73 views
0

更新设计原则/图案使用存储库,数据转换,和数学公式

我有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 
} 

任何想法,将不胜感激!

回答

0

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

  1. A“数学” -ish类可独立
  2. 一个单独的类可以循环使用,使您的代码DRY其余测试
  3. 如果公式改变,重构不会被嵌入到你的报告代码中

如果我不得不继承代码库,我想在这里看到三个类,所以这就是我想为下一个开发者留下的东西,如果我正在开发它。

干杯。

+0

谢谢您的建议。我将报告类型更改为RiskReport类型,是否会影响您的建议? – Pingpong 2012-04-24 07:34:51

1

我有一个报告类型,它从IReportRepository获取数据,操纵数据,并且 根据预定义的公式计算速率。

我觉得答案是在你的第一句话。如果您想让代码变得更好,请将其编码为SOLID。 “S”代表单一责任原则。换句话说,如果你描述一个班级做什么,不要使用“和”这个词。相应地更改您的设计。

+0

我认为这是正确的答案。分离获奖职位中提到的关切的三个好处都是单一职责原则的直接后果。 – theringostarrs 2012-05-03 22:58:29