Czy ktoś może rzucić wyzwanie wujkowi Bobowi z zamiłowania do usuwania „bezużytecznych aparatów ortodontycznych”?

94

Nie znoszę odwoływać się do płatnych treści, ale ten film pokazuje dokładnie to, o czym mówię. Dokładnie 12 minut w Robert Martin patrzy na to:

Trochę kodu

I mówi „Jedną z moich ulubionych rzeczy jest pozbycie się bezużytecznych aparatów ortodontycznych”, gdy zamienia to w to:

Więcej kodów

Dawno temu, w odległej edukacji, nauczono mnie, aby tego nie robić, ponieważ ułatwia wprowadzenie błędu, dodając kolejną wciętą linię, myśląc, że jest kontrolowany przez to, ifkiedy nie jest.

Aby być uczciwym wobec wuja Boba, refaktoryzuje długą metodę Java do niewielkich małych funkcji, które, jak się zgadzam, są o wiele bardziej czytelne. Kiedy skończy to zmieniać, (22.18) wygląda to tak:

Jeszcze więcej kodu

Zastanawiam się, czy to powinno potwierdzić usunięcie nawiasów klamrowych. Znam już najlepszą praktykę . Czy w tym miejscu wujek Bob może zostać zakwestionowany? Czy wujek Bob bronił tego pomysłu?

candied_orange
źródło
6
Głosuję za zamknięciem tego pytania jako nie na temat, ponieważ każda odpowiedź na to będzie „nie” lub „tak, a oto cytat”.
Blrfl,
35
Daj mu kilka lat, może też usunie niepotrzebny podział linii i „jeśli (zobacz (coś)) powie (coś);” rzeczywiście być wiersz kodu ;-)
Steve Jessop
8
@ SteveJessop Miło słyszeć, że jestem o wiele lat do przodu. : D Bez nowej linii nie ma ryzyka niesławnego błędu. Dodawanie / usuwanie nawiasów klamrowych w razie potrzeby stanowi dodatkowy narzut, ale o wiele więcej zostaje zapisanych podczas czytania.
maaartinus
9
Wujek Bob podaje kilka dobrych punktów za zrobienie tego w Czystym Kodzie, strona 35. Jeśli ifblok ma tylko jedną linię, nie ma to znaczenia. Jeśli potrzebujesz dodać więcej linii, powinna to być kolejna funkcja, która zmniejsza ifblok z powrotem do jednej linii (wywołanie funkcji). Jeśli zastosujesz się do tego, szelki po prostu nie mają znaczenia - wcale .
13
powinien to zrobić, return (page==null) ? "" : includePage(mode,page);jeśli tak bardzo lubi robić zwięzłe ... Myślałem, że styl bez nawiasów jest fajny, dopóki nie zacząłem profesjonalnie tworzyć aplikacji. Różny hałas, możliwe błędy literowe itp. Szelki, będąc tam przez cały czas, oszczędzają czas i koszty, które trzeba by wprowadzić później.
vaxquis

Odpowiedzi:

47

Czytelność to niemała rzecz.

Mam mieszany umysł, jeśli chodzi o aparaty ortodontyczne, które zawierają jedną metodę. Osobiście usuwam je dla takich rzeczy jak zwroty jednowierszowe, ale pozostawienie takich nawiasów klamrowych w rzeczywistości bardzo nas ugryzło w ostatnim miejscu, w którym pracowałem. Ktoś dodał wiersz ifinstrukcji do instrukcji bez dodawania niezbędnych nawiasów klamrowych, a ponieważ był to C, rozbił system bez ostrzeżenia.

Nigdy nie rzucam wyzwania nikomu, kto jest religijny, że zawsze używa aparatów ortodontycznych po tym małym fiasku.

Widzę więc korzyść z czytelności, ale doskonale zdaję sobie sprawę z problemów, które mogą pojawić się, gdy pominiesz te nawiasy klamrowe.

Nie zawracałbym sobie głowy próbą znalezienia badania lub czyjejś opublikowanej opinii. Każdy ma jedno (to znaczy opinia), a ponieważ jest to kwestia stylistyczna, jedna opinia jest tak samo dobra jak każda inna. Pomyśl sam o tym, oceń zalety i wady i zdecyduj się. Jeśli sklep, w którym pracujesz, ma standard kodowania obejmujący ten problem, po prostu postępuj zgodnie z tym.

