В чем разница между стилями K & R и One True Brace Style (1TBS)?

48

Я читал статью в Википедии о стилях отступов , но до сих пор не понимаю. В чем разница между K & R и 1TBS?

GavinR
источник
Я где-то читал, что стиль в K & R регулируется пространственными соображениями - то есть, чтобы уменьшить вертикальное пространство, занятое кодом в книге.
ChrisF
@ChrisF также уменьшает вертикальное пространство на экране. Когда у нас были линейные терминалы 80 х 25, это того стоило!
Мартин Беккет
7
«Goto Fail» от Apple - отличный пример серьезной ошибки, которую, несомненно, можно было бы предотвратить с помощью 1TBS: imperialviolet.org/2014/02/22/applebug.html
4
Ошибку Apple также можно было предотвратить, поместив оператор в одну строку, вычитав корректуру, используя программу проверки мертвого кода или язык, чувствительный к отступам.
Сис Тиммерман
1
@CeesTimmerman, .. или с тестами ...
thoni56

Ответы:

76

Самая большая разница между K & R и Единым Истинным Brace Style (1TBS) является то , что в 1TBS, все if, else, whileи forутверждения имеет открытие и закрытие скобки, даже если они не нужны. Цель состоит в том, чтобы упростить вставку новых утверждений и точно знать, как они будут сгруппированы.

В качестве примера:

К & Р:

int i;
for (i = 0; i < 10; i++)
  printf("Hi.");

1TBS:

int i;
for (i = 0; i < 10; i++) {
  printf("Hi");
}
Томас Оуэнс
источник
20

K & R выглядит так:

if (x) 
    a();
else {
    b();
    c();
}

То есть: фигурные скобки используются только там, где это необходимо, открывающая скобка на той же строке, что и управляющий оператор, закрывающая скобка на своей собственной строке.

«Один истинный стиль скобок» (1TBS или OTBS) превращает один контролируемый оператор в составной оператор, заключая его в фигурные скобки:

if (x) {
    a();
} else {
    b();
    c();
}

Стиль Allman идет немного дальше, чем 1TBS, и вводит вертикальный интервал, также помещая открывающую скобку на линию:

if (x) 
{
    a();
}
else 
{
    b();
    c();
}

Редактировать:

Я все еще пытаюсь выяснить, как именно можно назвать «высокомерным», чтобы сказать: «Деннис Ритчи был чрезвычайно умным парнем, который не только изобрел хороший язык, но и придумал действительно хороший стиль скобок».

Для тех, кто настаивает на том, что это все равно высокомерно, вот небольшая проблема: зайдите в Sourceforge, Github (и т. Д.) И выберите проекты, используя стиль скобок K & R. Просмотрите их записи об ошибках и фиксациях и попытайтесь найти одну ошибку, вызванную стилем фигурных скобок, который они использовали.

Если вы не хотите выполнять такую ​​большую работу, попробуйте выполнить простой статистический анализ. Сравните проекты, использующие разные стили фигурных скобок, и посмотрите, можете ли вы показать «бимодальность» - статистически значимое различие в количестве ошибок (серьезность и т. Д.), Которое коррелирует со стилем фиксации.

Я проделал оба эти действия несколько лет назад и не смог найти ни одной ошибки, которую можно было бы отнести к связующим стилям, и не смог найти ничего, приближающегося к статистически значимой корреляции между ними. В среднем, те , которые используют K & R распорка была немного меньше ошибок, но разница была намного слишком мал , чтобы квалифицировать в качестве статистически значимой.

Поскольку он был поднят, я прокомментирую ситуацию с макросами с несколькими утверждениями. Макрос, который включает в себя несколько операторов, но сам не заключает их в фигурные скобки, содержит ошибку. Моя работа не в том, чтобы писать код, который скрывает эту ошибку. Наоборот, моя работа состоит в том, чтобы найти и устранить эту ошибку как можно быстрее.

Написание кода в надежде скрыть ошибки, чтобы они оставались недиагностированными и не исправленными, - это просто зло. Называйте это высокомерным, если хотите, но я не считаю это даже близким к обсуждению. Ошибки должны быть найдены и исправлены, а не скрыты. Чем дольше они существуют, тем больше вероятность того, что их станет намного сложнее и дороже исправить.

Джерри Гроб
источник
1
Удалил все комментарии, так как они сошли на споры и шум. Если у вас есть действительный пункт, то опубликуйте его как ответ. Если вы хотите обсудить это, поговорите с ним
ChrisF
8
Разве 1TBS не помещает} и еще в одну строку? Сохранение вертикального пространства при сохранении поразительной красивой симметрии - это главное!
Мартин Беккет
4
@ Джерри - ну, любая хорошая священная война нуждается в нескольких расколах ;-)
Мартин Беккет,
6
Перейти к провалу; Перейти к провалу;
Джейми Пэйт
9
Да, чтобы прокомментировать комментарий @ JamiePate, который является ошибкой Apple SSL, которая анализируется здесь . За ним следует ifоператор с отступом, и, таким образом, они оба выполняются условно. Но здесь нет брекетов! Второе утверждение действительно за ifи всегда будет выполнено, таким образом, ошибка.
Колин Д. Беннетт
9

Проблема, как правило, в стиле KR Brace заключается в рефакторинге кода. При перемещении кода легко пропустить, что вокруг чего-то нет скобок, переместить его неправильно (или переместить что-то под ним, думая, что оно выполнено условно), а затем либо почесать голову, когда что-то больше не работает, либо испытать неудачу и оказаться в область кода плохо проверена, и ошибка остается незамеченной, пока черная шляпа не найдет способ ее использовать. Быстрый переход в отладчик легко находит проблему, если вы заметили это, но если вы этого не сделаете ...

Джастин Суонхарт
источник
2
это, кажется, просто повторяет сказанное и объясненное в предыдущих ответах
комнат
1
Я не думаю, что другие ответы точно объясняют, как проблема возникает в повседневном коде. Они объясняют, что такое OTB, но не объясняют, почему это действительно важно. Комментарии могут касаться этого, но не ответы.
Джастин Суонхарт