Czy komentujecie kod?

Wątek przeniesiony 2018-08-24 22:55 z Nietuzinkowe tematy przez somekind.

Aventus
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
0

Na wstepie zaznaczam ze nie dotyczy to komentarzy logiki biznesowej, bo te czasem bywaja nieodzowne. Pracujac przy poprzednim systemie mielismy nakaz komentowania wszystkich publicznych metod, wlasciwosci, klas itp. Do tego kazdy uzywal Ghostdoc, co konczylo sie tym ze np. metoda

Kopiuj
GetFirstItem()

miala komentarz

Kopiuj
Gets first item.

Chyba nie musze mowic ze dla mnie bylo to "troche" bez sensu. Argumentacja byla taka ze z komentarzy jest automatycznie tworzona dokumentacja, ale co to za dokumentacja w takim razie?

W obecnym projekcie komentarzy w zasadzie nie stosujemy w ogole. Sam czasami zastosowalem wyjatek jesli metoda wykonywala jakas bardzo specyficzna, techniczna logike i ciezko bylo strescic jej pelna funkcje w wystarczajaco krotkiej nazwie- oczywiscie metoda sama w sobie byla krotka. Czasami natrafiam na metode czy tez klase ktora ma co prawda jasna nazwe, ale brakuje jednak jakiegos dodatkowe wyjasnienia aby mozna bylo miec pewnosc co do pewnych zachowan bez analizowania kodu. Sa to jednak wyjatki.

Jak to wyglada u Was?


Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
Mjuzik
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Postów:712
2

Swojego kodu właściwie nigdy.. Cudzy kilka razy mi się zdarzyło. Używam takiego nazewnictwa żeby od razu wiadomo było co dany fragment robi

WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 10 godzin
  • Postów:5108
2

Ja uważam, że komentarze powinny być tylko w miejscach nietrywialnych / algorytmicznych lub w miejscach gdzie jest zastosowany jakiś trik, a następnie przejrzyście opisywać "co ten kod robi".

aby nie być gołosłownym zarzucę jakimś przykładem

Kopiuj
float Q_rsqrt( float number )
{
	long i;
	float x2, y;
	const float threehalfs = 1.5F;

	x2 = number * 0.5F;
	y  = number;
	i  = * ( long * ) &y;                       // evil floating point bit level hacking
	i  = 0x5f3759df - ( i >> 1 );               // what the fuck?
	y  = * ( float * ) &i;
	y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
    // y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed

	return y;
}

https://github.com/id-Software/Quake-III-Arena/blob/master/code/game/q_math.c#L552

lub

Kopiuj
int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *p)
{
	(...)
	switch (p->signbits)
	{
	case 0:
		dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
		dist2 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
		break;
	case 1:
		dist1 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
		dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
		break;
	case 2:
		dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
		dist2 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
		break;
	case 3:
		dist1 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
		dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
		break;
	case 4:
		dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
		dist2 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
		break;
	case 5:
		dist1 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
		dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
		break;
	case 6:
		dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
		dist2 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
		break;
	case 7:
		dist1 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
		dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
        break;
	default:
		dist1 = dist2 = 0;		// shut up compiler
		break;
	}

	sides = 0;
	if (dist1 >= p->dist)
		sides = 1;
	if (dist2 < p->dist)
		sides |= 2;

	return sides;
}

https://github.com/id-Software/Quake-III-Arena/blob/master/code/game/q_math.c#L796

edytowany 15x, ostatnio: WeiXiao
Zobacz pozostałe 4 komentarze
WeiXiao
@caer: cieszę się że nic więcej nie napisałem tzn?
caer
powiedzmy tylko że potraktowałem ten kod zbyt poważnie
jarekczek
No właśnie, jak to jest? Fuck można pisać, a "co to prostytutka" nie można?
jarekczek
Forum zamieniło mi k na prostytutka. A fuck puszcza. Czyli mam odpowiedź :)
DB
  • Rejestracja:ponad 9 lat
  • Ostatnio:3 miesiące
  • Postów:227
3

Tj: u mnie wszyscy staraja się unikać na ile to możliwe komentarzy. Założenie jest takie że komentarz jest "błędem" mniej więcej podobnie określa temat "Uncle Bob".