Robert Harvey
źródło
7
Byłem tym trochę za niedawno, kiedy wcięcie było wyłączone i wprowadzało w błąd.
Andy
12
Ponieważ to było C bez GCC 6-Wmisleading-indentation .
wchargin
2
@CandiedOrange: To wujek Bob kwestionuje ustalony dogmat.
Robert Harvey
1
@RobertHarvey Czy nie wyjaśniłem tego? Tak, kwestionuje dogmat. On rzuca wyzwanie MOIM dogmatom. Po prostu staram się być dobrym uczniem i przynajmniej to rozważam. Ale wujek Bob jest tak charyzmatyczny, że zastanawiam się, czy tracę obiektywizm. Więc błagam o pomoc w znalezieniu antidotum, zanim wypiję koolaidę.
candied_orange
1
@CandiedOrange: To absolutnie kwestia kontekstu. Ci, którzy po prostu ślepo akceptują dogmat, nie biorą pod uwagę kontekstu; to oni nadal używają reguły „tylko jeden zwrot” w zarządzanych językach, długo po tym, jak reguła przestała być użyteczna i stała się przeszkodą.
Robert Harvey
133

Możesz znaleźć kilka opublikowanych promocji lub odrzuceń stylów bez nawiasów klamrowych tutaj lub tutaj lub wszędzie tam, gdzie malowane są szopy na rowery.

Odchodząc od wiosek rowerowych, pamiętasz świetny błąd SSL OS X / iOS z 2014 roku?

if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0)
    goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
    goto fail;
    goto fail;
if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
    goto fail;

Tak, „spowodowane” przez bloki no-brace https://www.imperialviolet.org/2014/02/22/applebug.html

Preferencje mogą zależeć od stylu nawiasu klamrowego. Gdybym musiał pisać

if (suiteSetup)
{
    includePage(mode, suiteSetup);
}

Mogę też chcieć oszczędzać miejsce. Ale

if (suiteSetup) {
    includePage(mode, suiteSetup);
}

używa tylko jednej „dodatkowej” linii.


Wiem, że nie pytałeś, ale jeśli pracuję sam, jestem heretykiem. Jeśli usunę aparat ortodontyczny, wolę

if (suiteSetup != null) includePage(mode, suiteSetup);

Nie ma tego samego problemu wizualnego jak błąd w stylu iOS SSL, ale zapisuje jeszcze więcej „niepotrzebnych” linii niż wujek Bob;) Czyta dobrze, jeśli jesteś do tego przyzwyczajony i ma zastosowanie w Ruby ( includePage(mode, suiteSetup) unless suiteSetup.nil?). No cóż, po prostu wiedz, że jest wiele opinii.

