Каков наилучший / самый простой способ использовать вложенные операторы switch / case? - PullRequest
0 голосов
/ 30 января 2009

Как лучше использовать следующие два оператора switch / case?

Есть ли более простой способ (меньше кода) сделать это?

switch (myValue)
{
    case 1:
    {
        methodFor1();

        break;
    }
    case 2:
    case 3:
    {
        methodFor2or3();

        if (myValue == 2)
                methodFor2();

        if (myValue == 3)
                methodFor3();

        break;
    }
}

...or...

switch (myValue)
{
    case 1:
    {
        methodFor1();

        break;
    }
    case 2:
    case 3:
    {
        methodFor2or3();

        switch (myValue)
        {
            case 2:
            {
                methodFor2();

                break;
            }
            case 3:
            {
                methodFor3();

                break;
            }
        }

        break;
    }
}

Ответы [ 8 ]

8 голосов
/ 30 января 2009
switch (myValue)
{
  case 1:
    methodFor1();
    break;
  case 2:
    methodFor2or3();
    methodFor2();
    break;
  case 3:
    methodFor2or3();
    methodFor3();
    break;
}

Почему все хлопоты только для того, чтобы избежать повторения methodFor2or3() один раз ?

3 голосов
/ 30 января 2009

Еще одна альтернатива:

switch (myValue)
{
    case 1:
    {
        methodFor1();
        break;
    }
    case 2:
    {
        methodFor2or3();
        methodFor2();
        break;
    }
    case 3:
    {
        methodFor2or3();
        methodFor3();
        break;
    }
}
2 голосов
/ 30 января 2009

Поскольку функции являются объектами первого класса в actionscript3, вы можете создать хэш значений для функций, например:

var myDict:Dictionary = new Dictionary(); 
myDict[1] = methodFor1; 
myDict[2] = methodFor2;


function handleStuff(myVal:Number):void{
    var myFunction:Function = myDict[myVal];
    myFunction();
}

надеюсь, это поможет!

1 голос
/ 30 января 2009

При программировании операторов switch я стараюсь, чтобы в каждом случае было не более одной строки кода + a break;. Это потому, что switch может быстро стать большим и сложным, а мой мозг плохо разбирается.

Итак, в вашем случае я бы написал:

switch (myValue)
{
    case 1:
    {
        methodFor1();
        break;
    }
    case 2:
    {
        methodFor2();
        break;
    }
    case 3:
    {
        methodFor3();
        break;
    }
}

, а затем сделайте methodFor2 и methodFor3 каждый вызов methodFor2or3.

0 голосов
/ 30 января 2009

Я отвечаю, предполагая, что вы знаете, что приведенный вами пример придуман и лучше написан другими способами. Если вы просто хотите узнать, лучше ли вкладывать коммутаторы или использовать if-else внутри коммутатора, это полностью зависит от вкуса и конкретной ситуации.

По моему мнению, тот факт, что ваш блок находится внутри коммутатора, не имеет значения. Если логика будет лучше обслуживаться коммутатором, используйте коммутатор (вложенный или нет). Если это будет лучше обслуживать if-else, используйте это.

0 голосов
/ 30 января 2009

Когда вы сталкиваетесь с проблемами программирования, «меньше кода» на самом деле не является атрибутом, который вы хотите оптимизировать. Со структурными проблемами гораздо лучше склонить код к тому, чтобы он был простым и читабельным.

Таким образом, для вышеизложенного первый вариант неплох, хотя случай «сквозного» для 2 можно легко пропустить. Лучше просто сделать родительский переключатель на 1 или 2, а затем во втором случае вызвать другую функцию, которая обрабатывает подслучаи (формально 2 и 3), и сделать это управляемым другой (подслучайной) переменной убедитесь, что вы не перегружаете значение исходного значения переменной.

С философской точки зрения все три случая являются частью одного и того же коммутатора, ИЛИ это не так. Если они есть, то к ним следует относиться одинаково (и неотличимо друг от друга). Если это не так, тогда они должны управляться двумя отдельными переменными и обрабатываться в двух отдельных функциях. Попытка сохранить пропускную способность путем их объединения усложняет задачу.

Paul.

0 голосов
/ 30 января 2009

Как насчет чего-то более похожего:

var method:String = "methodFor" + String(value);
this[method]();
if (value == 3) methodFor2or3();

Вы можете подумать о разделении вызова or3, если вам нужен более простой код:

switch (value) {
    case 1: methodFor1(); break;
    case 2: methodFor2(); break;
    case 3: methodFor3(); break;
}
if (value == 2 || value == 3) methodFor2or3();
0 голосов
/ 30 января 2009

Если между этими двумя случаями есть только одна (довольно простая) строка (как вызов функции в вашем примере), то я предпочитаю удвоить эту строку только для лучшей читаемости. В противном случае это вопрос вкуса. Я предпочитаю if условия внутри case операторов, потому что таким образом вы не можете перепутать различные уровни.

...