Dokumentowanie kodu źródłowego

Dokumentowanie kodu źródłowego
RE
  • Rejestracja:około 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:66
0

Ja tak w nawiązaniu do podobnego tematu sprzed ponad roku.
Dokumentowanie kodu

To jak to w końcu jest - warto a może nie warto dokumentować kod za pomocą przeznaczonych do tego narzędzi np. JSDoc (JS), Documentation comments (C#), Javadoc (Java)? Nie pogardziłbym ciekawą analizą z punktu widzenia poważnych (nie)komercyjnych projektów i skromnych programików tworzonych w ramach samodzielnej nauki. Czy docs comments pomagają czy bardziej przeszkadzają?

W moim odczuciu takie komentarze dokumentacyjne (tak to się formalnie nazywa?) to pewna pomoc dla obcującego z kodem, ale ja jestem niedzielnym teoretykiem amatorem, dlatego wolę zapytać praktyków z doświadczeniem. Jeśli ktoś chce to może wypowiedzieć się również na temat zwykłych komentarzy, ale wiadomo - ponoć lepiej ich unikać, ponieważ kod ma być samoopisujący się itd. itp.

AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:około godziny
  • Postów:3561
5

Zwolennicy kodu jako się dokumentującego (dobre nazwy itd) moim zdaniem nie w 100% maja rację, nawet dobra nazwa parametru nie (zawsze) opisuje w pełni semantykę.
Zwłąszcza w funkcjach bibliotecznych, gdzie użytkownik w 95% nie sięga do ciała metody

jednak co do kodu "otwartego" "żywego" w tym sensie, ze aktualnego dla zespołu, w znacznym stopniu mogę się z nimi zgodzić.


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 1x, ostatnio: AnyKtokolwiek
RE
  • Rejestracja:około 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:66
0

Myślałem, że rozpocznie się ciekawa dyskusja, a tu na razie cisza :P

AK
To może najpierw zadaj KONKRETNE pytanie, o co NAPRAWDĘ w twoim kontekście chodzi.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Nie wiem czy warto czy nie, ale w 99% przypadków jak juz jest taka dokumentacja to nie mówi nic więcej niż wynika z sygnatury funkcji. Chyba jedyna sytuacja kiedy mi to pomaga to jak jakiś śmieszek w pythonie zrobi funkcje która przyjmuje kwargs i nie wiadomo co tam w ogóle można przekazać.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
4

To zależy. Przy dobrej jakości kodu w większości przypadków wystarczy odpowiednie nazewnictwo etc. ale czasem warto dodać jakąś dokumentację techiczną w bardziej złozonym przypadku. Należy też dodać że dobre testy też są swojego rodzaju dokumentacją kodu.


RE
W takim razie jak nie bezpośrednio kodzie to w czym taką dokumentację zrobić?
AK
To może najpierw zadaj KONKRETNE pytanie, o co NAPRAWDĘ w twoim kontekście chodzi. A poza kodem to sobie wyobrażam TYLKO dokumentację pozorną, na jakiś wiwat
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8398
4
revenger napisał(a):

To jak to w końcu jest - warto a może nie warto dokumentować kod za pomocą przeznaczonych do tego narzędzi np. JSDoc (JS)

JSDoc --> TypeScript

w sensie, że JSDoc wygląda jakby ktoś bardzo chciał mieć statyczne typowanie i potrzebę opisania każdego parametru funkcji bardziej niż sam JavaScript to umożliwia. Czyli usecase dla TypeScriptu.


somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Wrocław
2

Kodu dokumentować nie warto (w sensie pisania co każda linijka robi), ale publiczne API jakiejś klasy/modułu już tak - bo często jednak sama nazwa klasy/funkcji nie mówi wszystkiego o tym, co się stanie, ani jakie są jej ograniczenia i wymagania.

RE
Właśnie miałem na myśli opisywanie tylko klas, metod, interfejsów itp. za pomocą przeznaczonych do tego narzędzi.
AK
JAKICH / KTÓRYCH klas, metod? Kodu zespolu ? Biblioteki? API jako się rzekło ?
somekind
publiczne API to chyba dość jasna definicja?
S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
2

W takim razie jak nie bezpośrednio kodzie to w czym taką dokumentację zrobić?

Czasami warto bezpośrednio w kodzie. Ale ważniejsza jest na ogół dokumentacja biznesowa, czyli jeśli masz np. kantor walutowy (#PDK) to powinno być biznesowo opisany sposób naliczania prowizji za wymianę, jakiś limit darmowych przelewów/wymian walutowych, jak działa jakaś automatyczna wymiana walut, jakie są rodzaje przelewów etc. I to jest ważna dokumentacja ;)


edytowany 1x, ostatnio: scibi_92
AK
Tak, ale to inna opowieść, INNE narzędzia, mówisz w znacznym stopniu o dokumentowaniu KONFIGURACJI
AS
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad rok
  • Postów:21
1

Ja się staram stosować do zasad opisanych w rozdziale 3 "Use comments wisely" w Java by Comparison

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4706
3

Jeśli chodzi o komentarze - dawno zauważyłem, że ich nie czytam - nie widzę nawet, że są takie w kodzie. (a czasem mógłbym zaoszczędzić troche czasu, gdybym przeczytał...)
Eksperymenty (wsadzania prowokacyjnych komentarzy do kodu) pokazują, że prawie nikt nie czyta. Mózg programisty, nauczony wieloma rozczarowaniami, się sam uczy komentarze ignorować.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
TR
  • Rejestracja:ponad 7 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:700m n.p.m.
  • Postów:677
2

Ja dokumentuje niemal każdą linijkę kodu i to bardzo opisowo. Kiedy później np. po roku-dwóch wracam do kodu, pracuje się komfortowo vs sytuacja gdzie mamy ciurkiem kod bez żadnych wyjaśnień, i trzeba wszystko analizować.

W sytuacji kiedy produkuję dziennie po kilka tysięcy linii, nie wyobrażam sobie robienia tego w inny sposób. Wiadomo, że są schematy, nazewnictwo funkcji i zmiennych, znana struktura, etc. jednak komentarze znacznie przyspieszają poprawki w starym kodzie.

Wg. mnie warto trochę się zatrzymać, i poświęcić czas na komentarze - i to nie tylko dla czytania później, ale w trakcie do wyjaśniania samemu sobie co ja robię, taki loopback w umyśle dodatkowo dbający o jakość kodu.

Co więcej, komentując nad linią i robiąc odstęp powyżej komentarza i poniżej linii, kod staje się naturalnie bardziej przejrzysty.


DRY > SOLID (nie bierz tego zbyt poważnie)
edytowany 5x, ostatnio: TomRZ
Zobacz pozostały 1 komentarz
TR
Komentarz nieaktualny? Nie rozumiem. Jeżeli coś zmieniam w danej linii, to aktualizuje komentarz jeżeli trzeba. Jeżeli zmienia się sposób działania całej funkcji, to zmieniam opis ogólny funkcji.
AK
Widocznie masz szczególnie ułożoną psychikę, samodyscyplinę. A jak tego dnia jeszcze 3x zmienisz funkcję ?
TR
Za każdym razem aktualizacja opisu i komentarzy. Ja nie piszę kodu na wyścigi, i po wielu latach praktyki zauważyłem, że pisząc kod wolniej i z komentarzami jestem kilka razy bardziej produktywny niż kiedy siedzę ze ściśniętym tyłkiem zestresowany i klepię byle szybciej. Od dawna tak nie robię, wyjątkowo tylko jak mam wenę twórczą, i nie chcę stracić myśli/pomysłu, to piszę ciurkiem, ale potem wracam do kodu i go komentuje.
TR
Po drugie - tą samo dyscyplinę wymusiła praca, ja się taki nie urodziłem, kiedyś byłem roztrzepany. Jak pisałem - piszę nawet i kilka tysięcy linii kodu dziennie, przy takiej ilości, samo życie wymusza dobry przejrzysty kod z komentarzami, inaczej utopiłbym się we własnej pracy.
TR
Zresztą dalej jestem trochę roztrzepany ale mam sposób - po prostu wracam do tego co robię po kilka razy i poprawiam do czasu aż będę zadowolony. Podobnie z postami na forum - jakbyś zauważył, często je edytuje, do czasu, aż nie będę wystarczająco zadowolony.
RE
  • Rejestracja:około 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:66
0

@AnyKtokolwiek:
Zapytałem ogólnie czy jest sens tworzyć komentarze dokumentacyjne. Kontekst ogólny, dowolna technologia, po prostu robię projekt i zastanawiam się, czy opisać każdą klasę, metodę, parametr metody, interfejs...

Pierwszy lepszy przykład z Javy, bo dla C# nie potrafiłem znaleźć fajnego odpowiednika.

Kopiuj
/**
* Returns an Image object that can then be painted on the screen. 
* The url argument must specify an absolute <a href="#{@link}">{@link URL}</a>. The name
* argument is a specifier that is relative to the url argument. 
* <p>
* This method always returns immediately, whether or not the 
* image exists. When this applet attempts to draw the image on
* the screen, the data will be loaded. The graphics primitives 
* that draw the image will incrementally paint on the screen. 
*
* @param  url  an absolute URL giving the base location of the image
* @param  name the location of the image, relative to the url argument
* @return      the image at the specified URL
* @see         Image
*/
public Image getImage(URL url, String name) {
    try {
        return getImage(new URL(url, name));
    } catch (MalformedURLException e) {
        return null;
    }
}

Bardziej rozbudowany przykład
https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/io/Console.java

AK
Pierwszy lepszy przykład No właśnie nie "pierwszy". Publicznych ? O charakterze bibliotecznych ? Pewnie tak. Dynamicznie żyjącego kodu projektu ? 99% nie, tylko wyjątkowe miejsca
crejk
  • Rejestracja:ponad 6 lat
  • Ostatnio:dzień
  • Postów:46
7

Komentarze są bardzo ważne.

obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
6

Szczerze jeszcze nigdy nie zdarzyło mi się trafić na przydatny komentarz. Szybciej dotrę co się dzieje czytając kod niż komentarz. Opis argumentów metody to co innego, zwłaszcza w publicznej bibliotece wręcz niezbędne; nie za każdym razem zaglądam do dokumentacji, fajnie jak w takim opisie jest przykład użycia jeśli nie jest jasny i skrajne zachowania.
Tak więc jestem za opisywaniem funkcji / metod, ale przeciw komentowaniu każdej linii kodu - dobre nazewnictwo i krótkie funkcje robiące tylko to co sugeruje nazwa wystarczają. Komentarze w kodzie używam tylko jeśli coś jest naprawdę dziwne, jest użyty jakiś workaround albo api z którego się korzysta ma nieoczywiste efekty uboczne.
No i odczywistą dokumentację typu:

Kopiuj
 @param  name   name of sth
 @param  age   age
 @return      result

można sobie odpuścić, a niestety bardzo często coś takiego widuję

Komentarze za to się czasami przydają jako zakładki - przykładowo w kodzie obecnego projektu ktoś dodał komentarz "dla Marka" - nie mam pojęcia o co chodzi i jakiego Marka, ale ten komentarz jest o 10 linii od bardzo przydatnego do debugowania miejscu i często go wyszukuję, bo nie pamiętam nazwy klasy, ani metod, za to pamiętam ten komentarz :)

Kiedyś słyszałem że zwolnili chłopa za nieczytelny kod - niestety odmówił komentarza


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 2x, ostatnio: obscurity
RE
Dzięki. Faktycznie, sam zastanawiałbym się co wpisać dla takich parametrów, bo wydają się oczywiste.
katakrowa
  • Rejestracja:około 10 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Chorzów
  • Postów:1670
3

Faktycznie na frontendach JS+HTML bardzo rzadko mam jakieś komentarze bo nie ma co komentować przerzucania danych z lewa w prawo i każdy i tak siadając do takiego kodu ogólnie wie co się w nim dzieje i czego się spodziewać. Jednak w backendach gdzie mamy już głębszą styczność z logiką biznesową to czasem nawet krótki komentarz ręczny jest niezbędny.

Dla mnie podstawą są zwykłe komentarze opisujące co robi dany moduł lub funkcja oczywiście w zależności od jej złożoności. Systemy komentowania zapewne ułatwiają poruszanie się po IDE i samym kodzie ale ogólnej idei biznesowej już ze sobą nie niosą i jak po 8 latach siadamy do kodu nie pamiętając logiki biznesowej to jest klapa.
Także samodokumentujący się kod to wg mnie mrzonka... Chyba, że mówimy o jakiś banałach. W tym co robię większość rzeczy ociera się o specjalistyczną wiedzę i bez odpowiedniego komentarza kodu zwyczajnie nie da się zrozumieć, a samo zrozumienie poszczególnych funkcji i tak daje niewiele.
Przykładowo jeśli masz np. funkcję obliczającą jakąś składkę z zaokrąglaniem do pełnych 5zł to bez odpowiedniego komentarza taką funkcję można potraktować jako błąd. Wg mnie komentarz uzasadniający jej zachowanie jest niezbędny.
Natomiast w miejscach, w których zostały wykonane głębsze nieintuicyjne optymalizacje taki komentarz jest już obowiązkowy.


Projektowanie i programowanie. Hobbystycznie elektronika i audio oszołom.
elwis
  • Rejestracja:ponad 18 lat
  • Ostatnio:8 dni
3

W przypadku biblioteki zewnętrznej, nad którą nie pracuję, dobra dokumentacja to podstawa. Jeśli chodzi o dokumentację kodu, nad którym pracuję, jeszcze chyba nie zdarzyło mi się pracować w projekcie, który posiadałby sensowną dokumentację. Tylko czytanie kodu+RE ;)

