2016-04-13 4 views
0

Каков наилучший способ упрощения класса, который содержит два метода, выполняющих почти аналогичную работу.Лучший способ удалить дублированный код в 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 
} 

Итак, объект класса Element имеет два поля разных типов. Каков наилучший способ удаления дублированного кода?

+1

Переместить первое вхождение в метод, то вызовите метод вместо второго (и последующего) вхождения (я). – ChrisF

+0

@ChrisF, эти методы вызываются независимо, а не один, затем другой. Когда команда имеет один тип, CheckState вызывает, другой - CheckValue. Проблема в том, что состояние и значение имеют разные типы. Может быть, я могу сделать один общий метод с параметром T (и T будет первым аргументом этого метода) – snoward

+0

@MikhailPliskovsky - Я предполагал, что код, на который ссылается '// какая-то работа', был тем же и что вы 'd refactor, не обязательно тесты. – ChrisF

ответ

0

Вы можете передать функцию для условия. Передача в Элементе, поскольку я предполагаю, что вам это нужно для обработки.

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

Использование:

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

Вы можете сделать это без анонимных функций тоже:

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

Использование:

//for state 
CheckElement(element, myState); 
//or 
//for value 
CheckElement(element, value: myValue); 
Смежные вопросы