U mnie podejście jest takie:
W pierwszej kolejności co robi kod ma mówić sam kod tj: nazwy/zmiennych/metod itp itd. Jak jest problem żeby to skumać
to unit-testy mają mówić co i jak robi jako swojego rodzaju "dokumentacja".
Komentarz jest 3 krokiem gdy dwa powyższe nie dają możliwości bycia dostatecznie "descriptive".
I komentarze się trafiaja w miejscach gdzie robi się coś teoretycznie nielogicznego lub mało oczekiwanego.
Np: okazuje się że API innego systemu odpowiada w sposób 'totalnie z czapy' albo że jest jakiś graniczny uber-corner case który wymaga jakieś automagicznego obejścia w kodzie. Generalnie elementy kodu których byś sie nie spodziewał w tym miejscu opatrzone są komentarzem.

Nie wiem czy to podejście jest "słuszne" ale myślę że się sprawdza w mojej domenie.
No dzięki temu unikamy sytuacji gdzie pisze się w komentarzach czy docstringach "oczywiste" rzeczy.
A jednocześnie "promujemy" postawe w której unit-testy stanowią dokumentacje systemu. Komentarz ostatnia deska ratunku jak juz nic się nie da zrobic a przypadek jest "beznadziejny".

Dla porównania w poprzedniej firmie w której pracowałem ludzie byli maniakami komentarzy i proste metody na 2 linijki były opatrzone komentarzami na kilkanascie linii do tego stopnia ze z kodu szybciej szło dojść niż z komentarza. W mojej opinii dobrze to wyglądało na papierze i nie było pomocne dla nikogo defacto. Mnie to osobiście troche frustrowalo bo czulem sie jak "developer-dokumentalista" - co więcej tam ludzie promowali komentarze i docstringi wzgledem unit -testu co w mojej opinii było stratą czasu i potencjału ludzkiego. A review ciągnęło się dniami ze względu na to że ktoś uważał że "dokumentacja kodu" jest niepełna ;E

Dodam bo w sumie może mieć to znaczenie, jako zespół piszemy głównie w Pythonie czasami troszke w JS/Go.
Nie ma 'biznesu' czy jak kto woli "logiki biznesowej" klient jest 'wewnętrzny' nie generujemy żadnej 'dokumentacji' z docstringow itp itd.
Może mieć to znaczenie że projekty nasze są raczej niezbyt duże z racji wykorzystania Pythona.

czysteskarpety
czysteskarpety
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Piwnica
  • Postów:7697
0

Po prostu każde skrajności są niedobre i tyle.


0

nie nigdy, po co ułatwiać innym życie? niech trochę pogłówkują

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około 6 godzin
  • Postów:8407
1

Komentarze w 99,9% są niepotrzebne, co nie znaczy, że nie należy komentować w ogóle. Komentarze się niewątpliwie przydają w pewnych sytuacjach, podobnie jak aceton czy denaturat przydają się w pewnych sytuacjach (ale nie do picia!)

Aventus napisał(a):

Pracujac przy poprzednim systemie mielismy nakaz komentowania wszystkich publicznych metod, wlasciwosci, klas itp. Do tego kazdy uzywal Ghostdoc, co konczylo sie tym ze np. metoda

Kopiuj
GetFirstItem()

miala komentarz

Kopiuj
Gets first item.

Takie komentarze to trochę jak picie denaturatu, wymóg dawania ich przy każdej metodzie to jak wymóg codziennego picia denaturatu. Niezrozumienie tego, do czego służą komentarze.

Nie ma 'biznesu' czy jak kto woli "logiki biznesowej" klient jest 'wewnętrzny' nie generujemy żadnej 'dokumentacji' z docstringow itp itd.
Może mieć to znaczenie że projekty nasze są raczej niezbyt duże z racji wykorzystania Pythona.