Co do kodu który piszę, raczej nie piszę komentarzy (z wyjątkiem sytuacji kiedy mamy coś co trudno wyrazić kodem). Raczej stawiam na małe samodzielne kawałki kodu, które można w miarę łatwo ogarnąć. Nie ma nic gorszego niż kilka tysięcy linii wzajemnie powiązanych zmiennych i wywołań funkcji (no chyba że kilkadziesiąt tysięcy powiązanych zmiennych, wywołań i goto). Wywołanie funkcji/metody powinno być jedynym sposobem wyrażenia zależności miedzy takimi kawałkami kodu. Wtedy jakoś idzie dojść co z czym się wiąże.


edytowany 3x, ostatnio: elwis
Zobacz pozostały 1 komentarz
elwis
Nie, lubię mieć dokumentację typu lista klas i wywołań jakiegoś API. Jak czytam kod to przeważnie nie ma tam pożytecznych komentarzy. Czasem jakiś opis modułu, co robi… Takie rzeczy też piszę z projektowymi wytycznymi. A co do samego kodu wyznaję zasadę, że nie pisać w komentarzach rzeczy, które wynikają wprost z kodu. Jako że staram się pisać kod tak, żeby takich rzeczy nie było, to nie ma wielu komentarzy. Bo komentarz to koszt.
TR
Oczywiście ja też nie piszę oczywistych rzeczy, tylko czasem lepiej napisać komentarz, niż zmienną składającą się z 5 słów, po to, żeby wyjaśnić po co ona jest.
elwis
Nie mam takich nazw. Wydaje mi się, że jak takie coś masz to funkcje/klasy/metody nie są właściwie podzielone, za duże, itp. Pojedyncza odpowiedzialność na określonym poziomie abstrakcji. To jest kluczowe.
TR
Może bardziej nazwy metod nie zmiennych. Nawet przy SOLID etc. jak uważam, że warto komentować, ale to już jak kto woli.
TR
Mam coś takiego u siebie: \inopx\os\ServiceDetectOS::isWindows() - niby wszystko wiadomo, ale ja wolę dodać komentarz do metody :)
PanamaJoe
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 3 lata
  • Postów:310
