Чому дивний відступ на операторах перемикача?


77

Чому в imho відсутній відступ "case" - ключові слова в операторі switch вважаються хорошим стилем?

Здається, жоден відступ ключового слова "case" не є варіантом форматування за замовчуванням приблизно в кожній IDE:

switch (i){
case 0:
    break;
case 1:
    break;
}

тоді як я вважаю цей формат більш інтуїтивним:

switch (i){
    case 0:
        break;
    case 1:
        break;
}

Чи є за цим якась логіка, яка мені ухиляється?


2
Не усвідомлював цього дотепер! Можливо, тому, що перемикач був винайдений до відступу))
Родіон

1
NB за замовчуванням перемикає відступ (і це також виглядає більш читабельним для мене)
barti_ddu



1
@gstackoverflow IDEA 15.0.5 це не робить для мене. Я хотів би, щоб це сталося. Я віддаю перевагу відступу, який відповідає логічним групуванням, і перемикач - це один логічний елемент, ефекти якого взагалі хочеться розглядати як одиницю. Таким чином, я хочу бачити це як одиницю (наприклад, з відступом). Я також прагну додати фігурні дужки навколо висловлювань для розділів справи також.
Гас,

Відповіді:


55

Корпуси логічно мічені. Багато людей розміщують мітки на тому самому рівні відступу, що і блок, в якому вони перебувають. На мою думку, таким чином легше читати текст.

Я порівнюю це з часовою шкалою, яку ви можете прокрутити. У вас є маркери на самій часовій лінії, не відступ від вмісту. Потім ви можете швидко вказати, де значки / маркери, не відводячи очей від базової лінії.


11
Іншими словами, вміст switchблоку відступає на один рівень від самого switchсебе, але cases "перевизначає" один рівень із коду, з яким вони змішані.
Steve Jessop

Я був на паркані з цього приводу, схиляючись до відступу, оскільки думав, що це трохи читабельніше. Ця відповідь, поряд із перевагою запобігання надмірному вдавленню / загортанню, змінили мою думку. Мислення випадків як ярликів, а не якби умови, здається, трохи сприяють читабельності, коли вони не мають відступу.
Pilot_51

2
Ці caseчастини діють як мітки в тому , що потік виконання буде проходити через ярлик з коду вище в коді нижче без break. Я все ще волію бачити їх з відступами. Без відступу він приховує, на моє око, саме switchтвердження, що ускладнює бачення початку справ. Але це справжня проблема лише тоді, коли випадків занадто багато і це ціла проблема.
Lee Meador

А як щодо пропозиції за замовчуванням? У Eclipse (Java) регістр комутатора за замовчуванням автоматично відступає, він не "розім'ятий", як у випадках. Я вважаю, що легка читабельність того, що відбувається у випадках за замовчуванням, дорівнює необхідності читабельності у визначених випадках.
Chexxor

1
Що робити, якщо у вас також є брекети для cases? Ви отримаєте 2 закриваючі дужки на одному рівні відступу на різних лініях.
Юліан Онофрей

28

4 словами: без блоків, без відступу .

Справи не відкривають блок. У C або C ++ ви навіть можете помістити оголошення змінних (але ініціалізатори не викликаються, за винятком статичних змінних, це підводний камінь) на початку блоку перемикання. Ви можете робити багато дивних речей switch, наприклад , пристрій Даффа .

Отже, оскільки регістри є лише мітками, відступ до них не здається інтуїтивно зрозумілим, а не відступ - це стиль, обраний більшістю стилів.


Я б не сказав, що це обов’язково мітки, оскільки ви можете сприймати їх як мітки та як синтаксичний цукор для послідовності if-elses. Хоча, оскільки вони виглядають як ярлики, то, можливо, відступ таким чином доречніший.
rodion

28
Я не думаю, що це правило описує розглянутий стиль. switchвводить блок, а caseні. І все ж, caseсхоже, він вводить новий рівень відступу, тоді як switchні.
Steve Jessop

1
@rodion: з точки зору складності реалізації комутатора C є O (1), а еквівалентні рядки if-else - O (n). if-else очікує, що за ним буде рівно одне твердження, а не регістр і т. д. Ви також можете знайти посилання на регістри як мітки в стандарті C (не перевіряв точну ціну, але я впевнений, що бачив це ).
kriss

@Steve: switchсам по собі не вводить блок. Це просто оператор блоку, який люди зазвичай використовують як залежний оператор, який вводить блок.
Йенс Густедт

1
@kriss: Усі автоматичні оголошення змінних є визначеннями. Вони просто не ініціалізовані. Немає шкоди вкладати ініціалізовані визначення змінних на початку комутатора, але ініціалізація ніколи не буде виконана, тому вона марна. Звичайно, визначення статичних змінних є дійсними на початку комутатора, незалежно від того, чи вони ініціалізовані.
R .. GitHub СТОП ДОПОМОГАЙ ЛЕД

11

Офіційні конвенції Oracle Code 1999 для мови програмування Java TM (розділ 7.8) рекомендують стиль перемикання, коли оператори регістру не мають відступу щодо викладу switch в цілому.

Це суб’єктивний вибір, але Sun вирішив, що краще, якщо всі дотримуватимуться одного стилю, і вибрав це.


Мда. Seig heil!
Рекс Дивний

4

На вибір є різні стилі відступу. AFAIK, жоден не вважається кращим стилем, ніж інші, якщо ви постійно використовуєте стиль відступу взагалі. Для мене, відступи caseетикетки є більш зручним для читання, то ж саме стосується private, protectedі publicетикеток в класах, однак, мій IDE не робитиме на відступи мого шляху. Мій код не такий читабельний, як я хотів би, щоб він був таким. Що ж, добре...


3
те саме для мене, я справді ненавиджу випадки, не поглиблені, програмував більше 20 років, але я також можу купити це суб'єктивна справа ...
rupps

4

Може, це зберегти той самий рівень відступу, що і його логічний еквівалент, виражений в ifатрибутах? Це:

switch(i){
case 0:
  //do something 1
case 1:
  //do something 2
}

Виглядав би схожим на логічний еквівалент:

if(i==0){
  //do something 1
}else if(i==1){
  //do something 2
}

2
Можливо, ні - перемикач / корпус, як правило, реалізується за допомогою стрибуної таблиці, а не змії if / else.
Йохан Котлінський

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.