Docstringi to rak. Nie dość, że traci się czas na pisanie to jeszcze zaciemnia kod oraz nie jest żadną pomocą (jakoś dziwne, że w projektach, których nawet było mnóstwo dokumentacji dosctringach do każdej funkcji i tak musiałem pytać innych programistów o to, "co ten kod robi", ponieważ dokumentacja była zbyt szczegółowa, a nie dawała big picture - co moduł X robi, w jaki sposób działa, w jaki sposób go połączyć z modułem Y. Czyli była g**no warta. Naprawdę, lepiej by było, żeby zamiast dokumentować każdą funkcję, programista opisał po prostu jakieś proste README do danego modułu.

Szczególnie, że te komentarze typu funkcja Foo przyjmuje argument X o typie string to często zwykle taka emulacja statycznego typowania. Prawda jest taka, że wystarczy dodać statyczne typowanie (np. TypeScript zamiast JavaScript*) ew. jakiś silnik inferencji typów i ma się o wiele większą moc w IDE czy czasem już na poziomie wykrywania błędów w kompilatorze. No i sama nazwa parametru dużo zmienia. Ludzie piszą jak głupi komentarze, a wystarczy nazwać parametr w taki sposób, żeby było wiadomo do czego służy.

* (hejtuję statyczne typowanie, ale rzeczy typu JSDoc są jeszcze gorsze, bo to statyczne typowanie dla ubogich).


edytowany 4x, ostatnio: LukeJL
WeiXiao
nie lubisz statycznego? Why?
LukeJL
uważam, że zaciemnia kod i powoduje konieczność pisania i utrzymywania typów co jest dodatkowym kłopotem.
jarekr000000
@LukeJL no ale jak masz inferencję to masz ideał - typy sa i pomagają CI znaleźć błedy, a w kodzie prawie nie ma. (Np. Kod w Scali - robię copy paste JS zmieniam var na val, function na def i mam kod Scalowy :-), z typami ).
hurgadion
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:www
  • Postów:259
0

Hej,
przy krótkich kodach nie komentuję, i nazwy zmiennych raczej mam krótkie, szczególnie jak są pomocnicze, iteracyjne, itd. Przy dłuższych kodach czasem sadzę komentarze, staram się pisać nazwy funkcji tak, aby one coś mówiły, ale największą uwagę zwracam na czytelność kodu, odstępy, wcięcia, to bardzo dużo daje. I bardzo nie lubię ZmiennychKtóreMająDługąNazwęIWieleCzasuTraciSięNaOgarnięcieTakichZmiennychSzczególnieJakJestIchKilkadziesiątAlboKilkaset :)

0

Jestem za komentowaniem nawet prostych fragmentów programu i nie rozumiem dlaczego miałby to być błąd. W programowaniu funkcyjnym, które ostatnimi czasy jest tak uwielbiane komentarze są wręcz konieczne...

0

Jeśli używa się dziwnych znaczeń, to lepiej jak są komentarze.

Przy takim programowaniu gier, gdzie wszystko ma swoją klasę jako oddzielny skrypt i nie ma tam żadnych niezrozumiałych sformułowań, to taki kod czyta się z przyjemnością, a znajduje co potrzeba błyskawicznie.

W innych technologiach to może być już różnie, ale podstawa to dobra struktura katalogów i hierarchia klas.
Wtedy każdy element układanki jest prostą klasą.

Chodź przy reverse engineeringu też bez problemu da się rozkodować nawet trudne algorytmy matematyczne, chodź wydaje się że czasem jest łatwiej niż w spaghetti kodzie, chodź czasem jedno i drugie wygląda jak refaktoryzacja, z czego pierwsze ma lepsze narzędzia dostępne :>

mr_jaro
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Grudziądz/Bydgoszcz
  • Postów:5300
1

U mnie stosujemy zasade, że każda metoda powinna mieć komentarz odnośnie danych wejściowych i wyjściowych, w sensie na wejście nazwa + typ, i na wyjście typ, bo często po kodzie nie widać co to za dane szczególnie w językach dynamicznie typowanych. Natomiast co do typowego komentarza to jeśli ktoś wie, że po nazwie metody inna osoba może mieć problem zrozumieć co się dzieje no to warto dać opis. Zresztą mówicie, że "nie na co opisy" a jak zaglądam do jakiejkolwiek biblioteki/paczki na githubie to każdy fragment kodu jest porządnie opisany.


It's All About the Game.
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
7

@Srebrny Wąż

d. W programowaniu funkcyjnym, które ostatnimi czasy jest tak uwielbiane komentarze są wręcz konieczne...

Może jakieś przykłady na tak ciekawe zdanie? Albo:

heretyk

@mr_jaro

U mnie stosujemy zasade, że każda metoda powinna mieć komentarz odnośnie danych wejściowych i wyjściowych, w sensie na wejście nazwa + typ, i na wyjście typ,

No to odkryliście system typów. Faktycznie jest przydatny. Niektóre języki mają to wbudowane i taką informację używa kompilator do dodatkowego szukania błedów, a IDE do podpowiadania kodu.


