Оператор переключения внутри оператора переключения? - PullRequest
19 голосов
/ 23 мая 2011

Я должен оценить многие условия. В моем случае я должен сделать что-то вроде этого:

switch(id)
{
    case 5:
         // switch some other cases here
    case 6:
         // set some value
    ...
 }

Является ли хорошей практикой иметь другой переключатель в случае 5? Если нет, то что лучше? Имея там if заявлений?

Ответы [ 8 ]

19 голосов
/ 23 мая 2011

Я бы вызвал функцию, специфичную для случая 5, а затем включил бы случай переключения в этой функции. Например:

switch(id)
{
    case 5:
         functionFiveSpecific(id);
    case 6:
         // set some value
    ...
 }

Функция, специфичная для случая 5:

private void functionFiveSpecific(id)
{
   // other switch in here
}

Несмотря на то,

Настоятельно рекомендуется избегать использования операторов switch, если это возможно. Прочитайте здесь .

7 голосов
/ 23 мая 2011

Избегайте!

Попробуйте реорганизовать ваш код, чтобы исключить случаи переключения. Операторы переключения для поведения могут быть реорганизованы в шаблон стратегии.

Strategy Pattern](![Strategy Pattern

7 голосов
/ 23 мая 2011

Единственное, что может быть не в порядке, это то, что это может ухудшить читабельность:

switch(id)
{
    case 5:
    {
        switch (somethingElse)
        {
            case 1:
                // blah...
        }
    }
    case 6:
         // set some value
    ...
}

Вы можете улучшить это, переместив вложенный раздел в метод:

switch(id)
{
    case 5:
        Foo();
        break;
    case 6:
         // set some value
    ...
}
6 голосов
/ 23 мая 2011

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

switch (order.Status)
{
    case OrderStatus.New: 
        // Do something to a new order;
        break;

    ...

    case OrderStatus.ReadyToShip
        // Process Shipping Instructions
        ShipOrder(order);
        break;
}

, а затем, если у вас был переключатель, основанный на типе доставки, оплаченном за

void ShipOrder(Order order)
{
    switch (order.ShippingMethod)
    {
    }
}

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

6 голосов
/ 23 мая 2011

Операторы Switch не являются плохой практикой.Вложенные операторы switch могут выглядеть беспорядочно.

Возможно, стоит подумать о встраивании вложенного оператора switch в другой метод для улучшения ясности.

5 голосов
/ 23 мая 2011

Лучшей практикой является инкапсулирование разного поведения в разных классах в разных классах и попытка по возможности избегать операторов switch.

Это не всегда возможно, и если вы должны использовать операторы switch, я бы не помещал другой вложенный оператор switch (или набор операторов if), но, вероятно, имел бы вызов метода, который содержал бы эту логику.

Если вы опубликуете немного больше информации о том, что вы пытаетесь сделать, мы могли бы предложить лучшие предложения.

2 голосов
/ 23 мая 2011

Используйте Полиморфизм, если это возможно. Это сделает ваш код намного чище.

1 голос
/ 23 мая 2011

Я бы вызвал функцию и передал бы в дополнительных случаях и в функции сделал бы переключение на них.Делает чище код.Другой метод, который я часто использую, действительно является вложенным, если

...