Wytyczne kodowania: metody nie powinny zawierać więcej niż 7 instrukcji?

78

Szukałem przez AvSol Kodowanie Wytyczne dla C # i zgadzam się z prawie wszystkiego, ale jestem bardzo ciekaw, co inni myśleć o jednej konkretnej reguły.

AV1500

Metody nie powinny przekraczać 7 instrukcji Metoda, która wymaga więcej niż 7 instrukcji, robi zbyt wiele lub ma zbyt wiele obowiązków. Wymaga również od ludzkiego umysłu przeanalizowania dokładnych instrukcji, aby zrozumieć, co robi kod. Podziel go na wiele małych i skoncentrowanych metod z samo-wyjaśniającymi się nazwami.

Czy większość z was przestrzega tej zasady? Nawet jeśli nie ma wiele do zapisania przy tworzeniu nowej metody (Twój kod wciąż jest SUCHY ) oprócz znacznego zwiększenia czytelności? A czy twój numer wciąż wynosi zaledwie 7? Skłoniłbym raczej do 10.

Nie twierdzę, że łamię tę zasadę wszędzie - wręcz przeciwnie, moje metody są w 95% małe i skoncentrowane, ale mówienie, że nigdy nie powinieneś łamać tej zasady, naprawdę mnie rozwaliło.

Naprawdę chcę tylko wiedzieć, co wszyscy myślą o NIGDY nie naruszającym tej zasady (jest to „1” w standardzie kodowania - co oznacza, że ​​NIGDY nie rób tego). Ale myślę, że miałbyś problem ze znalezieniem bazy kodu, która by tego nie zrobiła.

Brian
źródło
48
Czy liczą też casewypowiedzi w jednym singlu switch? W każdym razie jest to idiotyczne, bezużyteczne wymaganie. Ci, którzy to napisali, nie wiedzą nic o programowaniu.
SK-logika
86
Jedyną regułą, która powinna być „1” w standardzie kodowania, powinna być zasada „weźmiesz wszystkie wytyczne kodowania z dodatkiem ziarenka soli”.
Mike Nakis
6
@ SK-logic 1027 też nie jest zły - pisanie kodu, który musi obsługiwać brakujące dane, musi być zabawne, jeśli musisz traktować pusty ciąg znaków jako ciąg pusty.
quant_dev
25
Czytając niniejsze wytyczne, spodziewałbym się, że zobaczę bazę kodów pełną: void DoSomething () {DoSomethingFirstSevenLines (); DoSomethingSecondSevenLines (); DoSomethingThirdSevenLines (); itp; }
holowniki
12
Spróbuj odzwierciedlić większość systemu .NET Framework i zobacz, ile metod ma mniej niż 7 instrukcji ...
David Boike

Odpowiedzi:

195

To dla mnie „zapach wzorcowy”. Ilekroć widzę standardy kodowania z określonymi limitami, martwię się. Prawie zawsze natrafiasz na przypadek, w którym metoda musi być większa niż pozwala na to norma (czy to długość / liczba linii, liczba zmiennych, liczba punktów wyjścia itp.). Normy powinny bardziej przypominać wytyczne i zapewniać wystarczającą swobodę w dokonywaniu właściwego osądu. Nie zrozumcie mnie źle, dobrze jest mieć standardy, ale nie powinny one stać się „mikrozarządzaniem przez proxy”.