Zastanawia mnie ten wątek w 2018, bo myślałem, że sprawa komentarzy została zamknięta tak z 10 lat temu. W większości dobrych języków to smród.

Trochę linków:
https://refactoring.guru/smells/comments
https://softwareengineering.stackexchange.com/questions/1/comments-are-a-code-smell
https://simpleprogrammer.com/why-comments-are-stupid-a-real-example/

Jak ktoś wierzy, że pomaga komentarzami, javadocami i innymi docami to niech wie, że duża część programistów po latach oglądania korpokodu wyrabia sobie wręcz magiczna zdolność nie czytania/ ignorowania komentarzy. Lata rozczarowań (komentarza kłamia) powodują, że kommenty nie trafiają nawet do podświadomości.

Są wyjątki oczywiście:

Komentarze przy bardzo dziwnej logice link z numer emdo JIRY /Taska. Kod pokazuje co robi, ale czasem nie wiemy dlaczego. Biznes wymyślił coś tak głupiego, że trzeba to podlinkować Zwykle jest to cała historia w zadaniu. Nie ma sensu tej historii wklepywac w kod.

Czasami przegrywamy. Bywa tak, że na danym poziomie kodowania nie umiemy czegoś rozsądznie nazwać, poprawić i wtedy wsadzamy komentarz. Takie poddanie się powinno być wyjątkiem. Jeśli się często zdarza to albo używamy za słabego języka, albo jesteśmy trochę za słabi. W drugim wypadku warto poćwiczyć, poprosić o radę. Mi często na review koledzy pomagają nazwać rzeczy dużo lepiej niż w oryginale i potrzeba komentowania znika.

Co do słabego jezyka : w assemblerze niestety trzeba sadzić kommenty (nawet jak mamy dużo makr). W C chyba też czasem trzeba :-(, w JS trudno mi powiedzieć. NIe komentuje, ale raczej staram się JS unikać (TS , ScalaJS). W Whitespace także trudno obejśc się bez komentarzy.

Co do oryginalnego problemu : to wymuszone komentarze ( np. przez review i jakiś tool na CI) to najgorsze bagno. Z tego wychodzi najbardziej nonsensowena, łżąca paplanina, zaciemniająca kod.
Może strolujcie to jakoś : wstawiajcie jako kommenty: kod, lorem ipsum, pseudokod w algolu 68 albo w basicu :-), rymowanki.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 8x, ostatnio: jarekr000000
Zobacz pozostałe 2 komentarze
hurgadion
w BF to chyba bez znaczenia :) natomiast dla mnie bardziej ważne jest aby kod był w miarę czytelny :) natomiast przy wielokrotnym składaniu funkcji w PF kody są krótkie, są zwięzłe, i czasem mają nietypową postać, czasem nawet zaawansowany programista może mieć problemy z ogarnięciem kodu :) funkcyjne kody inaczej się ogarnia :) już nawet nie mówię o jakichś streamach czy monoidach (bo nawet dobrze tego nie znam) :)
jarekr000000
To zdradzę Ci pewne tajemnice. Prawie każdy język i styl jest nieczytelny jak się z nim nie zaznajomisz. Jednym z celów praktycznego pf jest właśnie zwiększenie czytelności. A monoidy, katamorfizmy, funktory i monady służą do poprawienia tej czytelności.
n0name_l
Nie ma sensu tej historii wklepywac w kod. Ta cala historia powinna byc w historii commitow, czy to przez link do jiry, czy opisowo :)
jarekr000000
@n0name_l: tak, tam powinna być zdecydowanie. Ale wpisałem ten przypadek, bo takie komentarze mi faktycznie pomogły szybciej problem rozwiązać. (Niż patrzenie w blame).
hurgadion
jak widać muszę się jeszcze sporo nauczyć :) także chyba na dobre forum trafiłem :) najlepiej mi idzie nauka poprzez forum :) zaczynałem od Excela :) i tam było sporo wymiataczy :) na kursach też się sporo uczę, ale nie ma jak ogarnianie problemów online w czasie rzeczywistym :)
neves
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:Kraków
  • Postów:1114
6

Mój stosunek do pisania komentarzy najlepiej streszcza ten cytat:

"Code can describe how, but it cannot explain why."

i dołączona do niego historyjka:

title

