0

アップデート

IReportRepositoryからデータを取得し、データを操作し、事前定義された式に従ってリスクを計算するRiskReportタイプがあります。

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
}

任意のアイデアをいただければ幸いです!

4

2 に答える 2

1

IReportRepositoryからデータを取得し、データを操作し、事前定義された式に従ってレートを計算するレポートタイプがあります。

答えはあなたの最初の文にあると思います。コードを適切なものにしたい場合は、それをSOLIDにします。「S」は単一責任原則の略です。つまり、クラスの機能を説明する場合は、「and」という単語を使用しないでください。それに応じてデザインを変更します。

于 2012-04-24T06:05:49.427 に答える
0

これは、1000人の開発者に質問すると1000人の回答が得られるという質問の1つだと思いますが、そうです、別のクラスを使用する必要があります。これが私の正当化です:

  1. 「数学」っぽいクラスは独立してテストできます
  2. 別のクラスを再利用して、残りのコードをDRYのままにしておくことができます
  3. 数式が変更された場合、リファクタリングはレポートコードに組み込まれません

コードベースを継承する必要がある場合は、ここに3つのクラスを表示したいので、それを開発する場合は、次の開発者のために残しておきます。

乾杯。

于 2012-04-24T02:54:44.010 に答える