TMN
źródło
25
+1 za „mikrozarządzanie przez proxy”. Podejrzewam, że ktoś przeczytał o zasadzie „7 plus lub minus 2” ( en.wikipedia.org/wiki/... ) i pomylił krótkoterminowe przechowywanie faktów z długoterminowym przechowywaniem, jak wiesz, edytor kodu.
puszysty
25
Jakikolwiek rozsądnie przemyślany standard zabrania magicznych liczb w kodzie, prawda? Można by pomyśleć, że standard kodowania również będzie przestrzegany. Liczba 7 ma zdecydowanie „magiczną” jakość.
Adam Crossland
2
Twoja odpowiedź byłaby bardziej sensowna, gdyby tytuł dokumentu nie brzmiał „Kodowanie Guidlinesw C # 3.0 i 4.0.
Andy
+1 Moim zdaniem jedynym powodem, dla którego powinieneś stosować się do standardów kodowania, jest nigdy nie dogmatycznie podążać za dowolną liczbą, ale aby upewnić się, że nie spowodujesz niepotrzebnych problemów z łączeniem w kontroli wersji (tj. Problemów związanych z pracą w zespole). Zwykle krótsze pliki i więcej składników oznaczają mniejsze ryzyko problemów podczas scalania zmian w kodzie.
Spoike
3
Pobrałem ten dokument i zacząłem go przeglądać. W 1.6 stwierdza: „Dokument nie stwierdza, że ​​projekty muszą być zgodne z tymi wytycznymi, ani nie mówi, które wytyczne są ważniejsze od innych. Zachęcamy jednak projekty do samodzielnego decydowania, które wytyczne są ważne, jakie odchylenia będą miały projekt use, który jest konsultantem w razie wątpliwości i jakiego rodzaju układu należy użyć dla kodu źródłowego. ” Chociaż 1 oznacza „Wytyczne, których nigdy nie należy pomijać i powinny mieć zastosowanie do wszystkich rozwiązań”, możesz je zmodyfikować.
chrish
83

Zwykle dobrym pomysłem jest podzielenie rzeczy na małe metody. Ale ważne jest, aby podzielić rzeczy tam, gdzie ma to sens.

Jeśli podział nie ma sensu, nie dziel się. Często dzieje się tak w przypadku niektórych procedur lub kodu GUI.

Steve McConnell stwierdził w Code Complete , że nie zawsze jesteś bardziej produktywny, kiedy używasz krótkich metod. Jeśli podzielisz się, gdy nie ma to sensu, zwiększysz złożoność kodu bez żadnych korzyści.

Jak zawsze w przypadku wytycznych, dobrze jest pamiętać, dlaczego istnieją ograniczenia, aby można było dowiedzieć się, kiedy nie mają zastosowania. W większości kodu metody będą krótkie lub prawdopodobnie masz problem z OSUSZANIEM lub separacją problemów . Ale jeśli tak nie jest, to dobrze.

deadalnix
źródło
1
Świetna odpowiedź. Ostatnie dwie linie szczególnie prowadzą do sedna sprawy.
Xonatron
6
Myślę, że ważną zasadą jest sprawdzanie, czy te metody są ortogonalne. Jeśli są niezależne, mogą być wywoływane w dowolnej kolejności i szanują niezmienniki klas, lepiej je rozdzielić. Jeśli metody są ściśle powiązane, przełamują niezmienniki klasy i / lub muszą być wywoływane w określonej kolejności, być może lepiej jest trzymać je razem.
hugomg
4
Kompletny kod jest pełen dobrych rzeczy. Każdy programista powinien codziennie jeść kawałek tego na lunch.
deadalnix
29

Należy to traktować jako ogólną zasadę.

Rzeczy takie jak „Nie więcej niż 80 (100,120) kolumn tekstu”, „jeden punkt wyjścia na metodę”, „nie więcej niż 2 poziomy zagnieżdżania” to tak zwane progi dla wskaźników zapachu kodu. Jeśli czasem je naruszysz, niekoniecznie oznacza to, że kod jest zły. Jeśli konsekwentnie je naruszasz, w kodzie coś pachnie i możesz zrobić sobie przerwę i przemyśleć swoje podejście.

Dla mnie najważniejsze kryteria to: „Czy ten kod jest zrozumiały?”, „Czy jest powtarzalny?”, „Czy jest rozbity w logicznych miejscach?”, „Czy jest luźno powiązany?” Jest jeszcze kilka innych, ale myślę, że podstawową ideę można podsumować, pamiętając radę Donalda Knutha: „Programy są przeznaczone do czytania przez ludzi i tylko przypadkowo do uruchomienia przez komputery”.