które pochodzą z artykuły The Art of Comments ,
podsumowując, wszelkie komentarze które są w stanie przekazać to czego nie jest w stanie przekazać dobrze napisany kod, są jak najbardziej wskazane.


jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
3

Brakuje mi tu jeszcze jednego przypadku. Komentarz streszczenie: Ta klasa służy do ... Jej główną metodą jest ... Piszę takie komentarze i chciałbym, żeby inni też je pisali. Inaczej trzeba studiować parę stron kodu, żeby załapać ideę.

Może ktoś powie: to nazwij klasę odpowiednio. Ale nazwy klas muszą być krótkie i siłą rzeczy nie zawsze będą samowyjaśniające się.


Przeważnie ignoruję niezarejestrowanych użytkowników.
Zobacz pozostałe 6 komentarzy
hurgadion
Mi się wydaje, że to w dużej mierze zależy od tego, kto będzie czytał (i być może wykorzystywał) ten kod, sposób prezentacji to podstawa, ale trzeba to uzależnić od audytorium. Niby to oczywiste, ale powszechnie się tego nie bierze pod uwagę :)
jarekczek
@DolBo, racja. Chyba jednak muszę przeczytać ten Clean Code. Ciekawe, że to zaprzecza regułom pionierskiego programowania, gdzie należało najpierw mieć wszystkie metody zdefiniowane, żeby móc je wywołać. Dość długo siedziałem w prymitywnym języku, który tego wymagał. Taki custom cbasic. W c też tak było wygodniej. Spróbuję wykorzenić ten nawyk :)
jarekczek
@DolBo, mógłbyś to napisać jako post, w komentarzu zginie, a szkoda.
jarekr000000
@jarekczek: bez przesady - na tym forum najlepsze akcje dzieją się w komentarzach. Większośc to wie . Nie zginie.
hcubyc
IMHO to powinno się ogarnąć modyfikatorem dostępu - jedyna publiczna klasa w pakiecie to najważniejsza klasa, publiczne metody to API pakietu, nieprywatne metody (ale też niepubliczne, w Javie package scope) to najważniejsze metody poszczególnych klas
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:minuta
1

Czytam ostatnio "Clean Code" Robert C. Martin.
Tam jest cały rozdział o komentarzach. Krótkie streszczenie:

  • małe funkcje z dobrymi nazwami są lepsze od komentarzy
  • komentarze mogą kłamać (kod został poprawiony, a komentarz nie został zaktualizowany, a żaden automat nie sprawdzi komentarzy, poza Java Doc/Doxygen)
  • komentarzy powinno być mało
  • komentarze nie powinny: owijać w bawełnę, opisywać oczywistego, być tylko po to by wypełnić jakieś wymagania, opisywać historię kodu, straszyć, być dekoracyjne, zawierać kod
  • komentarze powinny:

Polecam lekturę IMO warto. Pdf bez problemu można znaleźć w sieci.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Michał Sikora
Michał Sikora
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
0

Komentarze w sensie javadocków w aplikacji są moim zdaniem bezsensowne. Czasem trzeba może napisać komentarz wewnątrz metody dlaczego coś zrobiliśmy tak a nie inaczej, ale powinien to być wyjątek a nie rutyna.

Javadocki mają jako taki sens dla bibliotek. Bardzo cenię sobie javadocki do RxJavy, bo często nie muszę komuś tłumaczyć jak działa jakiś operator, tylko mogę mu powiedzieć, żeby nacisnął Ctrl + Q. Nie chciałbym natomiast zajmować się utrzymywaniem takiego kodu. Istny koszmar dla programisty. Lepszym rozwiązaniem wydaje mi się readme i przykładowy kod jak korzystać z blibloteki, jeżli ktoś ma jej zacząć używać.

edytowany 3x, ostatnio: Michał Sikora
DB
  • Rejestracja:ponad 9 lat
  • Ostatnio:3 miesiące
  • Postów:227
1

Dorzuce jeszcze troche odnosnie pkt 2 z powyszego posta ("ze swojego doświadczenia") ze jesli dodajemy do kodu komentarze/docstringi to teoretycznie "powinny" być one ogólne/generyczne w tym sensie żeby w komentarzu unikać hardkodowania konkretnych nazw zmiennych/klas/metod (jesli to mozliwe).

