2016-03-28 3 views
0

Ich habe diese Methode in C#, die aussieht, ich sollte es wirklich umgestalten. Soll ich ein Designmuster verwenden? Zu viel Wiederholung ist, was ich JETZT sehe und besonders als MORE bedingte, wenn Aussagen hinzugefügt werdenC# Methode sieht sehr redundant aus was kann ich tun, um es zu beheben Design-Muster, Methode?

Wechsel zu einer Methode?

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

Ich denke diese Frage würde hier besser passen http://codereview.stackexchange.com/ –

+0

Eigentlich funktioniert dieser Code nicht als Mapper.Map (reportGroupSubReport, entity); hat ein Problem mit der Entität nicht im aktuellen Kontext –

Antwort

0

Also was ich tun würde ist, jedes einzelne bedingte Verhalten in separate Methode zu setzen. Um Wiederholungen zu vermeiden, könnten Sie das Vorlagenmethodenmuster verwenden. Sie sollten Ihre Berichtsvariable auch vor allen if-Anweisungen deklarieren, damit sie für die Mapper.Map() zugänglich sind.

Edit: Ok, so dass einige gemeinsame generische Schnittstelle beide _envyUnitOfWork.TraxReports und _envyUnitOfWork.ReportDefinitions angenommen (was ich Repository in Code genannt), die GetById und InsertOrUpdate Methoden, Sie keine Entwurfsmuster verwenden müssen - einfach generische Methode wird die Arbeit erledigen. Hier ist Beispiel für den Code:

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*/); 
     } 

    } 

Bitte nehmen Sie unter Berücksichtigung dieses Code nur mit einem Problem in Ihrem Code zu tun, die die Code-Duplizierung war, gibt es noch einige Dinge, die Sie wie das Entfernen int report Parameter aus dem Verfahren verbessern könnten entweder indem man sie in wenige Methoden aufteilt oder sie zumindest durch einen sinnvollen Namen ersetzt. Ich würde auch vorschlagen, das gleiche (Division der Methoden) für die bool isNew Parameter, da die Verwendung bedeutet, dass Ihre Funktion nicht nur eine Sache, die gegen Single-Verantwortung-Prinzip von SOLID ist - können Sie mehr darüber lesen here.

+0

Ein Beispiel für das, was Sie vorschlagen ? –

+0

Welcher Typ genau sind _envyUnitOfWork.TraxReports und _envyUnitOfWork.ReportDefinitions? –

+0

'IRepository TraxReports {erhalten; einstellen; } 'dann Implementierung' public IRepository TraxReports {get; einstellen; } ' –

-2

Die folgenden Refactoring Muster könnten Sie einige Hinweise darauf, wie Sie das wuchernde bedingte Problem verwalten könnten: https://sourcemaking.com/refactoring/replace-conditional-with-polymorphism

Edit: Der einfachste Weg, dies zu tun wäre eine Schnittstelle, die beide TraxReports und Report wird definiert, implementieren, das über eine InsertOrUpdate-Methode verfügt.

+1

Kannst du bitte Stellen Sie den Inhalt des Links hier zur Verfügung, der spezifisch die Frage beantwortet ... –

+0

Nein. Der Link ist genug, um etwas weiter zu lesen, das helfen kann, eine passende Antwort zu finden. –

+1

Sie sagen also, Ihre Link nur Antwort ist nicht einmal eine Antwort - löschen Sie es dann und setzen Sie es als Kommentar Ich bin Zukunft –

Verwandte Themen