Отступ в корпусе переключателя

Я делаю много кода, читающего последние пару недель, и я начинаю думать, что я кодировал оператор 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;

}