czyli np: zmiana nazwy metody/zmiennej itp na ogół nie powinna wymuszac koniecznosci zmiany docstring-a - spotkałem się z przypadkiem gdzie ludzie w docstringach pewnych metod używali nazw własnych czy nazw zmiennych innych metod. Nie muszę mówić że potem przy zmianie czegoś należało zmienić docstringi w wielu metodach. Oczywiście na review był "Cerber" który tego pilnował ale było to "słabe" i może pomysł czy idea nie były złe ale mało pragmatyczne.

Ów pragmatyzm wynika z tego że: developerzy sa leniwi(powinni być :P) | developerzy nie chca /nie lubia/ zapominaja edytowac docstringi po zmianach i tak robi sie balagan opisany w pkt 2

(troche bzdurny przyklad ale wlasnie mi przyszedl do glowy)
Chcemy zainstalowac klucz publiczny na remote serwerze (wczesniej wygenerowalismy klucze lokalnie ofc) zeby smigac po ssh.

Ktos napisal mniej wiecej cos takiego (pseudokod).

Kopiuj
def send_public_key_from_local_path_to_remote_server(local_path, 
remote_user_login, remote_user_password, remote_server):
    """Copy locally generated ssh keys from local_path to remote_server with 
        using remote_user_login account.  """ 
    cmd = "ssh-copy-id -i {} {}@{}".format(local_path, remote_user_login ,remote_server)
    run_ssh(cmd)
    ...

Ktos bardziej leniwy od poprzednika w to zajrzal i zlapal sie za glowe i mysli omg "Co za pracowity Janusz":
I zabral sie za zmiany i zmienił nazwe funkcji i nazwy zmiennych ogolnie uznal ze lepiej haslo i login
wysylac np: jako jeden obiekty 'credentials' i nawet zmienil to w docstringu ->
extra uznal ze w zasadzie wszyscy z reguly uzywaja kluczy ze sciezki domyslnej wiec mozna
miec metoda z mniejsza ilosc zmiennych.
Ale nieborak zapomnial zmienic nazw wszystkich zmiennych w docstringach zagapil sie jakos mu umknelo wystawil MR
poszlo do review ;D

Kopiuj
def send_public_key(path=None, credentials, server):
    """Copy locally generated ssh keys from local_path to remote_server 
        with using credentials.  """ 
    path = '/home/.ssh/id_rsa.pub' or path
    cmd = "ssh-copy-id -i {} {}@{}".format(path, credentials.login ,server)
    run_ssh(cmd)
    ...

Za review i mergowanie odpowiedzialny jest junior bo Lead jest w Teamie jeden
i akurat jest na urlopie i wroci za 3 tygodnie a wiadomo robota musi iść do przodu.
I BANG "Merge" bez zadnych zmian.

Po 3 tygodniach wraca Lead i przeglada Merge i trafia na ten temat i widzi rozjazd a ze Lead to pewnie sie zna to sobie mysli tak:
Jest rozjazd w docstringach nie zgadzaja sie nazwy zmiennych z rzeczywistym:

I robi TAK:

Kopiuj
def send_public_key(path=None, credentials, server):
    """Copy locally generated ssh keys to remote server. """ 
    path = '/home/.ssh/id_rsa.pub' or path
    cmd = "ssh-copy-id -i {} {}@{}".format(path, credentials.login ,server)
    run_ssh(cmd)
    ...

No i sobie mysli bedzie git teraz jest generycznie i nie ma bledow i rozjazdu... no ale mysli myśli myśli
Nazwa funkcji w sumie jest OK i mowi co robi wiec docstring nic nie wnosi.
Każdy wie jak dziala "ssh-copy-id" na Linuxie i po co to pisać.

Sobie mysli Jestę Lead Developerę i zrobię CIACH
i dopiszę unit testy !

Kopiuj
def send_public_key(path=None, credentials, server):
    path = '/home/.ssh/id_rsa.pub' or path
    cmd = "ssh-copy-id -i {} {}@{}".format(path, credentials.login ,server)
    run_ssh(cmd)
    ...

Przyklad wziety 'z czapy' i mega uproszczony (trzebaby poprawic) ale podobny mechanizm działania widzialem już wiele razy na dużo większą skalę i w dużo bardziej "zaawansowanych" przykładach gdzie ludzie wykonywali nikomu nie potrzebną pracę w komentarzach - nikt tego nie czyta calosc tylko zaciemnia i doklada robote na 'maintenance'. Lepiej poswiecic czas na dobre zmienne nazwy czy dopracowanie unit-testow albo dopisanie kilku scenariuszy testow integracyjnych zamiast tracic czas i zapal na docstringi.