5

@revenger:

No co Ty, pogieło CIę? Jak udokumentujesz, to Cię zwolnią i na Twoje miejsce zatrudnią skończoną ilość studentów, bo będzie wiadomo o co chodzi w tym kodzie. Do emerytury daleko, a te młode Cię zaraz wygryzą.


A poza tym sądzę, że bootcampy należy zniszczyć.
TR
Za ironię dałem kciuka
RE
Na razie nikt nie ma z czego zwolnić, bo jak coś tworzę to tylko hobbystycznie :P
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
5
katakrowa napisał(a):

Także samodokumentujący się kod to wg mnie mrzonka... Chyba, że mówimy o jakiś banałach. W tym co robię większość rzeczy ociera się o specjalistyczną wiedzę i bez odpowiedniego komentarza kodu zwyczajnie nie da się zrozumieć, a samo zrozumienie poszczególnych funkcji i tak daje niewiele.

Pracowałem przy projektach ze złożoną logiką biznesową i nigdy nie było takiej potrzeby, ewentualnie odniesienie do jiry która dokumentuje dokładnie zachowanie - komentarze w kodzie raczej czegoś takiego i tak nie zastąpią bo mowa o wielu dokumentach z diagramami, odtwarzanie takiej wiedzy z komentarzy w kodzie jest raczej daremne. Zresztą i to jest raczej często zbędne bo gdy jakaś logika jest niejasna to zazwyczaj wystarczy blame i wyciągnięcie jiry z treści commita. Zazwyczaj konkretną logiką zajmuje się konkretna klasa i jej zachowanie jest opisane w opisie klasy, nie ma potrzeby komentować poszczególnych linii kodu.

