2009-07-14 20 views
3

スイッチロジックを再利用する最良の方法は何ですか?私は私のコードに表示され続けるこのswitch文を持っています。むしろコピーして貼り付けてください。他の代理人を呼び出し、これらの代理人をパラメータとして渡す関数を作成したいと思います。スイッチステートメントロジックの再利用

もっと良い方法がありますか?

機能1:

switch (test) 
     { 
      case "x": 
       DoSomethingX(); 
       break; 
      case "y": 
       DoSomethingY(); 
       break; 
      case "z": 
       DoSomethingZ(); 
       break; 
     } 

機能2:

switch (test) 
    { 
     case "x": 
      DoSomethingXxxx(); 
      break; 
     case "y": 
      DoSomethingYyyy(); 
      break; 
     case "z": 
      DoSomethingZyyy(); 
      break; 
    } 
+0

詳細については、当社にお問い合わせください。スイッチのどの部分が不変であるか?ケース自体、またはアクションだけ?あなたがスイッチを入れている変数はどうですか?それは同じですか、それとも変わりますか? –

+0

彼は事件が不変だと言っているように聞こえるのですが、行動は変わります...しかし、もっと詳細が必要です。 – Dave

+0

ケースは同じ動作を維持します – zachary

答えて

9

あなたはまた、辞書(または代わりに、アクションの機能)またはそのような何かを持っている可能性が(あなたの機能は、同様の署名を持って考えます) 。

public class MyClass 
{ 
    Dictionary<string, Action> myDictionary; 

    public MyClass() 
    { 
     BuildMyDictionary(); 
    } 

    private Dictionary<int, Action<int, int>> BuildMyDictionary() 
    { 
     myDictionary.Add("x", DoSomethingX); 
     myDictionary.Add("y", DoSomethingY); 
     myDictionary.Add("z", DoSomethingZ); 
     myDictionary.Add("w", DoSomethingW); 
    } 


    public void DoStuff() 
    { 
     string whatever = "x"; //Get it from wherever 
     //instead of switch 
     myDictionary[t](); 
    } 
} 

は、私は同様の例と同様の質問に答え here:次に、あなたの代わりにスイッチを使用して、あなたのようなものを持っている可能性があります。

また、switch文で文字列の代わりにenumsを使用してみてください。

+0

+1テーブル駆動型メソッドの場合ch.18コード完成 –

4

インターフェイスの異なる実装を使用してこれをリファクタリングできるかどうかを確認してください。

public interface Test { 
    void DoSomething(); 
} 

public class TestX : Test { 
    void DoSomething() { 
    } 
} 

public class TestY : Test { 
    void DoSomething() { 
    } 
} 

public class TestZ : Test { 
    void DoSomething() { 
    } 
} 


void func(Test test) { 
    test.DoSomething(); 
} 
+1

* sigh *あなたは私にそれを打つ!ほとんど完了しました:p – Svish

+0

すみません@スヴィッシュ、私はあなたが次回に私を打つだろうと確信しています。それは以前に起こったことです。 :) –

0

私はあなたの質問を理解しようとして、私は次のように行くかもしれない:

public enum Test{ 
    X, Y, Z 
} 

/** 
* test function call 
* @a_Test - enumeration class for Test 
*/ 
public void test(Test a_Test){ 
switch(a_Test){ 
    case X: 
     x(); 
     break; 
    case Y: 
     y(); 
     break; 
    case Z: 
     z(); 
     break; 
}//switch 
}//test 

私はそれが役に立てば幸い。

Tiger