Po prostu ciekawy. Najbardziej, jakie kiedykolwiek miałem, to pętla for w pętli for, ponieważ po przeczytaniu tego z Linusa Torvaldsa:
Tabulatory mają 8 znaków, a zatem wcięcia również mają 8 znaków. Istnieją ruchy heretyckie, które próbują zagłębić wcięcia 4 (lub nawet 2!) Znaków, i to jest podobne do próby zdefiniowania wartości PI jako 3.
Uzasadnienie: Ideą wcięcia jest jasne określenie, gdzie zaczyna się i kończy blok kontroli. Zwłaszcza gdy patrzysz na ekran przez 20 prostych godzin, o wiele łatwiej jest zobaczyć, jak działa wcięcie, jeśli masz duże wcięcia.
Teraz niektórzy twierdzą, że 8-znakowe wcięcia powodują, że kod przesuwa się zbyt daleko w prawo i utrudnia czytanie na 80-znakowym ekranie terminala. Odpowiedź na to jest taka, że jeśli potrzebujesz więcej niż 3 poziomów wcięcia, i tak jesteś wkręcony i powinieneś naprawić swój program.
https://www.kernel.org/doc/Documentation/CodingStyle
Uznałem, że to niedopuszczalna praktyka, aby przejść do trzeciej warstwy zapętlenia i zrestrukturyzować mój kod (głównie Qt).
Czy Linus żartował?
Czy to zależy od języka lub aplikacji?
Czy są jakieś rzeczy, które absolutnie wymagają trzech lub więcej poziomów zapętlenia?
Odpowiedzi:
Jądro zdecydowanie preferuje proste algorytmy
Podczas gdy różne algorytmy mogą wymagać głęboko zagnieżdżonych pętli w pętlach, w kontekście jądra Linuksa (w którym wspomniano cytat) zazwyczaj potrzebujesz szybkich odpowiedzi w czasie rzeczywistym. W tym kontekście głębokie zagnieżdżanie jest zapachem, który może wskazywać, że przepływ kodu jest zbyt skomplikowany dla tej domeny i może wymagać zmiany ze względu na jego właściwości wykonawcze, a nie problemy z czytelnością lub wcięciem.
Co więcej, jądro Linuksa różni się od większości kodu aplikacji pod względem wymagań dotyczących kontroli i testowania - i dlatego wolałby nie mieć zagnieżdżonego algorytmu na poziomie 4+ w jednej funkcji. Powinno być oczywiste, aby zobaczyć, co dokładnie robi każdy fragment kodu , w tym wszystkie możliwe przepływy sterowania i przypadki zbocza. Głęboko zagnieżdżony kod utrudnia to.
źródło
because
projektów tabu wykorzystujących języki niższego poziomu, które korzystają ze stylu kodowania, który koncentruje się na prostszych algorytmach?Do pewnego stopnia przestałem poważnie traktować ten cytat w „Tabs to 8 znaków” . Cały sens tabulatorów polega na tym, że nie są one stałą liczbą znaków (jeśli w ogóle, karta to jeden znak). Co za ładunek. Podobnie, nie jestem do końca przekonany, że ustalenie twardej i szybkiej reguły „trzech poziomów wcięcia” jest rozsądne (podobnie jak ustalenie twardej i szybkiej reguły dla wszystkiego jest rozsądne).
Jednak ograniczenie poziomów wcięć jest ogólnie rozsądną sugestią, a nie taką, która powinna cię zaskoczyć.
Ostatecznie, jeśli twój program potrzebuje trzech poziomów iteracji, tego właśnie potrzebuje Twój program . Duch cytatu nie polega na magicznym złagodzeniu tego wymogu w projekcie, ale na podziale logiki na funkcje i typy, dzięki czemu kod jest bardziej przejrzysty i bardziej wyrazisty.
To po prostu opiera się na tej samej wytycznej podanej powyżej, dotyczącej poziomów wcięć. Chodzi o to, jak ustrukturyzujesz swój kod i zapewnisz jego czytelność, łatwość w utrzymaniu i przyjemne modyfikowanie przez wiele lat.
źródło
Outside of comments, documentation and except in Kconfig, spaces are never used for indentation, and the above example is deliberately broken.
- 6 akapitów poniżej cytatu w PO.Chodzi o to samo, co w przypadku dowolnych konstrukcji kontroli przepływu: jeśli kod jest trudny do zrozumienia, należy go przefiltrować. Jeśli wykonujesz prostą manipulację tablicą wielowymiarową, odpowiednie może być zagnieżdżenie pętli o głębokości pięciu lub sześciu, o ile logika w najbardziej wewnętrznej pętli jest prosta. Jeśli jednak przetwarzasz skomplikowaną logikę biznesową, a ciało pętli ma kilkanaście linii lub więcej, prawdopodobnie nie będziesz chciał zagnieżdżać tej głębokości więcej niż jednej pętli. Możesz spróbować obliczyć cykliczną złożoność kodu, ale tak naprawdę sprowadza się to do czytelności i łatwości konserwacji danego kodu.
źródło
Utwór został napisany w zabawny styl, który sugeruje, że autor zna sposób, w jaki styl kodowania jest omawiany przez poważnych praktyków: wszyscy mamy swoje preferencje i bronimy ich wściekle, ale z językiem przynajmniej częściowo w policzek. Doskonale rozumiemy, że większość z nich to kwestia osobistego gustu. Mówi w wielu słowach
"Coding style is very personal, and I won't _force_ my views on anybody"
- przynajmniej poza kodem, który osobiście utrzymuje. Ale spójność stylu w danym projekcie to bardzo dobry pomysł. Wolę kodować do stylu, którego nie lubię, niż zajmować się wieloma stylami w danej funkcji.Oto przykład wyraźnie zabawnego pisania:
Zabawny (1).
Prawdopodobnie jest to dobra rada, aby powstrzymać wcięcia przed wymknięciem się spod kontroli, chociaż trzypoziomowe maksimum może być hiperboliczne. Nie zamierzam grepować źródła jądra i liczyć sekwencji czterech znaków tabulatorów, ale założę się, że pieniądze można znaleźć co najmniej jeden napisany przez Torvaldsa.
Z drugiej strony, jeśli ktoś może napisać jądro Linuksa bez przekraczania trzech poziomów wcięcia, trzypoziomowy limit może być ćwiczeniem, które warto wypróbować przez chwilę we własnym kodzie, aby zobaczyć, dokąd cię zaprowadzi. Wiesz, to nie jest zmiana płci. To nie jest zobowiązanie na całe życie.
Jeśli natkniesz się na kogoś w Internecie, który myśli, że rozumie programowanie znacznie lepiej niż Torvalds (2), to wiesz, jak ludzie lubią rozmawiać w Internecie.
Z drugiej strony, on nie ma racji kryminalnej co do tabulatorów z ośmioma spacjami. To jest szaleństwo człowieka, który powinien być trzymany w ryzach i karmiony przez szczelinę. Cztery spacje są oczywiście poprawne.
(1) Zwróć jednak uwagę na to, jak błędnie stawia spację przed elipsami oraz dwie spacje za nimi i dwie spacje po kropce. ŹLE, ŹLE, ŹLE. A potem ma bezczelną żółć, by orzec heretyków. Heretyk to ty, Torvalds! TO TY!
(2) Jeśli chcesz porozmawiać o „ zrozumieniu, jak zaprojektować system kontroli źródła ”, może być miejsce na debatę.
Uwaga: Drogi przyjacielu, który wielokrotnie przesyłasz tę samą edycję: Formatowanie cytowanego materiału jest zachowywane dokładnie tak, jak chciał tego autor. To dlatego, że pochodzi z eseju na temat formatowania tekstu o stałej szerokości, napisanego w tekście o stałej szerokości, przez kogoś, kto dobrze przemyślał formatowanie tekstu o stałej szerokości. Formatowanie jest świadomą i celową częścią intencji autora i odnosi się do tematu.
Ponadto powróciłem do tego formatowania we własnym tekście. Jeśli wyjmiesz wstępne formatowanie, mój przypis (1) staje się bełkotem. Jeśli wstępne formatowanie zostanie usunięte, to powinien być tekst w moim przypisie (1) odnoszący się do par spacji po kropkach na końcach zdań. W każdym razie widzę uzasadnienie usunięcia tego przypisu, ponieważ jest on mniej zabawny niż się wydawało, kiedy go napisałem. Ale usunięcie formatowania bez usuwania przypisu jest nieprzydatne.
źródło
.
W tym komentarzu nie ma złych spacji ;-))preferred coding style
a takżebut this is what goes for anything that I have to be able to maintain
Linus ma bardzo tępy styl mówienia i poczucie humoru, ale w tym przypadku nie żartował. Istnieją sytuacje, w których algorytm wymaga zagnieżdżenia głębszego niż dwa poziomy, ale można to zrobić przy użyciu innych środków niż wcięcie kodu. Przewodnik po stylach jądra Linuksa zdecydowanie preferuje te inne metody, ze względu na trudność w utrzymywaniu głęboko zagnieżdżonych pętli, i tak właśnie mówi Linus.
W przypadku niektórych przykładów alternatywnych metod można użyć rekurencji, podzielić wewnętrzne pętle na ich własne funkcje lub utworzyć pośrednie struktury danych.
Nadmierne zagnieżdżanie jest jednym z tych przypadków, które są łatwiejsze do napisania, ale trudniejsze do odczytania. Ustawienie dużej głębokości tabulatora jest sposobem Linusa na uczynienie pisania bardziej denerwującym.
źródło
Istnieje wiele pytań, w których rada jest inna dla osoby zadającej pytanie niż dla osoby, która nie zadaje pytania. Jeśli zapytasz „Czy powinienem kiedykolwiek mieć pętle zagnieżdżone na głębokości większej niż dwa poziomy”, to dla ciebie, osoby zadającej to pytanie, odpowiedź brzmi NIE. Jeśli zapytasz, nie rób tego. Jeśli masz wystarczająco dużo doświadczenia, że nie musisz pytać, to wiesz, jaka jest poprawna odpowiedź w każdym przypadku. I nie kłóc się, jeśli nie zgadzasz się z odpowiedzią, ponieważ odpowiedź nie jest dla ciebie.
źródło
Wydawałoby się, że jest to podręcznikowy podręcznik ogona machającego psem.
Jeśli masz 80 znaków, to oczywiście spróbujesz dopasować kod najlepiej, jak potrafisz, nawet jeśli nie tworzy on najlepszej struktury kodu .
Zajmij się resztą swoich punktów:
Uznałem, że to niedopuszczalna praktyka.
Myślę, że w to za dużo czytasz. Opieraj się pragnieniu przyjęcia wszystkiego, co czytasz jako ewangelii, bez właściwego zrozumienia kontekstu.
Czy on żartował?
Trudno ustalić kontekst, ale patrz mój pierwotny punkt powyżej.
Czy to zależy od języka lub aplikacji?
Bardzo tak. Weź dowolny język mainframe / średniotonowy, w którym prawdopodobnie będziesz kodować na terminalu (lub emulatorze terminala).
Czy są jakieś rzeczy, które absolutnie wymagają trzech lub więcej poziomów zapętlenia?
Tak, jest to bardzo powszechne w niektórych algorytmach brutalnej siły. Zobacz problem 31 na Project Euler. Jest to klasyczny przykład problemu, który można rozwiązać brutalną siłą za pomocą szeregu pętli (dokładnie 8).
źródło
Nie, to są oficjalne wytyczne.
Wskazówki dotyczące kodowania są generalnie zależne od języka i aplikacji, jednak głęboko zagnieżdżony kod zawsze obciąża czytelnika.
Problem z zagnieżdżonym kodem polega na tym, że ogólnie zwiększa on złożoność cykliczną: to znaczy, im bardziej zagnieżdżony jest kod, tym więcej potencjalnych ścieżek wykonania istnieje w funkcji. Kombinatoryczna eksplozja potencjalnych ścieżek wykonania utrudnia rozumowanie na temat kodu i dlatego należy go ogólnie unikać.
Dlaczego więc 3? Subiektywne wytyczne kodowania są zarówno trudne do wyegzekwowania, jak i niemożliwe do wyegzekwowania automatycznie. Ustanowienie obiektywnych wytycznych kodowania na maksymalnym poziomie wcięcia wymaga uzgodnienia liczby: w jądrze Linuksa wybrali 3.
Jest to dla nich arbitralne i najwyraźniej wystarczające.
Algorytmicznie, prawdopodobnie jednak w wystarczająco wyrazistych językach zawsze możesz przeformułować kod na mniejsze fragmenty (z funkcjami lub zamknięciami).
Możesz oczywiście napisać zaciemniony kod z niewielkim zagnieżdżeniem i wieloma małymi funkcjami, które wywołują się nawzajem bez zapisywania umowy ...
... jednak małe funkcje z wyraźnymi umowami są znacznie łatwiejsze do kontrolowania niż duże funkcje z wyraźnymi umowami w ogóle.
źródło