Przykładowo jeśli masz np. funkcję obliczającą jakąś składkę z zaokrąglaniem do pełnych 5zł to bez odpowiedniego komentarza taką funkcję można potraktować jako błąd. Wg mnie komentarz uzasadniający jej zachowanie jest niezbędny.

W podanym przykładzie funkcja może po prostu zaokrąglać, a "5" byłoby jej argumentem więc nikt nie potraktowałby czegoś takiego jako błąd, a komentarz jest zbędny. Ewentualnie nazwa funkcji może mówić że zaokrągla do pełnych piątek. Jeśli funkcja nazywa się "round" i zaokrągla domyślnie w ten sposób to rzeczywiście wtf, nawet z komentarzem w kodzie. Masz jakiś inny przykład?

** * “It should be noted that no ethically -trained software engineer would ever consent to write a DestroyBaghdad procedure.
Basic professional ethics would instead require him to write a DestroyCity procedure, to which Baghdad could be given as a parameter.” * **

― Nathaniel S. Borenstein


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 4x, ostatnio: obscurity
TR
  • Rejestracja:ponad 7 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:700m n.p.m.
  • Postów:677
3

Tak przy okazji dzielenie kodu na małe kawałki / klocki zamiast monolitu oczywiście jest jak najbardziej pożądane, tylko nie bardzo zastępuje komentowanie, jak ktoś wyżej napisał.