seggy
źródło
7
Limit kolumn „80/100/120” jest taki, że możemy odczytać kod. Większość terminali jest otwieranych przy 80 kolumnach, a autorowi nie trzeba poświęcać więcej niż 80 kolumn, niż zmuszanie każdego czytnika do zmiany rozmiaru terminala za każdym razem, gdy chce przeczytać kod. W przeciwieństwie do innych limitów, limit N kolumn nie wpływa na semantykę kodu, jest to czysto stylistyczna reguła; w tej samej kategorii co „użyj tabulatorów 4-spacji” lub „umieść otwierające nawiasy klamrowe dla funkcji w osobnym wierszu”.
Dietrich Epp
4
To prawda, że ​​jest to aspekt bardziej estetyczny niż semantyczny. Jednak właśnie tam stosuje się moje ostatnie zdanie. Często zdarza się, że instrukcje Java przekraczające regułę 80 kolumn nie mają „miłego” miejsca do podziału linii. Wpływa to na czytelność i zrozumienie kodu. Może to również wskazywać na naruszenie prawa Demeter
seggy
7
W XXI wieku moje IDE ma tę funkcję zwaną „dynamicznym zawijaniem słów”.
György Andrasek
9
@ GyörgyAndrasek: Ale nie wszyscy używają twojego IDE: patrzymy na kod w GitHub, w terminalach z less, w vimi emacs; a automatyczne owijanie wydaje się co najwyżej przypadkowe. Standardy kodowania nie są dla twojej korzyści, są dla korzyści osób pracujących w zespołach.
Dietrich Epp
2
@DietrichEpp Osobiście mam trudności z odczytaniem kodu, który zawsze jest zawijany w kolumnie 80. Niedawno musiałem pracować nad projektem Java, w którym użyto standardowego formatyzatora Eclipse. W metodzie bardzo trudno było śledzić linie przekraczające dwie, a nawet trzy linie (obwiniam też za to inne ustawienia formatyzatora). Najważniejsze jest to, że myślę, że 80 jest nieco przestarzały. Ja osobiście używam limitu 120, mam moich redaktorów, aby to wymuszać, mam konsolę o szerokości 120 kolumn, a Github wyświetla 125 kolumn. I myślę, że jest to o wiele bardziej czytelne.
poke
18

Nigdy nie poświęciłem czasu na policzenie liczby instrukcji w moich metodach, ale staram się pisać metody, które czysto spełniają jeden, jasny cel. Tak długo, jak twój kod jest czysty, czytelny i zgodny z zasadami DRY i Single Responsibility , prawdopodobnie wykonałeś swoją pracę. Uważam, że arbitralne dzielenie metody tylko w celu wymuszenia ograniczenia siedmiu instrukcji może sprawić, że Twój kod będzie mniej czytelny / możliwy do utrzymania.

Joshua Smith
źródło
1
+1 za czytelność. Nie powinno nawet mieć znaczenia, czy metoda ma 20, 30, a nawet 50 linii. Jeśli Twoim celem są DRY i SRP, nie będzie miało znaczenia, czy metody wydają się nieco zbyt długie ... chociaż najczęściej przekonasz się, że im bardziej czytelny jest twój kod, tym krótsze są twoje metody stanie się naturalnie.
S.Robins
11

To jest przybliżone

Tego rodzaju zasad nie należy brać zbyt dosłownie. Mogliby powiedzieć, że „ metody powinny być krótkie ”. Jednak niektórzy interpretowaliby to jako „mniej niż 1 stronę”, a inni jako „najwyżej 2 linie”.

Zakładam , że powiedzieli „7 stwierdzeń”, aby dać ci ogólny pogląd (choć myślę, że powinni byli powiedzieć „około 7”). Jeśli potrzebujesz od czasu do czasu 9, nie przejmuj się. Ale jeśli zdobędziesz 20, będziesz wiedział, że nie masz odpowiedniego pola do gry dla tej reguły.

Nathan Long
źródło
Dzięki temu jest to dość wyraźne przybliżenie. Jest oznaczony w „Wytycznych, których nigdy nie należy pomijać i powinien mieć zastosowanie do wszystkich sytuacji”.
brian
1
@brian - może autorzy wytycznych przypadkowo pominęli słowo „z grubsza”, a może byli szalonymi dyktatorami. Mój punkt jest, że PO powinien wziąć to jako liczbę stadiony. Każda reguła, której kompilator lub tłumacz nie wymusza, jest tylko sugestią.
Nathan Long
„Każda reguła, której kompilator lub tłumacz nie wymusza, jest tylko sugestią” Niekoniecznie prawda. Nie przyjrzałem się jego niestandardowym regułom resharper lub fxcop i czy faktycznie egzekwują tę konkretną regułę, ale są firmy, które zmuszają cię do sprawdzenia poprawności zgodnie ze wszystkimi wytycznymi stylu. Spotkałem ludzi, których firma zmusza ich do pisania kodu, który może spełnić surowe wytyczne Microsoft dotyczące kodowania.
brian
Zgadzam się, że jest to przybliżone i powinno być wzięte ziarenkiem soli, ponieważ akapit normy kodowej przywołujący dowolną liczbę nieuchronnie spowoduje zamieszanie. W większości przypadków standardy są usuwane z kontekstu, a „ludzie” przyjmą to arbitralne zbliżenie jako dogmat.
Spoike
10

7 to liczba całkowicie dowolna, absolutnie bez znaczenia.

Złożoność cykliczna jest większym problemem niż liczba stwierdzeń. Widziałem kod, który zawierał setki instrukcji w jednej metodzie (co uważałem za okropne), ale miał cykliczną złożoność 1 i naprawdę tylko jedną rzecz. Było tylko wiele kroków. Dyskutowaliśmy o podzieleniu go na mniejsze metody, ale metody te można by wywołać tylko za pomocą tej jednej metody.

Chociaż jest to dość ekstremalny przypadek, chodzi o to, aby zachować SUCHY kod i niską złożoność cykliczną. Jest to ważniejsze niż liczba linii w metodzie.

Weźmy na przykład instrukcję switch / case. Jeśli masz więcej niż 7 możliwych wartości, musisz podzielić ocenę na wiele metod? Oczywiście, że nie, to byłoby głupie.

Sztuczne dzielenie kodu na więcej metod w celu utrzymania liczby instrukcji poniżej 7 tylko pogarsza kod.

Wytyczne powinny być następujące: Każda metoda powinna zrobić jedną rzecz i zachować SUCHY kod.

Jim McKeeth
źródło
1
+1: Arbitralne limity są przydatne tylko arbitralnie. Metoda powinna zawierać jedną spójną operację na jednym poziomie abstrakcji. Złamanie takiej jednostki atomowej powoduje, że kod jest bardziej złożony, co utrudnia jego zrozumienie.
Allon Guralnek
SUCHA jest zawyżona. Dość często oznacza to ścisłe połączenie dwóch aspektów czegoś, co nie powinno być tak ściśle powiązane.
Brad Thomas
4

Cóż, to trochę zależy. Piszę dużo kodu, który ma dostęp do baz danych. Kod płyty kotłowej do obsługi wyjątków ma w wielu przypadkach więcej niż siedem instrukcji. Powiedziałbym, że najlepszą wskazówką jest upewnienie się, że twoja funkcja ma jeden cel

Jaydee
źródło
8
Nie możesz wyodrębnić kodu szablonu na własną metodę?
erjiang
Zauważyłem po opublikowaniu, że jest to C # nie Java, ale myślę o takich rzeczach. stackoverflow.com/questions/321418/…
Jaydee
@erjang: możesz. Jest to bardzo brzydkie w Javie, ponieważ musisz zawinąć każde zapytanie w anonimową klasę, ale nadal warto to zrobić. Nie tak brzydkie w C # i zdecydowanie warte zrobienia.
kevin cline
Osobiście uważam, że kilka dodatkowych wierszy kodu linii jest bardziej czytelnych. Ale może to tylko ja.
Jaydee
@Jaydee Połączone pytanie pokazuje powszechną, ale dziwną praktykę: zawijanie wyjątku i rejestrowanie. Na następnym poziomie możesz zrobić to samo ... w ten sposób pojedynczy wyjątek pojawia się wiele razy w dzienniku. Lepiej byłoby zadeklarować metodę rzucania i zapisałeś 3 linie. Napisać metodę zamykania zarówno pomocnika psi rsi zapisać kolejną. Lub napisz metodę, List<Row> readDb(String sql, Object... args)która wykonuje całe zadanie (działa tylko w przypadku dopasowywania zestawów wyników do pamięci, ale pobranie zbyt dużej ilości danych zwykle oznacza, że ​​i tak należy wykonać pracę w bazie danych).
maaartinus
4

Wszystko jest kompromisem. Problem z proponowanym podejściem - refaktoryzacją na kilka metod i klas, tak aby każda metoda była krótka - polega na tym, że chociaż z różnych powodów prowadzi do nieczytelnego kodu, gdy doprowadzi się do skrajności.

Wyobraź sobie metodę, foo()która robi 7 rzeczy. Możesz argumentować, że 7 rzeczy to za dużo. Może w wielu przypadkach masz rację. Z drugiej strony te 7 rzeczy mogą być ściśle powiązane; logika może płynąć płynnie i czytać jak proza; możesz nie mieć problemów ze zrozumieniem, kiedy naprawdę potrzebujesz. To, co może skończyć się znacznie gorzej, to mieć te 7 rzeczy rozmieszczonych w dużym drzewie źródłowym, więc jeśli spojrzysz na foo()nie, nie masz pojęcia, co on robi bez patrzenia w 7 różnych miejscach.

Wiele osób ma takie zasady w głowie, a efektem tego jest spaghetti OO. Wszystko jest schludne, zapakowane we własną małą metodę lub klasę, w każdym miejscu występują małe atomowe mikro-transakcje. Ale nie da się odświeżyć takiej bazy kodu i wiedzieć, co ona robi. Zgubiłeś się.

asveikau
źródło
4

to nie jest zła wskazówka. Nigdy nie żałowałem, że dzieliłem metody i klasy (nigdy nie zauważyłem, że miałem ich zbyt wiele), o ile są wystarczająco zgrupowane i powiązane ze sobą.

Sztuczka polega na tym, aby NIE rozdzielać jej w pionie (po prostu uszczypnij metodę w jednym punkcie i uruchom nową). Sztuczka, podobnie jak w przypadku testów jednostkowych, polega na tym, aby od początku pamiętać o takiej zasadzie, aby właściwie projektować lepiej, przekazując 3 lub 4 instrukcje w połowie metody do innej metody, ponieważ wywołanie metody opisuje to, co robisz lepiej niż te 3 lub 4 instrukcje w środku kodu.

Ten rodzaj podziału, nawet jeśli jest arbitralny i użyty tylko raz, może prowadzić do lepszych refaktoryzacji później ze względu na nową przejrzystość kodu, dotyczy to również mniejszych klas.

Pomyśl o tym jak o testowaniu jednostkowym. Jeśli spróbujesz dodać testowanie jednostek po fakcie, że jest to trudne, a czasem wydaje się niemożliwe, ale jeśli projektujesz go od samego początku, poprawia cały kod.

Podsumowanie? Porównując zapach projektowy „Użyj mniej niż 7 instrukcji” z zapachem kodu „Użyłem więcej niż 7 instrukcji”, wolałbym wyeliminować zapach kodowy.

Bill K.
źródło
4

Łał! Nigdy nie spodziewałem się tak intensywnej dyskusji na prostej wytycznej, która z grubsza mówi, że twoje metody powinny być bardzo małe. Ponieważ zawsze są programistami, którzy chcą, aby ich wytyczne były wyraźne, wybrałem 7, ponieważ brzmiało to jak niezły próg.

Niektórzy z was cytowali już zrzeczenie się odpowiedzialności na początku dokumentu. Ale dla jasności, ten dokument stanowi zbiór wskazówek, które próbują pomóc Ci napisać lepszy kod i zaprojektować lepsze systemy. Nigdy nie twierdziłem, że cokolwiek powinno być regułą, mimo że wytyczna jest oznaczona jako poziom 1. Poziomy te są po prostu zbiorową opinią wielu osób, które korzystają z tego dokumentu od jakiegoś czasu.

Nigdy też nie twierdziłem, że jestem ekspertem. Ale jestem w tym zawodzie od 15 lat, z około 4-letnim doświadczeniem w C ++ i 11-letnim doświadczeniem w C #. Pierwotnie był oparty na przemysłowej sile C ++, ale od tego czasu udoskonalałem go przy wsparciu społeczności.

Niezależnie od tego, chciałem poruszyć kwestię, że powinieneś myśleć sam za siebie. Jeśli uważasz, że wytyczna dotycząca 7 stwierdzeń nie jest przydatna, po prostu przedłuż ją. Cholera, czasem nawet naruszam tę wytyczną. Po prostu naruszam to świadomie i akceptuję konsekwencje.

Dennis Doomen
źródło
3
Miło z twojej strony, że się w to wpakowałeś, i myślę, że uzasadniasz to. To powiedziawszy, nie zgadzam się z twoim uzasadnieniem: „zawsze są programistami, którzy chcą, aby ich wytyczne były wyraźne”: nie zawsze możesz zaspokoić idiotów i nie powinieneś próbować. Wyraźne określenie wytycznych jest dobre, o ile nie czyni ich to niepoprawnymi: teraz nie jest już wytyczną, jest arbitralną zasadą. Wprowadzanie dowolnych liczb, jak widzieliście, jest martwym sposobem na zestrzelenie i uzasadnienie.
Konrad Rudolph
3

Po pierwsze: jest to wytyczna, a nie reguła. Nazywa się to wytyczną, więc traktuj to jako takie. Oznacza to, że wymagany jest również Twój własny osąd (jak zawsze)

Poza tym mogę wymyślić wiele przykładów dobrego kodu, który nie przestrzega tego ograniczenia. Chociaż jest to tylko wskazówka, jest kiepska.

Dominic Cronin
źródło
2

Zgadzam się ze stwierdzeniem nade mną. To tylko wytyczne, a w idealnym świecie wszystko byłoby przedmiotami, ponownie wykorzystywanymi w każdym programie, a świat byłby pięknym miejscem. Nie zawsze jest to prawdą i czasami prowadziłoby to do dużych kosztów ogólnych lub marnowania zasobów. Musisz o tym również pamiętać.

Falcon165o
źródło
6
„Zgadzam się ze stwierdzeniem nade mną” Unikaj tego rodzaju zdań na stronach wymiany stosów. Pamiętaj, że kolejność zamieszczania odpowiedzi nie musi być kolejnością, w jakiej są wyświetlane.
luiscubal
Wiem, nie myślałem o tym, dopóki nie było za późno. Ale nadal będę Cię dawać +1 za wskazanie mojego pierdzenia w mózgu.
Falcon165o
2

Całkiem głupie, gdy dodasz obsługę wyjątków do mieszanki.

Po „spróbuj złapać, w końcu” masz cztery instrukcje na metodę!

Weź również pod uwagę metodę „validateForm” dla formularza 20 pól, nawet jeśli obsłużysz wszystkie indywidualne sprawdzania poprawności w oddzielnych metodach, nadal masz 20 metod sprawdzania poprawności pól. Zgodnie z tymi wskazówkami skończyłbyś się bezsensownym podziałem, takim jak „validateTopOfScreen”, „validateMiddleOfScreen” i „validateBottomOfScreen”.

James Anderson
źródło
Myślę, że całkiem bezpiecznie jest powiedzieć, że try/ catch/ finallynie są instrukcjami w języku C #. Patrz Ecma-334 § 12.3.3.15 i sekcje otaczające. (w skrócie) „ instrukcja typu try-catch-wreszcie : spróbuj try-block catch (...) catch-block-n wreszcie wreszcie-block
CV
Cóż, jak powiedziałem wcześniej, to decyzja, którą musisz podejmować w kółko. Jednak twój konkretny przykład może być przykładem nieprawidłowego wykonania projektowania obiektowego. Możesz podzielić ekran na wiele elementów sterujących, które same sprawdzają poprawność.
Dennis Doomen
@Dennis - prawda, zbyt długo tworzyłem formularze HTML!
James Anderson
@James I do tego właśnie służy ta konkretna wytyczna. Usiłując wymyślić alternatywne, potencjalnie lepsze rozwiązania.
Dennis Doomen
2

Pytanie polega na połączeniu „reguł” z „wytycznymi”. Reguły powinny być przestrzegane - wytyczne to porady, które mają skłonić cię do zastanowienia się nad tym, co robisz i czy naprawdę można to zrobić lepiej.

Powiedziałbym, że większość programów jest prawdopodobnie ulepszona dzięki przestrzeganiu wytycznych, ale zawsze będą przypadki, w których dogmatyczne stosowanie wytycznych spowoduje więcej problemów, niż zamierzano rozwiązać. Dlatego nie są one przedstawiane jako reguły, ale jako wytyczne.

Poprzedni odpowiadający wykazał, że autorzy wytycznych nigdy nie zamierzali stosować ich w sposób dogmatyczny, i zamieścili w tym dokumencie oświadczenia w tej sprawie.

Authentictech
źródło
0

Zgadzam się z powyższymi komentarzami. 7 dla mnie jest arbitralne i może być przydatne w niektórych językach, w których ruby, ale dla języków takich jak C #, Java, C ++ wątpię w tę konwencję „7 linii”. Dam ci przykład: moja obecna aplikacja ma 22 pola tekstowe i sprawdzam poprawność po stronie serwera. Ta metoda nazywa się validateInput (), a moją preferencją jest sprawdzanie poprawności wszystkich pól w samej metodzie, chyba że sprawdzę coś złożonego, na przykład checkEmailFormat (). Tak więc w zasadzie mój kod metody validateInput ma 108 linii z okazjonalnymi wywołaniami złożonej weryfikacji.

Teraz wyobraź sobie, że zadzwoniłem do 25 metod w celu sprawdzenia poprawności każdego pola. Jeśli pojawi się nowy programista, będzie musiał wejść i wyjść z głównej metody, aby przejść przez 25 metod, które z kolei mogą wywoływać kilka innych. Z pewnością zgubi się w dużych projektach.

To, co naprawdę robię, aby mój kod był przejrzysty, to dostarczanie czystych komentarzy, które w zasadzie mówią, co robią te 4 linie, np.

validateInput (użytkownik UserObj) {

// Potwierdź imię ....... ......

// sprawdź nazwisko ...... ......

// sprawdzanie poprawności wiadomości e-mail ..... // zbyt skomplikowane, aby sprawdzić format wyrażenia regularnego checkEmailFormat (); .... .....

i tak dalej.. }

Dinesh Arora
źródło
1
Zobacz także moją odpowiedź na pytanie Jamesa Andersona. W twoim konkretnym przypadku zastanawiam się, czy ta metoda sprawdzania poprawności nie narusza jednocześnie kilku zasad i wytycznych.
Dennis Doomen
0

Zła reguła. W przypadku kodu obsługi wyjątków, ustawiania pól bazy danych, sprawdzania poprawności, w jaki sposób większość metod może mieć mniej niż siedem instrukcji? Czy nigdy nie powinniśmy wykonywać wbudowanych funkcji lambda?

Linie kodu to dowolna liczba złożoności. Metodami rozszerzenia mogę tworzyć podobny kod

                Parallel.ForEach(regions, region => {   Console.Write(region.Resorts.Where(x => x.name == "Four Seasons").OrderBy(x => x.RegionId).ThenBy(x => x.ResortId).ThenBy(x => x.name).ToList());   });
Justin
źródło
Ponownie świetny przykład robienia zbyt wiele za pomocą jednej metody. W prawie każdym kontrargumentie ludzie naruszają zasadę pojedynczej odpowiedzialności (w kontekście metody).
Dennis Doomen
-1

Wszyscy młodsi programiści powinni być zmuszeni do przestrzegania tej zasady. Zmusiłoby ich to do zastanowienia się nad strukturą tego, czym są zajęci, zamiast dodawania coraz większej liczby wierszy kodu.

Obecnie patrzę na metodę 550 wierszy kodu z dużą ilością instrukcji if else i kontynuuje i zwraca utkane w nim. To bzdura. Gdyby programista był zmuszony myśleć tylko o tym, co robi ...

dawidg
źródło