Отступ в корпусе переключателя
Я делаю много кода, читающего последние пару недель, и я начинаю думать, что я кодировал оператор switch (во всех c-подобных языках) неправильно. Переключатель и ключевые слова case выстроены в большинстве примеров, которые я вижу в дикой природе. Я всегда отступал от дел, которые мне помогли. Недостатком является то, что если у вас есть случай с условным выражением, фигурные скобки заканчиваются просмотром двух уровней отступов от внешнего переключателя; так что, возможно, НЕ отступая от случая, это правильно. Интересно посмотреть, что другие люди думают об этом стилевом вопросе.
Вот пример того, как я это делал (если мой вопрос должен быть более визуальным):
switch(keyCode) {
case TVKEY.KEY_EXIT:
// do something
case TVKEY.KEY_ENTER:
if(firstTest)) { // User chose to steal token
// do something
} else if(secondTest)) {
// other condition
} else {
// do else
}
break;
default:
// do default stuff
break;
}
Обратите внимание, что последний промежуточный кронштейн находится на двух уровнях от кронштейна закрывающего переключателя. Некорректное? Слишком суетливый?
Ответы
Ответ 1
Итак, в основном вы спорите между
switch(x) {
case 1: if (something) {
}
case 2: if (other) {
}
}
и
switch (x) {
case 1: if (something) {
}
case 2: if (other) {
}
}
лично я предпочитаю первый, даже если он делает вещи с надписью. По крайней мере, это делает содержимое переключателя лучше.
ETA:
Итак, вы добавили образец. Я все еще говорю, что чрезмерное отступы предпочтительнее из-за визуальной ясности того, что принадлежит.
Конечно, отступы могут/будут вызывать священные войны: вкладки/пробелы? вкладки останавливаются на 4 символа? 8 символов? Вилка? Ложка?
Ответ 2
Предпочитаю, чтобы начало case
начиналось в том же столбце, что и switch
.
Мои причины в два раза:
-
Отступ кода не является чрезмерным.
-
Он отражает структуру предложений if
, else if
, else
. Вероятно, каждый может подумать, что if
и else
должны быть выровнены, поскольку они являются частью логического управляющего кода отдельной условной конструкции. switch
и case
также явно являются частью логического управляющего кода для отдельной условной конструкции и для согласованности должны быть выровнены. В конце концов, конструкция switch-case
может быть переписана как конструктор if-else
, а при компиляции оба будут давать одинаковый код низкого уровня.
Ответ 3
Мои 2 цента, потому что я просто столкнулся с проблемой и нашел решение, которое мне нравится, чтобы поделиться =)
switch (mode)
{
case Value1:
{
Ptr_t ptr1 = ...;
return ptr1;
}
case Value2:
{
Ptr_t ptr2 = ...;
return ptr2;
}
default:
{
return nullptr;
}
}
объяснение:
-
Иногда вам приходится раскрывать блоки case в похвалах, чтобы объявлять в нем локальные переменные. (Ошибка объявить переменную после case
, поскольку ключевое слово не определяет область отдельно. Ну, это не вопрос). Я выбираю, чтобы охватить все, чтобы независимо от содержания дела, все всегда согласовано.
-
Считываемость! Мне очень ясно, что происходит здесь, так что это действительно хороший момент. Есть некоторые ненужные отступы, но кто заботится, когда он улучшает читаемость?
-
Ориентация выравнивания case
и default
выглядит как другие структуры управления, поэтому это не удивительно для новых читателей.
Это не фактический/окончательный ответ, просто личный выбор.
Ответ 4
Мы нашли решение, наиболее подходящее для нас. Ключевое слово case отступов (и по умолчанию это тоже относится, на самом деле это относится и к общедоступным, защищенным и закрытым) с помощью единого пространства (применяется к предпочтениям вставки вкладок или пробелов). Это, кажется, дает лучшее из обоих миров.
Единственный недостаток, который я нашел до сих пор: кажется, что инструмент автоматического декорирования не найден, сделайте так.
Вот как код вопроса будет выглядеть как
switch (keyCode) {
case TVKEY.KEY_EXIT: // indented by one space against switch
// do something
case TVKEY.KEY_ENTER:
if (firstTest) { // indented by one tab sizes against switch
// do something
} else if (secondTest) {
// other condition
} else {
// do else
}
break; // empty line visualize block, so you know code is not passing to next case
default:
// do default stuff
break;
}