Otóż nawet jeżeli podzieli się kod na jak najmniejsze logicznie części, to później mamy odwołania do tych części, które też wymagają komentarza.

Samo wyjaśniające się nazewnictwo zmiennych, klas, metod nie jest w stanie zawsze zastąpić komentarzy.

Co więcej komentowanie ułatwia też później zautomatyzowane budowanie dokumentacji API.


DRY > SOLID (nie bierz tego zbyt poważnie)
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 11 godzin
  • Postów:5107
3

hacki w kodzie wypadałoby komentować

edytowany 1x, ostatnio: WeiXiao
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 14 godzin
  • Postów:3277
3

W mojej dotychczasowej praktyce, komentarze w kodzie wielokrotnie potrafiły mnie wprowadzić w błąd, nie przypominam sobie natomiast przypadku, żeby w czymś pomogły. Podobne zdanie mam o pisaniu javadoca do każdej możliwej metody.
Wyjątki:

  • Zewnętrzne API bibliotek - clean code tu nie wystarczy.
  • hacki, lepiej jak ich nie ma, ale jak są, to dobrze jest mieć komentarz dlaczego jakaś niepotrzebna linia się znalazła w repozytorium
  • metody / klasy o nieoczywistych wymaganiach, stałe, dlaczego jakaś stała to 2.76645, albo że 3 linie obliczeń matematycznych biorą się z jakiegoś twierdzenia/wzoru. Patrząc na sam kod, czasami ciężko się domyślić, że chodzi o twierdzenie Pitagorasa...

