2016-04-13 1 views
0

Was ist der beste Weg, um die Klasse zu vereinfachen, die zwei Methoden fast ähnliche Arbeit enthält.Die beste Methode zum Entfernen von dupliziertem Code in C#

enum State 
{ 
    Processing, Stoped 
} 

public static void CheckState(State state, Element elem) 
{ 
    if (elem.State == state) 
     //some work 
} 

public static void CheckValue(int value, Element elem) 
{ 
     if (elem.Value == value) 
      //some work 
} 

Also, Objekt der Klasse Element hat zwei Felder unterschiedlicher Typen. Was ist der beste Weg, um doppelten Code zu entfernen?

+1

Bewegen Sie das erste Vorkommen in ein Verfahren, dann Rufen Sie die Methode anstelle des zweiten (und nachfolgenden) Auftretens (s) auf. – ChrisF

+0

@ChrisF, diese Methoden werden unabhängig aufgerufen, nicht eins, dann ein anderes. Wenn der Befehl von einem Typ ist, ruft CheckState einen anderen auf - CheckValue. Das Problem ist, dass State und Value von verschiedenen Typen sind. Vielleicht kann ich eine generische Methode mit Parameter T machen (und T wird das erste Argument dieser Methode sein) – snoward

+0

@MikhailPliskovsky - Ich war davon ausgegangen, dass der Code von "// etwas Arbeit" anspielte, war das gleiche und was Sie Refaktor, nicht unbedingt die Tests. – ChrisF

Antwort

0

Sie könnten eine Funktion für die Bedingung übergeben. Das Element übergeben, wie ich annehme, dass Sie es für die Verarbeitung benötigen.

public static void CheckAndProcess(Func<bool> CheckCondition, Element elem) 
{ 
    if (CheckCondition()) 
    { 
     //some work 
    } 
} 

Verbrauch:

CheckAndProcess(()=>(elem.State == state), elem); 
CheckAndProcess(()=>(elem.Value == value), elem); 
0

Sie können es ohne anonyme Funktionen auch tun:

public static void CheckElement(Element element, State state = null, int? value = null) 
{ 
    if ((state != null && element.State == state) || (value != null && element.Value == value.Value)) 
    { 
     //some work 
    } 
} 

Verbrauch:

//for state 
CheckElement(element, myState); 
//or 
//for value 
CheckElement(element, value: myValue); 
Verwandte Themen