повторное использование логики оператора switch - PullRequest
3 голосов
/ 14 июля 2009

Каков наилучший способ повторного использования логики переключения. У меня есть этот оператор 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;
    }

Ответы [ 3 ]

9 голосов
/ 14 июля 2009

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

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]();
    }
}

Я ответил на аналогичный вопрос здесь с похожим примером.

Кроме того, попробуйте использовать перечисления вместо строк в вашем операторе switch.

4 голосов
/ 14 июля 2009

Посмотрите, можете ли вы выполнить рефакторинг, используя интерфейс и различные реализации интерфейса.

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();
}
0 голосов
/ 14 июля 2009

Поскольку я пытаюсь понять ваш вопрос, я могу перейти к следующему:

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

...