Яка різниця між стилями K&R та One True Brace Style (1TBS)?


48

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


Десь я читав, що стиль K&R керується просторовими міркуваннями - тобто зменшити вертикальний простір, який зайняв код у книзі.
ChrisF

@ChrisF також зменшує вертикальний простір на екрані. Коли у нас було 80 колодок х 25 лінійних терміналів, воно того варте!
Мартін Бекетт

7
"Goto fail" від Apple - чудовий приклад серйозної помилки, яку, безумовно, можна було б запобігти за допомогою 1TBS: imperialviolet.org/2014/02/22/applebug.html

4
Помилку Apple також можна було б уникнути, поставивши заяву в єдиний рядок, вичитуючи коректуру, використовуючи перевірку мертвих кодів або використовуючи мову, чутливу до відступу.
Cees Timmerman

1
@CeesTimmerman, .. або маючи тести ...
thoni56

Відповіді:


76

Найбільша різниця між K & R і Єдиним Справжнім Brace Style (1TBS) є те , що в 1TBS, все if, else, whileі forзатвердження має відкриття і закриття дужки, навіть якщо вони не потрібні. Мета - спростити вставлення нових висловлювань і точно знати, як вони будуть групуватися.

Як приклад:

K&R:

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 полягає в рефакторингу коду. Під час переміщення коду легко не помітити, що навколо чогось немає дужок, перенесіть його неправильно (або перемістіть щось під ним, думаючи, що це умовно виконується), а потім або почухайте голову, коли щось більше не працює, або невдало і опинитися в область коду недостатньо перевірена і помилка залишається непоміченою, поки чорна шапка не знайде способу її використовувати. Швидка поїздка до налагоджувача легко знаходить проблему, якщо ви її помітили, але якщо ви цього не зробите ...


2
це, здається, просто повторює пункт, зроблений та пояснений у попередніх відповідях
gnat

1
Я не думаю, що інші відповіді точно пояснюють, як виникає проблема у повсякденному коді. Вони пояснюють, що таке ОТБ, але не чому це насправді важливо. Коментарі можуть вирішувати це, але не відповіді.
Джастін Сванхарт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.