Я читал статью в Википедии о стилях отступов , но до сих пор не понимаю. В чем разница между K & R и 1TBS?
Я читал статью в Википедии о стилях отступов , но до сих пор не понимаю. В чем разница между K & R и 1TBS?
Ответы:
Самая большая разница между 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");
}
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 распорка была немного меньше ошибок, но разница была намного слишком мал , чтобы квалифицировать в качестве статистически значимой.
Поскольку он был поднят, я прокомментирую ситуацию с макросами с несколькими утверждениями. Макрос, который включает в себя несколько операторов, но сам не заключает их в фигурные скобки, содержит ошибку. Моя работа не в том, чтобы писать код, который скрывает эту ошибку. Наоборот, моя работа состоит в том, чтобы найти и устранить эту ошибку как можно быстрее.
Написание кода в надежде скрыть ошибки, чтобы они оставались недиагностированными и не исправленными, - это просто зло. Называйте это высокомерным, если хотите, но я не считаю это даже близким к обсуждению. Ошибки должны быть найдены и исправлены, а не скрыты. Чем дольше они существуют, тем больше вероятность того, что их станет намного сложнее и дороже исправить.
if
оператор с отступом, и, таким образом, они оба выполняются условно. Но здесь нет брекетов! Второе утверждение действительно за if
и всегда будет выполнено, таким образом, ошибка.
Проблема, как правило, в стиле KR Brace заключается в рефакторинге кода. При перемещении кода легко пропустить, что вокруг чего-то нет скобок, переместить его неправильно (или переместить что-то под ним, думая, что оно выполнено условно), а затем либо почесать голову, когда что-то больше не работает, либо испытать неудачу и оказаться в область кода плохо проверена, и ошибка остается незамеченной, пока черная шляпа не найдет способ ее использовать. Быстрый переход в отладчик легко находит проблему, если вы заметили это, но если вы этого не сделаете ...