2009-07-14 2 views
3

Каков наилучший способ повторного использования логики коммутатора. У меня есть этот оператор switch, который продолжает отображаться в моем коде. Вместо этого скопируйте его, я хотел бы сделать функцию, которая вызывает других делегатов и передает этих делегатов в качестве параметров.reusing switch statement logic

Или есть лучший способ?

Функция 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

Вы также мог бы иметь словарь (или Func вместо действий) или что-то подобное (с учетом ваших функций имеют сходную подпись) , Тогда вы могли бы вместо того, чтобы использовать переключатель, вы могли бы иметь что-то вроде:

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.

+0

+1 для методов, управляемых таблицами. Ch.18 of Code Complete –

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

Извините @Svish, я уверен, что вы будете бить меня в следующий раз. Это было раньше. :) –

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