2016-03-28 4 views
0

私は本当にリファクタリングする必要があるようなC#でこのメソッドを持っています。デザインパターンを使用すべきですか?あまりにも多くの繰り返しは、私が今見ているものであり、特に条件文が追加された場合です。C#メソッドは非常に冗長に見える私はそれをデザインパターン、メソッドを修正するために行うことができますか?

方法に変更しますか? https://sourcemaking.com/refactoring/replace-conditional-with-polymorphism

編集:

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


    } 
+0

この質問はここでうまくいくhttp://codereview.stackexchange.com/ –

+0

実際には、このコードでも 'Mapper.Map(reportGroupSubReport、entity); 'は現在のコンテキストに存在しないエンティティに問題があります –

答えて

0

だから私は、すべての単一の条件付き動作を別の方法にすることです。繰り返しを避けるために、テンプレートメソッドパターンを使用することができます。また、すべてのif文の前にレポート変数を宣言して、Mapper.Map()でアクセスできるようにする必要があります。

編集:オクラホマので、_envyUnitOfWork.TraxReportsと_envyUnitOfWork.ReportDefinitions両方は、あなたが任意のデザインパターンを使用する必要はありません(私はコード内のリポジトリを命名する)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*/); 
     } 

    } 

このコードは、コードの重複したあなたのコード内の1つの問題にのみ扱っている、方法からint reportパラメータを削除するようにあなたが改善することができたいくつかのことがまだある検討中でみてくださいそれをいくつかの方法に分割するか、少なくともそれをいくつかの列挙型に置き換えて意味のある名前にします。 bool isNewパラメータの場合も同様です(メソッドを分割する)ことをお勧めします。これは、あなたの関数がSOLIDの単一責任の原則に反して1つしかないことを意味するからです - 詳細について読むことができますhere.

+0

提案の例? –

+0

正確にどのタイプが_envyUnitOfWork.TraxReportsと_envyUnitOfWork.ReportDefinitionsですか? –

+0

'IRepository TraxReports {get;セット; } '次に実装' public IRepository TraxReports {get;セット; } ' –

-2

次リファクタリングパターンは、あなたが増殖条件の問題を管理することができる方法についてのいくつかの手がかりを与えるかもしれないこれを行う最も簡単な方法をインターフェイスTraxReportsとReportDefinitionの両方を定義することになりますInsertOrUpdateメソッドを持つ実装。

+1

できますか具体的に質問に答えるリンクの内容をここに入力してください。 –

+0

いいえ、適切な答えを見つけるのに役立ついくつかの読書を示唆するのに十分です。 –

+1

あなたのリンクだけの回答は答えではないと言っています - それを削除してコメントとして記入してください私は将来です –

関連する問題