У меня есть довольно длинный оператор 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
?
Если specialVariable не используется после блока переключения, объявите его в блоке case.
Как правило, переменные следует объявлять в минимально возможной области, в которой они будут использоваться.
Да, определяйте переменные в самой узкой необходимой области.
Таким образом, пример 1 является предпочтительным.
Мое собственное правило для операторов switch состоит в том, что внутри каждого case должно быть максимум один оператор, за исключением разрыва. Это означает, что оператор является либо инициализацией, либо присвоением, либо вызовом функции. Помещение более сложного кода в ящик - это рецепт катастрофы - я «с любовью» вспоминаю весь код Windows, который я видел (вдохновленный Петцольдом), который обрабатывал параметры сообщения в режиме онлайн в том же случае, что и процедура Windows.
Итак, вызовите функцию и поместите туда переменную!
Если оператор switch
становится неуправляемо огромным, можно преобразовать его в таблицу указателей функций. Имея код для каждого случая в отдельных функциях, вам не нужно беспокоиться об объявлении переменных и определениях.
Еще одно преимущество заключается в том, что вы можете поместить каждую функцию case
в отдельную единицу единицы трансляции. Это ускорит процесс сборки, скомпилизии только измененных case
.s. Также улучшает качество, изолируя изменения в их наименьшем объеме.
Я за
case X:
{
type var;
...;
}
break; // I like to keep breaks outside of the blocks if I can
Если там все становится слишком сложным и начинает мешать вам видеть весь переключатель / корпус как переключатель / корпус, то подумайте о том, чтобы переместить как можно больше в один. или две встроенные функции, которые вызываются кодом кейсов. Это может улучшить читаемость без дополнительных затрат на вызов функций.
Согласен с Максом - как можно меньшая область применения. Таким образом, когда следующему человеку понадобится обновить ее, ему/ей не нужно будет беспокоиться о том, используется ли переменная в других секциях оператора switch.