edytowany 1x, ostatnio: DolBo
jarekczek
Podałeś historię błędu w kodzie, ale jakiego? Bo nie zrozumiałem, co tu się stało, a szczerze - jestem zbyt leniwy, żeby to rozkminiać :) I jaki to ma związek z komentarzami, bo widzę, że na koniec wyleciały. A na początku były w ogóle mylące, bo keys to nie to samo co public key. Zobacz też na końcową funkcję: nazwa nic nie mówiąca i brak komentarza. To zaprzecza wszystkiemu, co uznaliśmy za zgodnie prawidłowe.
DB
Błedu w kodzie nie ma w ogole on tu jest nieistotny. Chodzilo mi głównie o ewolucje "docstringa" jedynie na przestrzeni czasu ktory byl w zasadzie od samego poczatku zupelnie nie potrzebny ale wygenerowal tylko ludziom robote nic nie wniósł a potem i tak ktoś w końcu uznał że jest zbędny - dodatkowo hardkowoanie nazw zmiennych/metod w docstringach to zbedna robota naogol prowadzi do zamieszania jak ktos cos zmieni i zapomni zrobic tego we wszystkich miejscach (nazwa funkcji i zmiennych wymagalaby poprawy ogolnie)
jarekczek
IntelliJ szuka wszędzie, również w komentarzach. W pythonie też macie coś takiego jak IntelliJ, jak to się nazywało, PyCharm. Zakładam, że ma takie same możliwości. Tak więc trzeba używać dobrych narzędzi do refaktoringu :) Komentarz bez nazw własnych to jak Kapitan Bomba bez przekleństw.
DB
PyCharm dziala tak samo - ja wiem ze mozna i czasem trzeba sie w tym sie poruszac tylko - po co? W wielu przypadkach mozna uniknac takich dzialan i uproscic zycie sobie i przyszlym pokoleniem osob ktore beda utrzymywac dany system.
Freja Draco
Freja Draco
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
0

Komentarze mam ostylowane jako czarny tekst na błękitnym tle.
Przeważnie używam ich tak:

Kopiuj
// === dzida =============
// --- przeddzidzie ---
...
// --- /przeddzidzie ---

// --- śróddzidzie ---
...
// --- /śróddzidzie ---

// --- zadzidzie ---
...
// --- /zadzidzie ---
// === /dzida =============

Bez właściwego kolorowania to nie wygląda jak powinno, ale w każdym razie idea jest taka, że stanowią nagłówki bloków, więc szukając czegoś wystarczy przelecieć wzrokiem po tych nagłówkach. Odmienne tło, sprawia natomiast, że nie rozpraszają mnie przy oglądaniu właściwego kodu, bo wtedy postrzegam je jako coś w rodzaju ramek. Komentuję pętle, instrukcje warunkowe itp.

Czasami komentuję też pojedyncze linie:
kod kod kod; // robi XYZ
kod kod kod; // używa A nie zaś B, bo to i tamto


hurgadion
Dzidę w sumie możnaby jeszcze wyboldować, wtedy wiadomo by było, że się coś zaczyna. Kolorowanie to dobry pomysł, o ile edytor na to pozwala :) Jakiego edytora/środowiska używasz ??
Freja Draco
Freja Draco
Notepad++. Kolorystykę komentarzy mam ustawioną tak samo w PHP, JS, HTML, CSS i w plikach .htaccess
WhiteLightning
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 12 godzin
  • Postów:3169
0

Przewaznie nie, ale zdarza sie, ale jak zwykle to zalezy:

  • jak robi sie workaround do bledu w czyms zewnetrznym, bibliotece, usludze itp.
  • obliczenia matematyczne, mocno optymalizowany kod, przesuniecia bitowe, wstawki w asm (ale to juz dobrych pare lat nie robilem)
  • czasami w prototypach by potem pamietac co gdzie jak po co itp. bo tam zwykle pisze paskudny kod, byle szybko cos sprawdzic.
  • jak sie naprawia jakies dziwne zachowania w legacy codzie albo dziwnych technologiach. Przyklad system gdzie sporo logiki bylo w XSLT. Tam mozna zapomniec o pokryciu testami i po prostu nie da sie ladnego przejrzystego kodu napisac. Czasami trzeba cos zmienic naprawic w takim projekcie - zombie, gdzie nie ma czystego kodu, pokrycia testami, a robienie z tego clean code nie ma najmniejszego sensu, tam tez komentarze sie przydaja.
  • jak robie cos duzego czasami dodaje sobie tymczasowe komentarze, ale w docelowym commicie one nie ida do repo.
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około 6 godzin
  • Postów:8407