Ciekawostka w metodzie, gdzie Sonar zgłosił ostrzeżenie o cognitive complexity ponad miarę:
//NOSONAR If we split this method it would to be harder to read

WO
  • Rejestracja:ponad 6 lat
  • Ostatnio:5 miesięcy
  • Postów:10
3

Trochę bez sensu pisać komentarze do każdej linijki, wtedy w niczym nie pomogą. W takich przypadkach wywalam regexpem komentarze z całego pliku i staram się dojść do logiki na podstawie samego kodu. Otwieram wersję oryginalną obok i zaglądam tylko aby upewnić się, że komentarz nie dotyczy czegoś ważnego.

Słabe jest też duplikowanie logiki w komentarzu, bo to kod ma opisywać logikę, pisać drugi raz komentarz jest raczej bez sensu, bo wtedy przy zmianie logiki trzeba pamiętać o zmianie obu rzeczy. Pisanie komentarza jako notatkę dla siebie za 6 miesięcy też raczej warto sobie darować.

Opisywanie podejścia, albo historii podejść, albo dlaczego tak a nie inaczej, dla mnie ma duży sens. Bo jeśli ktoś spędził tydzień na researchowaniu problemu i napisał jakąś implementację, a potem przychodzi junior i chce to refactorować bo wie lepiej, to wtedy taki napisany komentarz może juniorowi oszczędzić trochę czasu ;).

AK
Włąśnie, komentarza "dlaczego tak" często są pozytywne - gdy komentarze w typie "co to jest" maja wartość jak "to jest kura" (boska scena!!!)
TR
  • Rejestracja:ponad 7 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:700m n.p.m.
  • Postów:677
0

Ok, z tą każdą linią może trochę przesadziłem.

Wklejam przykładowy kod PHP, jedna z metod:

Kopiuj
  /**
   * Sprawdza dzisiejsze premiery i powiadamia użytkowników, musi być uruchomione w trybie CLI.
   */
  public static function checkTodayPremieres() {
    
    // Sprawdzenie trybu CLI, brak trybu CLI = koniec
    if ( !\inopx\http\CLIChecker::isCLI() ) {
      return;
    }
    
    // PDO
    $PDO = \inopx\db\ConnManager::getDefaultConnection()->getInternalHandler();
    
    // Sprawdzamy dzisiejsze premiery
    $stmt = $PDO->prepare("SELECT * FROM k3_product WHERE date_premiere IS NOT NULL AND DATE(date_premiere) = CURRENT_DATE");
    $stmt->execute();
    $allProducts = $stmt->fetchAll( \PDO::FETCH_ASSOC );
    
    // Brak premier - koniec
    if (!$allProducts || empty($allProducts)) {
      return;
    }
    
    // Iteracja po dzisiejszych premierach i powiadamianie klientów
    foreach ($allProducts as &$product) {
      
      $p = new \k3\product\K3ProductEntity( $product );
      $p->afterFetch();
      self::productHasPremiere($p);
      
    }
    
    
  }

Trochę retorycznie: chyba wygodniej czyta się coś takiego, niż napaćkane ciurkiem bez żadnego komentarza?


DRY > SOLID (nie bierz tego zbyt poważnie)
edytowany 2x, ostatnio: TomRZ
Zobacz pozostałe 7 komentarzy
TR
Popatrzyłem chwilę i już wiem dlaczego masz tak mało gwiazdek: zero komentarzy kompletnie nie wiadomo o co chodzi w kodzie. Proponuje EOT.
KamilAdam
Popatrzyłem chwilę czyli jednak masz czas na dziecinadę?
KamilAdam
już wiem dlaczego masz tak mało gwiazdek: zero komentarzy tak, to jest na pewno główny powód czemu interpreter Brainfucka ma mało gwiazdek :D
TR
Tak bardzo mnie prosiłeś, to chwilę znalazłem, a teraz już koniec. Miłego dnia - o ile to u Ciebie możliwe.
KamilAdam
Teraz to już na pewno będzie miły :D
MD
  • Rejestracja:około 8 lat
  • Ostatnio:30 dni
  • Postów:43