Paul Draper
źródło
13
Ponadto, jeśli używasz } else[if(...)] {, nie dodaje żadnych dodatkowych linii, więc stanowi tylko jedną dodatkową linię w całym tekście.
Random832
12
Cieszę się, że przywołałeś błąd SSL na iOS. Od tego czasu coraz częściej używam aparatów ortodontycznych w takich sytuacjach.
Zach Lipton
4
Jeśli chodzi o błąd „goto fail”, warto zauważyć, że inne aspekty stylu kodowania wuja Boba również mu ​​zapobiegły, a co najważniejsze, jego silna preferencja do wyjątkowo krótkich metod. Nigdy nie tolerowałby 79-liniowej metody, a gdyby metoda została rozbita na mniejsze (a) konflikt scalający, który spowodował duplikację, prawdopodobnie nigdy nie miałby miejsca oraz (b) prostsza kontrola przepływu w metodzie oznaczałoby to prawdopodobnie, że wygenerowane zostałyby ostrzeżenia kompilatora dotyczące nieosiągalnego kodu, które powinny zapobiec temu problemowi.
Jules
16
„goto fail” nie był spowodowany blokami jednowierszowymi, był spowodowany niechlujnym programowaniem, nawet przeglądem niechlujnego kodu, a nawet nie przez ręczne przejście przez kod.
gnasher729
35
Meh, brak aparatów ortodontycznych nie spowodował tego błędu. Tak zrobili przerażający programiści (i brak jakiejkolwiek sensownej recenzji kodu, testowania). Rozwiąż problem, strzelając do odpowiedzialnych, a nie przywiązując ręce reszty z nas!
Wyścigi lekkości na orbicie
62

Wujek Bob ma wiele warstw obrony przed takim błędem, które nie były tak powszechne, gdy dominującą mądrością było „zawsze używać aparatu ortodontycznego”:

  1. Silne osobiste preferencje dla warunkowych linii jednoliniowych, więc te wieloliniowe wyróżniają się i otrzymują dodatkową kontrolę.
  2. Edytor, który automatycznie przestaje działać po wstawieniu drugiego wiersza.
  3. Kompletny zestaw testów jednostkowych, które stale wykonuje.
  4. Kompletny zestaw testów integracyjnych.
  5. Recenzja przeprowadzona przed scaleniem jego kodu.
  6. Ponowne uruchomienie wszystkich testów przez serwer ciągłej integracji.
  7. Testy przeprowadzone przez dział jakości produktu.

Myślę, że gdyby ktoś opublikował wyzwanie wujkowi Bobowi, miałby całkiem niezłą odpowiedź na powyższe pytania. To jeden z najłatwiejszych błędów do wczesnego wykrycia.

Karl Bielefeldt
źródło
16
Nigdy nie bałam się awarii, tak jak boję się rzeczy, które zawodzą cicho. Przynajmniej wiesz, kiedy zdarza się awaria. Kiedy widzę te rzeczy, mrowi mnie grzbiet mózgu. Mrowi tak samo, jak kiedy widzę while(true);{break;}. Jeśli naprawdę jest to uzasadniony kontekst, zajmie mi to trochę czasu, aby się z tym pogodzić.
candied_orange
9
Czy mamy zautomatyzowany sposób sprawdzania, że includePage()nie jest to źle napisane makro z więcej niż jedną instrukcją?
Martin York
51
@LokiAstari Tak, nazywa się „Java nie ma makr”.
svick
11
Wszystkie powyższe są bardziej „sposobami na uniknięcie tego, że upadki związane z polityką„ bezużytecznych aparatów ortodontycznych ”mnie ranią” niż w rzeczywistości „powodami, dla których warto zastosować„ politykę bezużytecznych aparatów klamrowych ”. Fakty, których potrzebujesz (szczególnie # 1), powinny być traktowane bardziej jako wada, niż korzyść.
SJuan76
16
@Jules O tak! WSZYSTKIE produkty, które otrzymałem lub wydałem w pracy, są w 100% objęte testem (przynajmniej), są recenzowane (kilka razy), a wszystkie firmy mają działy kontroli jakości oprogramowania. Tak. Wydaje mi się, że znalazłeś to samo w swojej karierze zawodowej, ponieważ każda firma ma zespoły programistów zamiast pojedynczych programistów i daje im to więcej niż wystarczająco dużo czasu na wykonanie wszystkich testów, które chcieliby zrobić. Tak, to doskonale opisuje wszystkie miejsca pracy. Dlaczego warto się martwić dodaniem dodatkowych błędów, skoro jesteśmy pewni, że nasze oprogramowanie ZAWSZE dostarcza 100% błędów?
SJuan76
31

W przeważającej części jest to osobiste preferencje, jednak należy rozważyć kilka kwestii.

Możliwe błędy

Chociaż można argumentować, że błędy spowodowane przez zapomnienie o dodaniu nawiasów klamrowych są rzadkie, z tego, co widziałem , że zdarzają się od czasu do czasu (nie zapominając o słynnym błędzie IOS goto fail ). Myślę więc, że powinien to być czynnik przy rozważaniu twojego stylu kodu (niektóre narzędzia ostrzegają przed wprowadzającymi w błąd wcięciami , więc zależy to również od łańcucha narzędzi) .

Poprawny kod (który czyta się jak to może być błąd)

Nawet zakładając, że twój projekt nie cierpi z powodu takich błędów, podczas czytania kodu możesz zobaczyć pewne bloki kodu, które wyglądają, jakby mogły być błędami - ale nie biorą udziału w twoich cyklach mentalnych.

Zaczynamy od:

if (foo)
    bar();

Deweloper dodaje przydatny komentarz.

if (foo)
    // At this point we know foo is valid.
    bar();

Później programista rozwija się na nim.

if (foo)
    // At this point we know foo is valid.
    // This never fails but is too slow even for debug, so keep disabled.
    // assert(is_valid(foo));
    bar();

Lub dodaje zagnieżdżony blok:

if (foo)
    while (i--) {
        bar(i);
        baz(i);
    }

Lub używa makra:

if (foo)
    SOME_MACRO();

„... Ponieważ makra mogą definiować wiele linii kodu, czy makro używa do {...} while (0)wielu linii? Powinno tak być, ponieważ jest w naszym przewodniku po stylu, ale lepiej na wszelki wypadek to sprawdzić!”


Powyższe przykłady są poprawnymi kodami, jednak im więcej treści w bloku kodu, tym więcej trzeba przeczytać, aby upewnić się, że nie ma żadnych błędów.

Być może twój styl kodu określa, że ​​bloki wieloliniowe wymagają nawiasów klamrowych (bez względu na wszystko, nawet jeśli nie są kodem) , ale widziałem tego rodzaju komentarze dodawane w kodzie produkcyjnym. Kiedy ją czytasz, istnieje niewielka wątpliwość, że ktokolwiek ostatnio edytował te wiersze, zapomniał dodać nawias klamrowy, czasami czuję, że potrzeba podwójnego sprawdzenia działa zgodnie z przeznaczeniem (szczególnie podczas badania błędu w tym obszarze kodu) .

Zróżnicowany hałas

Jednym praktycznym powodem stosowania aparatów ortodontycznych do pojedynczych linii jest redukcja szumów różnicowych .

Oznacza to zmianę:

if (foo)
    bar();

Do:

if (foo) {
    bar();
    baz();
}

... powoduje, że linia warunkowa wyświetla się w różnicy, gdy jest zmieniana, co powoduje pewne małe, ale niepotrzebne obciążenie.

  • wiersze pokazują się jako zmienione w recenzjach kodu, jeśli twoje narzędzia różnicowania są oparte na słowach, możesz łatwo zobaczyć, że zmienił się tylko nawias klamrowy, ale sprawdzenie to zajmuje więcej czasu, a następnie, czy wiersz w ogóle się nie zmienił.
    Powiedziawszy to, nie wszystkie narzędzia obsługują diffing oparty na słowach, diff (svn, git, hg ... itp.) Pokaże, jakby cała linia uległa zmianie, nawet przy użyciu fantazyjnych narzędzi, czasami może być konieczne szybkie spojrzenie po prostej linii na podstawie różnic, aby zobaczyć, co się zmieniło.
  • narzędzia do adnotacji (takie jak git blame) pokażą linię jako zmienioną, dzięki czemu śledzenie początku linii będzie krokiem do znalezienia prawdziwej zmiany.

Są one zarówno niewielkie, jak i zależą od tego, ile czasu spędzasz na przeglądaniu lub śledzeniu kodu, które zatwierdzają zmienione wiersze kodu.

Bardziej namacalną niedogodnością związaną z wprowadzaniem zmian w dodatkowych wierszach w różnicach, jest większe prawdopodobieństwo, że zmiany w kodzie spowodują scalenie konfliktów i należy je rozwiązać ręcznie .


Istnieje wyjątek od tego, w przypadku baz kodu, które mają {własną linię - to nie jest problem.

Hałas diff argument nie trzymać jeśli piszesz w tym stylu:

if (foo)
{
    bar();
    baz();
}

Jednak nie jest to tak powszechna konwencja, więc głównie dodaje się do odpowiedzi na kompletność (nie sugerując, że projekty powinny używać tego stylu) .

ideasman42
źródło
8
Podobają mi się skomentowane szumy różnicowe, które stanowią wyraźny plus.
Martin York
2
Gdyby tylko każdy, kto jest wściekły na JSON, brał pod uwagę hałas różnicowy! Patrzę na ciebie, zasada „nie ostatni przecinek”.
Roman Starkov,
1
Huh, nie zastanawiałem się nad korzyściami wynikającymi z różnicowego szumu w {stylu „na własnej linii”. Naprawdę nienawidzę tego stylu i nie lubię pracować nad projektami, w których ten styl jest wymagany. Może mając to na uwadze, uważam, że kodowanie w ten sposób będzie mniej frustrujące. Gęstość kodu jest ważna. Jeśli widzisz wszystkie funkcje na monitorze jednocześnie, możesz łatwiej przeglądać całość. Lubię pozostawiać puste wiersze między oddzielnymi blokami kodu wewnątrz funkcji dla czytelności (do grupowania instrukcji powiązanych), a bycie zmuszonym do marnowania miejsca w innych miejscach osłabia zamierzone przerwy.
Peter Cordes,
1
@ peter-cordes, który również nie jest fanem stylu „na {swojej linii”, podał go tylko dla kompletności odpowiedzi. Jeśli chodzi o zaufanie do makr w użyciu do{}while(0), to mam problem z tym, że możesz mu ufać prawie cały czas. Problem polega na tym, że zdarzają się wypadki, błędy mogą ześlizgnąć się podczas przeglądu kodu ... i można wprowadzić błędy, których nie byłoby inaczej.
ideasman42
2
Jeśli wymieniamy potencjalne błędy, możliwość komentowania poszczególnych linii jest kolejną dobrą rzeczą. Śledziłem błąd, który został spowodowany przez kogoś, kto ślepo komentuje treść jednowierszowej instrukcji if. Następująca instrukcja została następnie wykonana warunkowo, a nie bezwarunkowo.
Eldritch Cheese
15

Wiele lat temu przyprowadzono mnie do debugowania kodu C. Błąd był szalenie trudny do znalezienia, ale ostatecznie sprowadził się do stwierdzenia:

if (debug)
   foo (4);

I okazało się, że osoba, która to napisała, zdefiniowała foojako makro. Makro z dwoma wierszami kodu. I oczywiście tylko pierwsza z tych dwóch linii podlegała if. (Więc druga linia została wykonana bezwarunkowo.)

Może to być absolutnie wyjątkowe dla C i jego preprocesora - który dokonuje podstawień przed kompilacją - ale nigdy o tym nie zapomniałem. Takie rzeczy pozostawiają na tobie ślad i dlaczego nie zagrać w nie bezpiecznie - zwłaszcza jeśli używasz różnych języków i łańcuchów narzędzi i nie możesz być pewien, że takie shenanigany nie są możliwe gdzie indziej?

Teraz najwyraźniej wcinam i używam nawiasów klamrowych inaczej niż wszyscy inni. Dla pojedynczej linii ifzrobiłbym:

if (debug) { foo (4); }

więc nie wymaga żadnych dodatkowych linii, aby uwzględnić nawiasy klamrowe.

Wayne
źródło
6
W takim przypadku to ten, kto napisał to makro, jest winny.
gnasher729
6
Prawidłowe pisanie makr preprocesora C może nie być intuicyjne, ale można to zrobić. I należy to zrobić, jak wskazuje gnasher729. Twój przykład jest powodem, dla którego każde makro zawierające więcej niż jedną instrukcję musi zawierać swoje ciało w do { ... } while(0)pętli. Zapewni to nie tylko, że zawsze będzie poprawnie traktowane poprzez dołączenie if()instrukcji, ale także, że średnik na końcu instrukcji zostanie połknięty poprawnie. Kto nie wie o takich prostych regułach, po prostu nie powinien pisać makr preprocesorów. Obrona na stronie wzywającej jest niewłaściwym miejscem do obrony.
cmaster
18
@cmaster: Prawda, ale sposób, w jaki makra (lub inne funkcje językowe) są pisane przez innych, jest poza moją kontrolą. Jak używam aparatu ortodontycznego, jestem pod kontrolą. Zdecydowanie nie twierdzę, że jest to żelazny powód, aby włączyć aparaty ortodontyczne, ale jest to coś, co mogę zrobić, aby obronić się przed błędami innych ludzi, więc to robię.
Wayne
@ gnasher729, kogo to obchodzi, czy to wina kogoś innego? Jeśli przeglądasz kod i przestrzegasz pewnych rozsądnych standardów, równie dobrze może to być wina twoich zespołów. A jeśli dotrze do użytkowników, obwinią organizację o wydanie błędnego oprogramowania.
ideasman42
1
Ktokolwiek wymyślił makra, ponosi winę.
Neme
14

„Wujek Bob” może wyrazić swoją opinię, możesz wyrazić swoją opinię. Nie musisz go kwestionować.

Jeśli chcesz odwołać się do władzy, weź Chris Lattner. W Swift, jeśli instrukcje straciły nawiasy, ale zawsze pochodzą z nawiasami klamrowymi. Bez dyskusji, to część języka. Więc jeśli „Wujek Bob” zacznie usuwać nawiasy klamrowe, kod przestanie się kompilować.

Przejście kodu innej osoby i „pozbycie się bezużytecznych aparatów ortodontycznych” to zły nawyk. Powoduje dodatkową pracę tylko wtedy, gdy kod musi zostać przejrzany i gdy niepotrzebnie powstają konflikty. Może „Wujek Bob” jest tak niesamowicie dobrym programistą, że nie potrzebuje recenzji kodu? Zmarnowałem tydzień mojego życia, ponieważ jeden z najlepszych programistów zmienił „if (p! = NULL)” na „if (! P)” bez recenzji kodu, ukryty w najgorszym możliwym miejscu.

To w większości debata w stylu nieszkodliwym. Nawiasy klamrowe mają tę zaletę, że można wstawić inny wiersz kodu bez dodawania nawiasów klamrowych. Jak instrukcja rejestrowania lub komentarz (jeśli po niej następuje komentarz, a po nim instrukcja jest po prostu okropna). oświadczenie w tym samym wierszu, jakby miało praktyczną wadę polegającą na tym, że masz problemy z wieloma debuggerami. Ale rób co chcesz.

gnasher729
źródło
1
Chyba chodzi o „wyzwanie”, ponieważ UB (sic!) Przedstawia swoje opinie jako fakty - przynajmniej tak mnie uderza, kiedy go słucham.
vaxquis
3
Powiedzenie „Rób, co wolisz” jest tak naprawdę zgodne z wujkiem Bobem w tej sprawie, ponieważ twierdzi, że „to nie ma znaczenia”. W wielu językach nie stanowi to problemu. Wcześniej myślałem we wszystkich tych sprawach, w których powinieneś ZAWSZE używać aparatów ortodontycznych i nie widziałem, żeby ktokolwiek je kwestionował. Teraz wujek Bob rzuca mu wyzwanie i zastanawiam się, czy mu się to udaje, ponieważ pracuje tak bardzo zrekonstruowanymi drobnymi metodami, czy dlatego, że jest tego pełen. Nie uważałem tego za nieszkodliwe właśnie ze względu na rodzaje błędów, o których wspomina w swojej odpowiedzi PaulPaul.
candied_orange
Re zawsze : szum syntaktyczny jest rozpraszający, a dodatkowa „pusta” linia dla nawiasów klamrowych dodaje wizualny separator w akapicie, w którym linie nie powinny być rozdzielane, co dodatkowo utrudnia czytelność. Jest to szczególnie ważne w zwięzłych, małych blokach, o których wspominasz.
JDługosz
9

Moje powody, dla których nie usuwam nawiasów klamrowych, to:

  1. zmniejszyć zmęczenie decyzją. Jeśli zawsze używasz aparatu ortodontycznego, nigdy nie musisz decydować, czy będziesz potrzebować aparatu ortodontycznego, czy nie.

  2. zmniejszyć opór rozwojowy: nawet jeśli starasz się w końcu wyodrębnić wszystkie wielokrotne linie logiki do metod, konieczność przekształcenia bezobsługowego w zbrojony, jeśli do dodania logiki jest irytującym problemem. Jest więc wysiłek usunięcia nawiasów klamrowych i wysiłek dodania ich ponownie, gdy potrzebujesz więcej kodu. Małe, ale irytujące.

Michael Johnston
źródło
0

Młody współpracownik powiedział, że aparaty ortodontyczne, które uważamy za zbędne i zbędne, są w rzeczywistości dla niego pomocne. Nie pamiętam dokładnie, dlaczego, ale jeśli pozwala mu to szybciej pisać lepszy kod, to sam powód, aby je zachować.

FWIW, zgodziliśmy się na kompromis, że umieszczenie ich na jednej linii nie czyni takich krótkich warunki un czytelny / rozpraszają mnie. Na przykład

if (!param) { throw invalid_argument (blahblah); }
if (n < 2) { return 0; }
// real code for function starts here...

Zwracam również uwagę, że te wstępne warunki są często oświadczeniami kontroli przepływu dla ciała (np. A return), więc strach przed dodaniem drugiego zdania, które ma być w tym samym stanie i zapominaniem o pisaniu nawiasów, jest dyskusyjny. Druga instrukcja pod warunkiem byłaby martwym kodem i nie miałaby sensu.

Podejrzewam, że biegłość w czytaniu jest spowodowana połączeniem parsera mózgu osoby z nawiasami klamrowymi jako częścią warunkowego stwierdzenia. To nie jest dokładna reprezentacja gramatyki C ++, ale może to być efekt uboczny nauki najpierw niektórych innych języków, w takim przypadku.

JDługosz
źródło
1
Wujek Bob prawdopodobnie myśli, że bez nich szybciej pisze lepszy kod.
djechlin
2
Podobnie jak ja i inni biegle posługujący się językiem C ++.
JDługosz
1
„jeśli pozwala mu to szybciej pisać lepszy kod, to tylko powód, aby je zachować” ++ Mam Jr., który powiedział to samo, dlatego je zachowujemy.
RubberDuck,
... i to jest jedyny powód, aby robić to tak, jak chce wujek Bob.
djechlin
-1

Po obejrzeniu tego filmu właśnie zauważyłem, że wyeliminowanie nawiasów klamrowych ułatwia sprawdzenie, gdzie kod wymaga jeszcze refaktoryzacji. Jeśli potrzebujesz nawiasów klamrowych, Twój kod może być nieco bardziej przejrzysty.

To powiedziawszy, gdy jesteś w zespole, wyeliminowanie aparatu będzie prawdopodobnie prowadzić do nieoczekiwanego zachowania. Mówię: zachowaj je, a zaoszczędzisz sobie wielu bólów głowy, gdy coś pójdzie nie tak.

Gijs Overvliet
źródło
wydaje się, że nie oferuje to nic istotnego w porównaniu z punktami przedstawionymi i wyjaśnionymi w poprzednich 10 odpowiedziach
gnat
-3

Nauczono mnie tego nie robić, ponieważ ułatwia wprowadzenie błędu, dodając kolejną wciętą linię, myśląc, że jest kontrolowany przez if, gdy nie jest.

Jeśli twój kod jest dobrze przetestowany jednostkowo , tego rodzaju „błąd” eksplodowałby w twarz.

Czyszczenie kodu przez unikanie niepotrzebnych i brzydkich nawiasów to praktyka, którą stosuję.

Mik378
źródło
9
Oczywiście jest też odwrotnie: jeśli twój kod jest wolny od błędów, nie potrzebujesz żadnych testów jednostkowych. W rzeczywistości żyjemy w niedoskonałym świecie, w którym czasami występują błędy w kodzie, a czasem błędy w testach. (Z mojego doświadczenia wynika, że ​​te ostatnie są w rzeczywistości bardziej powszechne.) Tak więc chociaż testy z pewnością zmniejszają ryzyko błędów, nie jest to jednak wymówka, aby znaleźć inne sposoby, aby ponownie zwiększyć ryzyko.
ruakh
3
Aby dodać do komentarza ruakh: nie jest możliwe 100% testowanie jednostkowe kodu.
BЈовић
Zobacz mój kod;) Podczas ćwiczenia TDD zawsze można bardzo szybko pokazać tego rodzaju błąd.
Mik378
@ Mik378, co prawdopodobnie nie jest prawdą. Chodzi o to, że jeśli używałeś aparatów ortodontycznych, nawet nie musiałbyś się tym martwić.
GoatInTheMachine