0

duża część programistów po latach oglądania korpokodu wyrabia sobie wręcz magiczna zdolność nie czytania/ ignorowania komentarzy

Fakt, jak widzę JSDoc to go nie czytam zwykle. Po prostu więcej ogarnę z kodu niż w komentarza.

Dla mnie komentarze powinny być traktowane jak reszta kodu - czyli powinno się pisać wtedy, kiedy coś wnoszą (np. tłumaczą kawałek kodu, który może być niejasny), a nie żeby pisać, bo ktoś tak każe albo dlatego, że "tak wszyscy robią" (np. "wszyscy piszą g**no dokumentarze z opisem parametrów do każdej funkcji bo tak jest profesjonalnie, róbmy tak!"). Cargo cult komentarzy, żeby wyjść na profesjonalistę, który pisze ładną dokumentację... bez sensu.

No i też źle się stało, że dokumentacja miesza się z kodem. Jakbym ja robił system do generowania dokumentacji (może kiedyś zrobię), to chyba bym zrobił tak, że dokumentację by się pisało w osobnych plikach (np. Markdown z jakimś dodatkowymi metadanymi) a nie mieszało z kodem produkcyjnym.


edytowany 3x, ostatnio: LukeJL
._.
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:250
4

Czy Ja komentuje kod...?

Oczywiście!! Zawsze na głos przy otwartym oknie tak żeby wszyscy słyszeli.

Szalony Programista
Szalony Programista
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Postów:227
0

Można dokumentację zrobić, z dobrą grafiką w webie, żeby się lepiej czytało i te komentarze można pominąć.
Będą wiedzieć jak działa i jak to wykorzystać, a jak będą chcieli wiedzieć w jaki sposób rozwiązali problem to już sami będą analizować.

AF
  • Rejestracja:prawie 18 lat
  • Ostatnio:18 dni
0
0
Afish napisał(a):

Nick_Craver/status/1030792400837509120

przywołując Einsteina - jeśli ktoś nie umie czegoś opisać prosto to znaczy że tego dobrze nie rozumie

widziałem projekty w którym proste rozwiązania były bardzo przekombinowane i trudne, widziałem też projekty napisane genialnie gdzie trudne rzeczy stawały się trywialne nawet dla początkującego programisty dzięki dobrej architekturze

za radą wujka Boba staram się sprowadzać metody do nie więcej jak trzech linii (!) i nie korzystać z komentarzy - jeśli masz ochotę coś skomentować to zazwyczaj (choć nie zawsze, np w przypadku algorytmów) - lepiej zaznaczyć komentowany fragment kodu i wydzielić go do osobnej metody przy czym nazwa metody staje się komentarzem. Metody prywatne to zazwyczaj ukryte klasy, które powinno się również wydzielić. Przy takim podejściu za darmo dostajesz SRP.
Choć napisanie algorytmu w czytelnych trzech/czterech liniach wymaga dużo więcej myślenia niż zrobienie tego samego w 20 i oczywiście nie zawsze jest na to ochota lub czas.

staram się za to komentować wszystkie publiczne metody interfejsu opisując do czego służy klasa i poszczególne metody, jakiego zachowania można oczekiwać od metody, zwłaszcza jeśli nie jest to jasne bo skrajne przypadki często by było opisywać w nazwie samej metody;
traktuję kod jakby miał się w każdej chwili stać biblioteką bo w praktyce bardzo często się to zdarza w miarę rozrostu projektu - oczywiście tylko dobrze napisany kod może łatwo stać się biblioteką, dlatego jeśli komuś się takie coś nie zdarzyło to nie ma się czym chwalić

hurgadion
taa, a Einstein opisując trójwymiarowy kosmos sam zakrzywił czasoprzestrzeń za pomocą tensorów :)
0
gsdgdf napisał(a):

bo skrajne przypadki często by było opisywać w nazwie samej metody;

miało być trudno, nie często

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)