2016-04-13 40 views
0

Neredeyse benzer işler yapan iki yöntemi içeren sınıfı basitleştirmenin en iyi yolu nedir?Çoğaltılmış kodun kaldırılmasının en iyi yolu 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 
} 

Böylece, Element sınıfının nesnesi iki farklı türde alana sahiptir. Yinelenen kodu kaldırmanın en iyi yolu nedir?

+1

Move'da bir yöntem haline ilk oluş, daha sonra İkinci (ve müteakip) oluşum yerine metodu çağırın. – ChrisF

+0

@ ChrisF, bu yöntemler bağımsız olarak, bir değil, diğerinden çağrılır. Komut bir tür olduğunda, CheckState başka bir - CheckValue çağırır. Sorun şu ki, Devlet ve Değer farklı türdedir. T parametresiyle bir genel yöntem yapabilirim (ve T bu yöntemin ilk argümanı olacak) – snoward

+0

@MikhailPliskovsky - // bir işin verdiği kodun aynı olduğunu ve 'D refactor, mutlaka testler değil. – ChrisF

cevap

0

Durum için bir işlevi iletebilirsiniz. Öğeye geçmek için işleme koymanız gerektiğini düşündüğüm gibi.

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

Kullanımı:

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

Sen de anonim işlevleri olmadan yapabilirsiniz:

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 
    } 
} 

Kullanımı:

//for state 
CheckElement(element, myState); 
//or 
//for value 
CheckElement(element, value: myValue); 
İlgili konular