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:
I mówi „Jedną z moich ulubionych rzeczy jest pozbycie się bezużytecznych aparatów ortodontycznych”, gdy zamienia to w to:
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, if
kiedy 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:
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?
źródło
if
blok ma tylko jedną linię, nie ma to znaczenia. Jeśli potrzebujesz dodać więcej linii, powinna to być kolejna funkcja, która zmniejszaif
blok z powrotem do jednej linii (wywołanie funkcji). Jeśli zastosujesz się do tego, szelki po prostu nie mają znaczenia - wcale .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.Odpowiedzi:
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
if
instrukcji 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.
źródło
-Wmisleading-indentation
.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?
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ć
Mogę też chcieć oszczędzać miejsce. Ale
używa tylko jednej „dodatkowej” linii.
Wiem, że nie pytałeś, ale jeśli pracuję sam, jestem heretykiem. Jeśli usunę aparat ortodontyczny, wolę
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.źródło
} else[if(...)] {
, nie dodaje żadnych dodatkowych linii, więc stanowi tylko jedną dodatkową linię w całym tekście.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”:
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.
źródło
while(true);{break;}
. Jeśli naprawdę jest to uzasadniony kontekst, zajmie mi to trochę czasu, aby się z tym pogodzić.includePage()
nie jest to źle napisane makro z więcej niż jedną instrukcją?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:
Deweloper dodaje przydatny komentarz.
Później programista rozwija się na nim.
Lub dodaje zagnieżdżony blok:
Lub używa makra:
„... 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ę:
Do:
... powoduje, że linia warunkowa wyświetla się w różnicy, gdy jest zmieniana, co powoduje pewne małe, ale niepotrzebne obciążenie.
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.
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:
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) .
źródło
{
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.{
swojej linii”, podał go tylko dla kompletności odpowiedzi. Jeśli chodzi o zaufanie do makr w użyciudo{}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.Wiele lat temu przyprowadzono mnie do debugowania kodu C. Błąd był szalenie trudny do znalezienia, ale ostatecznie sprowadził się do stwierdzenia:
I okazało się, że osoba, która to napisała, zdefiniowała
foo
jako makro. Makro z dwoma wierszami kodu. I oczywiście tylko pierwsza z tych dwóch linii podlegałaif
. (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
if
zrobiłbym:więc nie wymaga żadnych dodatkowych linii, aby uwzględnić nawiasy klamrowe.
źródło
do { ... } while(0)
pętli. Zapewni to nie tylko, że zawsze będzie poprawnie traktowane poprzez dołączenieif()
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.„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.
źródło
Moje powody, dla których nie usuwam nawiasów klamrowych, to:
zmniejszyć zmęczenie decyzją. Jeśli zawsze używasz aparatu ortodontycznego, nigdy nie musisz decydować, czy będziesz potrzebować aparatu ortodontycznego, czy nie.
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.
źródło
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
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.
źródło
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.
źródło
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ę.
źródło