Действительно ли это - хорошая идея определить переменную в локальном блоке для случая оператора переключения?

У меня есть довольно длинный оператор case оператора switch. Некоторые случаи действительно коротки и тривиальны. Некоторые длиннее и нуждаются в некоторых переменных, которые никогда не используются больше нигде, как это:

switch (action) {
    case kSimpleAction:
        // Do something simple
        break;
    case kComplexAction: {
        int specialVariable = 5;
        // Do something complex with specialVariable
      } break;
}

Альтернатива должна была бы объявить что переменная перед входом switch как это:

int specialVariable = 5;
switch (action) {
    case kSimpleAction:
        // Do something simple
        break;
    case kComplexAction:
        // Do something complex with specialVariable
        break;
}

Это может стать довольно сбивающим с толку, так как это не ясно который case переменная принадлежит, и она использует некоторую ненужную память.

Однако я никогда не видел это использование больше нигде.
Вы думаете, что это - хорошая идея объявить переменные локально в блоке для сингла case?

5
задан niton 21 April 2015 в 00:23
поделиться

6 ответов

Если specialVariable не используется после блока переключения, объявите его в блоке case.

Как правило, переменные следует объявлять в минимально возможной области, в которой они будут использоваться.

11
ответ дан 18 December 2019 в 07:28
поделиться

Да, определяйте переменные в самой узкой необходимой области.

Таким образом, пример 1 является предпочтительным.

3
ответ дан 18 December 2019 в 07:28
поделиться

Мое собственное правило для операторов switch состоит в том, что внутри каждого case должно быть максимум один оператор, за исключением разрыва. Это означает, что оператор является либо инициализацией, либо присвоением, либо вызовом функции. Помещение более сложного кода в ящик - это рецепт катастрофы - я «с любовью» вспоминаю весь код Windows, который я видел (вдохновленный Петцольдом), который обрабатывал параметры сообщения в режиме онлайн в том же случае, что и процедура Windows.

Итак, вызовите функцию и поместите туда переменную!

1
ответ дан 18 December 2019 в 07:28
поделиться

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

Еще одно преимущество заключается в том, что вы можете поместить каждую функцию case в отдельную единицу единицы трансляции. Это ускорит процесс сборки, скомпилизии только измененных case.s. Также улучшает качество, изолируя изменения в их наименьшем объеме.

3
ответ дан 18 December 2019 в 07:28
поделиться

Я за

   case X:
   {
      type var;
      ...;
   }
   break; // I like to keep breaks outside of the blocks if I can

Если там все становится слишком сложным и начинает мешать вам видеть весь переключатель / корпус как переключатель / корпус, то подумайте о том, чтобы переместить как можно больше в один. или две встроенные функции, которые вызываются кодом кейсов. Это может улучшить читаемость без дополнительных затрат на вызов функций.

2
ответ дан 18 December 2019 в 07:28
поделиться

Согласен с Максом - как можно меньшая область применения. Таким образом, когда следующему человеку понадобится обновить ее, ему/ей не нужно будет беспокоиться о том, используется ли переменная в других секциях оператора switch.

1
ответ дан 18 December 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: