Komentarze „//…” na końcu bloku kodu po} - dobre czy złe? [Zamknięte]

18

Często widziałem takie komentarze:

function foo() {
   ...
} // foo

while (...) {
   ...
} // while

if (...) {
   ...
} // if

a czasem nawet o ile

if (condition) {
   ...
} // if (condition)

Nigdy nie zrozumiałem tej praktyki i dlatego nigdy jej nie zastosowałem. Jeśli twój kod jest tak długi, że musisz wiedzieć, co to }jest za zakończenie, być może powinieneś rozważyć podzielenie go na osobne funkcje. Ponadto większość narzędzi dla programistów jest w stanie przeskoczyć do pasującego wspornika. I w końcu ostatnie jest dla mnie wyraźne naruszenie zasady SUCHEJ; jeśli zmienisz warunek, musisz pamiętać również o zmianie komentarza (w przeciwnym razie może to być nieporządne dla opiekuna, a nawet dla ciebie).

Dlaczego ludzie z tego korzystają? Czy powinniśmy go użyć, czy jest to zła praktyka?

gablin
źródło
W PHP używam alternatywnej składni dla struktur kontrolnychif(condition): ... else: ... endif;
systemovich
@Geoffrey van Wyk - naprawdę? Nigdy nie widziałem, żeby ktokolwiek używał ich poza plikami szablonów. Są niezwykle niestandardowe, ale chyba każdemu z nich.
Craige
4
@Craige: Każdy konstruktor języka natywnie obsługiwany przez PHP nie jest „Niezwykle niestandardowy” - interpreter PHP określa, co to jest „standard”.
Billy ONeal
Ada ma specyficzne markery koniec większości konstruktów: if ... then ... end if; while ... loop ... end loop; procedure Foo is ... end Foo;. Uważam, że pomaga to w czytelności (i jest sprawdzane przez kompilator, których komentarzy nie ma).
Keith Thompson

Odpowiedzi:

32

Powiedziałbym, że jeśli kod jest tak długi, że nie można łatwo śledzić nawiasów klamrowych, kod wymaga refaktoryzacji w większości języków.

Jednak w językach szablonów (takich jak PHP) może to być poprawne, ponieważ możesz mieć duży blok HTML, który oddziela początek i koniec warunku lub strukturę pętli.

Matt Ellen
źródło
5
Całkowicie ważny punkt dla PHP, jeśli używasz PHP mieszanego z HTML. 1 punkt za Gryffindor.
3
Nawet z PHP jako językiem szablonów wymieszanym z HTML-em nadal możesz wciąć. Nie powinieneś także używać nawiasów klamrowych, gdy używasz PHP jako języka szablonów, ale raczej while(): endwhile;i foreach(): endforeach;konstruuje itp.
Htbaa
9
Naprawdę nie rozumiem, dlaczego nie powinieneś refaktoryzować PHP. Prawdopodobnie na inny język.
Tom Hawtin - tackline
@Htbaa: Nie mogę uwierzyć, że używałem PHP przez cały czas i nie wiedziałem o nich. Dzięki! Jeśli chodzi o wcięcia, wolę, aby warunkowe HTML było wcięte tak samo jak reszta strony, a nie zgodne z tworzącym go PHP.
Matt Ellen
3
@Tom: Śmiałem się, ale czuję się winny. : P
17

Jest to zapach kodu i zwykle kac ze starego stylu kodu. Przed przyzwoitym refaktoryzacją IDE było trudniejsze i nie tak powszechne jak obecnie, stąd metody były dłuższe i te komentarze były po to, aby pomóc w ich lepszej nawigacji.

Alba
źródło
15

To okropna praktyka, która stała się przestarzała z wielu powodów.

  • Większość współczesnych IDE podkreśla odpowiedni nawias klamrowy, gdy kursor znajduje się na dowolnym symbolu.
  • Jeśli kodujesz czysto, rzadko znajdziesz miejsce, w którym Twoja metoda ma więcej niż 10 linii.

Zauważyłem, że wielu programistów Java ma taki sposób myślenia, co sprawia, że ​​kod Java wygląda naprawdę brudnie i odwraca uwagę od kodu w kierunku komentarzy.

Zdecydowanie odradzam korzystanie z tego.


źródło
4
Mam współpracownika (programistę Java), który to robi. Z wyjątkiem zamiast // for i // jeśli używa // rof i // fi. Doprowadza mnie to do szału i robi to wszędzie.
Jay
Tak, miałem taki, który nalegał. AAAAAGHHHHH.
Przypon
2
To naprawdę nie ma nic wspólnego z Javą ani programistami Java i nie jest to powszechne ani de facto standardowe działanie podczas programowania w Javie.
Jesper,
1
+1,000 za „to okropna praktyka”.
scunliffe,
6

Kod jest odczytywany 10 razy więcej niż jest napisany.

Jeśli to ułatwia czytanie, zrób to.

Sugeruję również każdemu, kto to robi, że powinien przyjrzeć się innym sposobom ułatwienia czytania. Techniki refaktoryzacji, nawiasy na różnych liniach itp., O których wspominali inni ludzie, są dobre. Podział rzeczy na różne funkcje, metody lub klasy, tak aby kod sam się komentował, jest również dobry. Istnieją również sposoby na wyeliminowanie większości „if” i umieszczenie pętli „for” w oczywistych miejscach, eliminując w ten sposób potrzebę tego.

Ale czasami ludzie się uczą. Jeśli robią to coś, co naprawdę czyni kod bardziej czytelnym, zachęcaj go, a następnie zachęcaj do innych praktyk. Ludzie, którzy się uczą, zasługują na zachętę i bez względu na to, jak zaczną. Powiedzenie „To jest złe” nie jest tak przydatne, jak powiedzenie „Ta inna rzecz jest lepsza”.

Lunivore
źródło
6
To jest złe Nawet podręczniki dla początkujących nie robią tego okrucieństwa. „Kod jest odczytywany 10 razy więcej niż jest napisany” ... tym bardziej nie warto marnować czasu czytelnika na ten kod cruft.
Thomas Eding,
@trinithis Co zrobić, jeśli masz instrukcję przełączania 20-literowego? Czasami musisz wesprzeć 20 różnych opcji i lepiej jest zebrać je w jednym miejscu niż „przebudować” w jakiś wielopoziomowy schemat decyzyjny.
quant_dev,
uważam, że jest to praktyka programistów, którzy nie doceniają rówieśników :), że inni nie są wystarczająco mądrzy, aby przeczytać kod, chyba że. ogólnie rzecz biorąc jestem przeciwny tej praktyce, ale dobrze, jeśli ktoś to zrobi, bo jest tam dżungla, która sprawia, że ​​trudno ją odczytać. i tak tego nie robię!
WinW
1
@trinithis Nie chodzi o to, czy jest źle, czy nie, chodzi o skuteczne sposoby pomagania ludziom w poprawie, aby mogli się rozwijać. Być skutecznym> mieć rację. Jest to również całkowicie rozsądna rzecz, jeśli, powiedzmy, refaktoryzujesz starszy kod, który jest jeszcze bardziej nieporządny. Czasami złe rzeczy mogą zrobić lepsze kroki przejściowe i doprowadzić do czegoś jeszcze lepszego.
Lunivore,
1
@trinithis Przepraszamy, nie mogę zrozumieć, co masz na myśli, gdy wszystko jest w jednym wierszu. Myślę, że wspomniałem, że istnieją również inne sposoby refaktoryzacji kodu, których twórcy mogą się nauczyć.
Lunivore,
4

Mam dużą bazę kodu (C ++) pełną tego rodzaju rzeczy:

int Class::AccessorMethod(void)
{
    return privateValue;
}//end AccessorMethod

W przypadku czegoś tak małego powiedziałbym, że wykracza to poza „zapach kodu” w „smród kodu”. Zwłaszcza w IDE, gdzie mogę dopasować nawias zamykający za pomocą naciśnięcia klawisza, aby znaleźć nawias otwierający. Biorąc pod uwagę dłuższą metodę, nadal biorę dopasowanie nawiasu klamrowego nad komentarzem terminalu. Takie uwagi odwracają moją uwagę i zwykle uważam je za hałas.

Zasilacz
źródło
Wydaje mi się, że nie mam trochę formatowania na tej stronie; każdy nawias klamrowy powinien znajdować się w osobnej linii, podobnie jak treść metody.
PSU,
W C ++ jednak często otwieram anonimową przestrzeń nazw u góry dla ukrytych elementów implementacyjnych. Następnie w pewnym momencie zamykam ten nawias klamrowy i warto wiedzieć, co oznacza tutaj nawias klamrowy.
CashCow
4

W C ++ istnieją dwie blokady, w których jest to nadal przydatne, a porada „podziel swój kod” nie musi wstrzymywać:

  1. Dla przestrzeni nazw. Przestrzeń nazw może obejmować cały plik, a ten ostatni nawias może czasem zrzucić ludzi, więc przydatne jest dodanie komentarza wskazującego, że nawias to zamknięcie przestrzeni nazw. Jest to ważne ze względu na szczególny styl kodowania w mojej firmie, ponieważ nie wcinamy przestrzeni nazw, ponieważ zdecydowano, że takie wcięcie po prostu marnuje miejsce w pliku.

  2. Dla par #ifdef / #endif. Czasami jest tam dużo kodu do kompilacji warunkowej, może być nieprzyjemnie z zagnieżdżaniem, a edytor, którego używamy często „pomocnie”, eliminuje wcięcia, więc komentarze są przydatne podczas szybkiego przeglądu.

Joris Timmermans
źródło
+1 za komentarz do przestrzeni nazw i powody. To jedyny raz, kiedy to robię iz tego samego powodu
JohnB,
+ długie instrukcje zamiany.
quant_dev
1

Dla mnie kod musi być mylący, aby dodać komentarz taki jak ten, który podałeś.

Jeśli tylko mówi // instrukcja IF. Potem musisz się zastanowić, dlaczego tak jest.

TeaDrinkingGeek
źródło
Zgadzam się, wygląda to na linię, która została skomentowana, a nie na starą szkołę//endif
StuperUser
1

Alternatywą do zobaczenia, co zamyka twój aparat ortodontyczny, jest otwieranie go w tej samej kolumnie, co kolumna zamykająca. Uważam to za znacznie jaśniejsze i bardziej czytelne.

Komentarz jest przydatny, gdy normalnie trudno byłoby go prześledzić, ponieważ otwarcie miało miejsce dawno temu. Zwykle powinno to się zdarzyć tylko dla przestrzeni nazw (szczególnie anonimowej w C ++, używanej do szczegółów implementacji w jednostce kompilacji). W większości innych przypadków powinno być oczywiste, co zamykasz.

Dojną krową
źródło
1

Jest to w dużej mierze pozostałość po dawnych czasach pracy w oknach terminalu znaków 80x24, szczególnie jeśli korzystałeś z edytora okien, takiego jak EVE. Nawet teraz większość pracy wykonuję w sesji terminalowej przy użyciu vima i mogę podzielić sesję na trzy lub cztery okna podrzędne, więc naprawdę mogę wyświetlić tylko kilka linii w tym samym czasie.

To powiedziawszy, nigdy tak naprawdę nie rozgrzałem się do konwencji, chociaż uratowałoby to mój bekon przy więcej niż jednej okazji. Po prostu widzę to jako hałas. Jeśli twoje pętle lub warunki warunkowe stają się tak duże, tak, możesz rozważyć refaktoryzację.

John Bode
źródło
0

w zasadzie podajesz wszystkie ważne powody, dla których nie chcesz tego używać. Każdy porządny programista powinien je zastosować. Więc dlaczego nie ludzie go używać? Ponieważ robią to źle i nie wiedzą lepiej.

stijn
źródło
erm, proszę wyjaśnić głosowanie proszę. Nie wymyśliłem tylko tej odpowiedzi, wynika ona z prawdziwych doświadczeń życiowych: mój kolega, który siedzi kilka stóp obok mnie, programuje dla ponad 10 takich uszu i nie miał pojęcia, dlaczego to jest źle, dopóki go nie wyjaśniłem .
stijn
Być może był używany w jakimś podręczniku, więc grupa ludzi wyszła z college'u, żeby go używać? Może mieć miejsce w tekście wprowadzającym. Również uzasadnione w preprocesorze, szczególnie w # ifdef / endif obejmują strażników
Martin Beckett