2016-04-13 14 views
0

クラスを単純化する最も良い方法は、ほぼ同じような作業を行う2つのメソッドが含まれています。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クラスのオブジェクトには、異なるタイプの2つのフィールドがあります。重複したコードを削除する最良の方法は何ですか?

+1

移動方法に最初に出現し、その後、 2番目(および後続)のオカレンスの代わりにメソッドを呼び出します。 – ChrisF

+0

@ChrisFでは、このメソッドは1つではなく別々に呼び出されます。コマンドが1つのタイプの場合、CheckStateは別のCheckValueを呼び出します。 問題は、状態と値が異なるタイプであることです。 パラメータTを持つ汎用メソッドを1つ作ることができます(そして、Tがこのメソッドの最初の引数になります)。 – snoward

+0

@MikhailPliskovsky - 私は '// some work'で書かれたコードが同じで、リファクタ、必ずしもテストではありません。 – 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); 
関連する問題