3

Mnie uczono, że kod ma być samo opisujący.
Komentarze dodaję w ostateczności.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
8

@mlody_d i tak jest, co do co robi kod. Komentarze są ok do opisania czemu albo jak. Przykład wyżej od @TomRZ to idealny przykład jak nie pisać komentarzy. np.:

Kopiuj
    // Brak premier - koniec
    if (!$allProducts || empty($allProducts)) {
      return;
    }

To dramat. Wystarczyło zrobić metodę czyBrakPremier() i nie trzeba by pisać komentarza. Podobnie:

Kopiuj
    // Sprawdzamy dzisiejsze premiery
    $stmt = $PDO->prepare("SELECT * FROM k3_product WHERE date_premiere IS NOT NULL AND DATE(date_premiere) = CURRENT_DATE");
    $stmt->execute();
    $allProducts = $stmt->fetchAll( \PDO::FETCH_ASSOC );

Czemu nie zrobić metody fetchTodayPremieres()? o_o
Analogicznie to całe // Iteracja po dzisiejszych premierach i powiadamianie klientów, czemu nie ma metody notifyClientsAboutTodaysPremiers()?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
Zobacz pozostałe 13 komentarzy
KamilAdam
@TomRZ: w tym kodzie co przejmują amerykanie też zostawiasz komentarze po polsku?
TR
Nie, tutaj mam kod swojego polskiego projektu.
somekind
Wyekstrahowanie 15 metod to zadanie na 7,5 minuty.
KamilAdam
@somekind: jak ktoś tego nigdy nie robił to faktycznie może to za pierwszym razem zająć więcej czasu
somekind
Tzn. ja używam IDE do tego. Nawet VS potrafi.
TR
  • Rejestracja:ponad 7 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:700m n.p.m.
  • Postów:677
0

Czemu nie zrobić metody fetchTodayPremieres()? o_o
Analogicznie to całe // Iteracja po dzisiejszych premierach i powiadamianie klientów, czemu nie ma metody notifyClientsAboutTodaysPremiers()?

Oczywiście róbmy osobną metodę dla 3 linijek kodu, i używajmy tą metodę tylko w jednym miejscu. Bardzo rozsądne. LOL


DRY > SOLID (nie bierz tego zbyt poważnie)
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 14 godzin
  • Postów:3277
5

@TomRZ:

Oczywiście róbmy osobną metodę dla 3 linijek kodu, i używajmy tą metodę tylko w jednym miejscu. Bardzo rozsądne. LOL

A dlaczego nie? O "S" z SOLID słyszałeś?

A już mniej konfrontacyjnie:

Kopiuj

  
  public static function checkTodayPremieresAndNotifyUsers() {

      $premieres = checkTodayPremieres();

      notifyAllUsers($premires)
    }

  }

Nie pisałem w PHP 20 lat, pewnie coś się zmieniło, ale chodzi o oddanie idei. Czy potrzebujesz jakiegokolwiek komentarza do takiej metody?

edytowany 2x, ostatnio: piotrpo
TR
Tak słyszałem, ale nie lubię przesadzać, tutaj to przesada.
piotrpo
Wrzuciłem przykład jak ja bym widział taką metodę. Moim zdaniem nie jest to przesada. Jaki jest koszt wprowadzenia metody? Gdzie łatwiej dopisać testy? Co łatwiej przeczytać? Reużywalność, to tylko jeden z powodów do dzielenia kodu na kawałki.
TR
Jak już wspomniałem niżej w komentarzu, nazwa klasy jak i przestrzeń nazw wyjaśniają dokładniej co robi metoda.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
7

@TomRZ ja rozumiem że ciężko przyjąć krytykę, ale co to pokazałeś jest słabe i tyle. Możesz zamyknąc oczy i twierdzić ze tak nie jest, ale powie ci to w zasadzie każdy programista. Gdybyś kiedykolwiek miał code review albo zespól to być o tym wiedział. Powie ci to dowolna książka z serii Clean Code. Powie ci to Sonar i dowolne narzędzie do statycznej analizy kodu. Nie wierzysz? Sprawdź!
Możesz zrobić ankietę na forum z tym kodem i niech każdy oceni co o tym sądzi :)

