Jaka jest różnica między stylami K&R a stylami One True Brace Style (1TBS)?

48

Przeczytałem artykuł w Wikipedii na temat Stylów wcięć , ale nadal nie rozumiem. Jaka jest różnica między K&R a 1TBS?

GavinR
źródło
Czytałem gdzieś, że stylem w K&R rządzą względy dotyczące przestrzeni - tj. W celu zmniejszenia przestrzeni w pionie kod zajął w książce.
ChrisF
@ChrisF zmniejsza również pionową przestrzeń na ekranie. Gdy mieliśmy 80 linii x 25 terminali liniowych, było warto!
Martin Beckett,
7
„Goto fail” firmy Apple jest doskonałym przykładem poważnego błędu, któremu z pewnością można by zapobiec za pomocą 1TBS: imperialviolet.org/2014/02/22/applebug.html
4
Błądowi Apple'a można było również zapobiec poprzez umieszczenie instrukcji w jednym wierszu, korektę, użycie sprawdzania martwego kodu lub użycie języka wrażliwego na wcięcia.
Cees Timmerman
1
@CeesTimmerman, .. lub po testach ...
thoni56

Odpowiedzi:

76

Największą różnicą między K & R i Jedynego Prawdziwego Podpora Style (1TBS) jest to, że w 1TBS, wszystko if, else, while, i foroświadczenia mają szelki otwarcia i zamknięcia, nawet jeśli nie są konieczne. Celem jest ułatwienie wstawiania nowych instrukcji i dokładna znajomość ich grupowania.

Jako przykład:

K&R:

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

1 TB:

int i;
for (i = 0; i < 10; i++) {
  printf("Hi");
}
Thomas Owens
źródło
20

K&R wygląda tak:

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

To znaczy: nawiasy klamrowe używane tylko w razie potrzeby, otwieranie nawiasu klamrowego w tym samym wierszu co instrukcja sterująca, zamykanie nawiasu klamrowego we własnej linii.

„Jeden prawdziwy styl nawiasów klamrowych” (1TBS lub OTBS) zmienia pojedynczą instrukcję sterowaną w instrukcję złożoną, umieszczając ją w nawiasach klamrowych:

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

Styl Allmana idzie nieco dalej niż 1 TB i wymusza pionowe odstępy, umieszczając również nawias otwierający na linii:

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

Edytować:

Wciąż próbuję dowiedzieć się, jak to się kwalifikuje jako „arogancki”, mówiąc: „Dennis Ritchie był wyjątkowo mądrym facetem, który nie tylko wynalazł dobry język, ale także wymyślił naprawdę dobry styl ortezy”.

Dla tych, którzy twierdzą, że i tak jest arogancki, oto małe wyzwanie: przejdź do Sourceforge, Github (itp.) I wybierz projekty w stylu klamrowym K&R. Przejrzyj ich zapisy błędów i zatwierdzeń i spróbuj znaleźć pojedynczy błąd, który został spowodowany przez używany przez nich styl nawiasów klamrowych.

Jeśli nie chcesz wykonywać tak dużo pracy, spróbuj wykonać prostą analizę statystyczną. Porównaj projekty przy użyciu różnych stylów stężeń i sprawdź, czy możesz pokazać „bimodalność” - statystycznie istotną różnicę w liczbie błędów (dotkliwość itp.), Która koreluje ze stylem stężeń.

Zrobiłem to kilka lat temu i nie mogłem znaleźć ani jednego błędu, który mógłbym przypisać stylom wzmacniającym, ani nie mogłem znaleźć niczego zbliżającego się do statystycznie istotnej korelacji między nimi. Średnio osoby używające stężenia K&R miały nieco mniej błędów, ale różnica była zdecydowanie zbyt mała, aby można ją było uznać za statystycznie znaczącą.

Odkąd został przywołany, skomentuję sytuację za pomocą makr z wieloma instrukcjami. Makro, które zawiera wiele instrukcji, ale nie otacza ich nawiasami klamrowymi, zawiera błąd. Moim zadaniem nie jest pisanie kodu, który ukrywałby ten błąd. Wręcz przeciwnie, moim zadaniem jest jak najszybsze znalezienie i wyeliminowanie tego błędu.

Pisanie kodu w nadziei na zatuszowanie błędów, aby pozostały nierozpoznane i nierozwiązane, jest po prostu złem. Nazwij to aroganckim, jeśli chcesz, ale nie uważam tego za nawet blisko do negocjacji. Błędy należy znaleźć i naprawić, a nie ukryć. Im dłużej istnieją, tym bardziej prawdopodobne jest, że będą one trudniejsze i droższe do naprawienia.

Jerry Coffin
źródło
1
Usunąłem wszystkie komentarze, które doprowadziły do ​​kłótni i hałasu. Jeśli masz ważny punkt, opublikuj go jako odpowiedź. Jeśli chcesz porozmawiać, porozmawiaj
ChrisF
8
czy 1tbs nie stawia}, a jeszcze w jednym wierszu? Chodzi o oszczędność przestrzeni pionowej przy zachowaniu cudownej pięknej symetrii!
Martin Beckett,
4
@Jerry - cóż, każda dobra święta wojna potrzebuje kilku schizm; ;-)
Martin Beckett,
6
nie mogę; nie mogę;
Jamie Pate,
9
Tak, aby śledzić komentarz @ JamiePate dotyczący błędu Apple SSL, który jest analizowany tutaj . Po nim znajduje się ifinstrukcja z wcięciami, co sprawia, że ​​oba są warunkowo wykonywane. Ale nie ma nawiasów klamrowych! Drugie zdanie jest naprawdę poza ifi zawsze będzie wykonane, a więc błąd.
Colin D Bennett
9

Problemem ogólnie w stylu nawiasów klamrowych jest refaktoryzacja kodu. Podczas przenoszenia kodu łatwo jest przeoczyć, że nie ma wokół niego nawiasów klamrowych, przesuń go nieprawidłowo (lub przesuń coś pod nim, myśląc, że jest to warunkowo wykonane), a następnie albo podrap się po głowie, gdy coś już nie działa, albo bądź niefortunny i bądź w tym obszar kodu nie został dobrze przetestowany, a błąd pozostaje niezauważony, dopóki czarny kapelusz nie znajdzie sposobu na jego wykorzystanie. Szybka podróż do debugera z łatwością znajdzie problem, jeśli go zauważysz, ale jeśli nie ...

Justin Swanhart
źródło
2
wydaje się to jedynie powtórzyć punkt podany i wyjaśniony we wcześniejszych odpowiedziach
komnata
1
Nie sądzę, aby inne odpowiedzi dokładnie wyjaśniały, w jaki sposób problem pojawia się w codziennym kodzie. Wyjaśniają, czym jest OTB, ale nie dlaczego są tak ważne. Komentarze mogą rozwiązać ten problem, ale nie odpowiedzi.
Justin Swanhart