2012-04-24 70 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