I nie, komentarze nie są tu największym problemem. Problem to łamanie SOLIDa, mieszkanie poziomów abstrakcji (jakieś operacje biznesowe obok gołych stringów SQLowych o_O), nazwa metody checkTodayPremieres ktora w rzeczywistości zajmuje się wysyałniem notyfikacji... komentarze po polsku to tylko wisienka na torcie.

edit: żeby było jasne, to nie jest nic osobistego. Nikt nie pisze idealnego kodu i każdy z nas ma pewnie kupę komentarzy od reviewerów pod każdy pull requestem. To jest zupełnie normalne i dzięki temu człowiek się rozwija i z czasem pisze lepiej.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
Zobacz pozostałe 3 komentarze
TR
Rozumiem też, że w odróżnieniu od @KamilAdam nie powodowała Tobą złośliwość, tylko chęć pomocy - za co dziękuję, ale nie skorzystam :)
jurek1980
@TomRZ: też piszę w PHP, pisałem na początku podobnie. Przyzwyczaiłem się jednak szybko do zmian bo po prostu po jakimś czasie jak zaglądałem w kod to okazywało się, że takie podejście jest lepsze. Zaczynasz czytać kod jak książkę. Spróbuj a nie będziesz żałować.
TR
Nie mam żadnego problemu z czytaniem kodu. Jeszcze raz powtarzam: nazwa klasy i przestrzeń nazw uzupełniają tą nazwę metody. Owszem sama metoda mniej mówi, ale \k3\client\repository\ServiceInformClient::checkTodayPremieres wyjaśnia mi wszystko. Po drugie nie będę robił osobnej metody dla 3 linijek kodu - gdybym te 3 linijki gdziekolwiek indziej używał to tak, bo działam zgodnie z DRY, ale jeżeli nie, to nie widzę sensu.
jurek1980
@TomRZ: spróbuj, ja też kiedyś nie widziałem.
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:31 minut
  • Postów:3457
5

Kod samodokumentujacy to podstwa. Z drugiej strony nie wyobrażam sobie braku komentarzy dla rzeczy nieoczywistych. Przykładem dla mnie jest chociażby hak matematyczny użyty w quake do liczenia paroboli chyba. Zamiast coś liczyć matematycznie co obciążało CPU to wprowadzili jakiś współczynnik, który to robił z bardzo dużą dokładnością. Ponieważ nawet teraz nie jestem w stanie sobie przypomnieć co i jak to było to tym bardziej ani nie zrozumiałbym wagi tego haka, ani nie pamiętałbym jak działa i dlaczego.

obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
2
TomRZ napisał(a):

Czemu nie zrobić metody fetchTodayPremieres()? o_o

Analogicznie to całe // Iteracja po dzisiejszych premierach i powiadamianie klientów, czemu nie ma metody notifyClientsAboutTodaysPremiers()?

Oczywiście róbmy osobną metodę dla 3 linijek kodu, i używajmy tą metodę tylko w jednym miejscu. Bardzo rozsądne. LOL

:D metody się tworzy głównie dla czytelności a nie z przymusu żeby móc użyć kodu w dwóch miejscach. Co więcej - im mniej użyć metod tym lepiej (poza utilsami)
Zaskoczę Cię też że np uncle bob sugeruje żeby żadna funkcja / metoda NIGDY nie była dłuższa niż 3 linijki i tak - jest to możliwe.

W Twoim kodzie mimo komentarzy nie mam pojęcia co się dzieje:

Kopiuj
    // Iteracja po dzisiejszych premierach i powiadamianie klientów
    foreach ($allProducts as &$product) {

      $p = new \k3\product\K3ProductEntity( $product );
      $p->afterFetch();
      self::productHasPremiere($p);

która z tych trzech linijek niby "powiadamia klientów"?


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 1x, ostatnio: obscurity
TR
self = ServiceInformClient, ServiceInformClient::productHasPremiere - dalej nie rozumiesz? A może nie wiesz co to jest entity, albo afterFetch()? Analfabetyzm funkcjonalny? :)
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)