Niektóre z poniższych stwierdzeń są dość osobiste, choć z pewnym uzasadnieniem, i tak mają być.
Rodzaje komentarzy
W krótkiej wersji ... Używam komentarzy do:
- końcowe komentarze wyjaśniające pola w strukturach danych (poza tymi tak naprawdę nie używam komentarzy jednowierszowych)
- wyjątkowe lub zorientowane na cel wieloliniowe komentarze powyżej bloków
- publiczna dokumentacja użytkownika i / lub programisty wygenerowana ze źródła
Przeczytaj poniżej, aby poznać szczegóły i (być może niejasne) przyczyny.
Końcowe komentarze
W zależności od języka, korzystając z komentarzy jednowierszowych lub wieloliniowych. Dlaczego to zależy? To tylko kwestia standaryzacji. Kiedy piszę kod C, domyślnie preferuję staroświecki kod ANSI C89, więc wolę zawsze mieć /* comments */
.
Dlatego miałbym to najczęściej w C, a czasami (w zależności od stylu bazy kodu) dla języków o składni podobnej do C:
typedef struct STRUCT_NAME {
int fieldA; /* aligned trailing comment */
int fieldBWithLongerName; /* aligned trailing comment */
} TYPE_NAME;
Emacs jest miły i robi to dla mnie M-;
.
Jeśli język obsługuje komentarze jednowierszowe i nie jest oparty na języku C, będę bardziej skłonny do korzystania z komentarzy jednowierszowych. W przeciwnym razie obawiam się, że przyzwyczaiłem się. Co niekoniecznie jest złe, ponieważ zmusza mnie do zwięzłości.
Komentarze wieloliniowe
Nie zgadzam się z twoim przykazaniem, używając komentarzy jednowierszowych, ponieważ jest to bardziej atrakcyjne wizualnie. Używam tego:
/*
* this is a multi-line comment, which needs to be used
* for explanations, and preferably be OUTSIDE the a
* function's or class' and provide information to developers
* that would not belong to a generated API documentation.
*/
Lub to (ale już nie tak często, z wyjątkiem osobistej bazy kodu lub głównie informacji o prawach autorskich - jest to dla mnie historyczne i pochodzi z mojego wykształcenia. Niestety, większość IDE spieprzyło to podczas korzystania z automatycznego formatowania) :
/*
** this is another multi-line comment, which needs to be used
** for explanations, and preferably be OUTSIDE the a
** function's or class' and provide information to developers
** that would not belong to a generated API documentation.
*/
Jeśli to naprawdę konieczne, to komentowałbym inline, używając tego, co wspomniałem wcześniej, dla końcowych komentarzy, jeśli sensowne jest użycie go w końcowej pozycji. Na bardzo szczególny przypadek powrotnej, na przykład, albo udokumentować switch
„s case
wypowiedzi (rzadko, nie używam przełączyć się często), lub gdy dokument oddziały w if ... else
przepływ sterowania. Jeśli to nie jeden z nich, zwykle blok komentarza poza zakresem opisujący kroki funkcji / metody / bloku ma dla mnie większy sens.
Używam ich bardzo wyjątkowo, z wyjątkiem kodowania w języku bez obsługi komentarzy do dokumentacji (patrz poniżej); w takim przypadku stają się bardziej rozpowszechnione. Ale w ogólnym przypadku tak naprawdę służy tylko do dokumentowania rzeczy, które są przeznaczone dla innych programistów i są wewnętrznymi komentarzami, które naprawdę muszą się naprawdę wyróżnić. Na przykład, aby udokumentować obowiązkowy pusty blok, taki jak blok „wymuszony” catch
:
try {
/* you'd have real code here, not this comment */
} catch (AwaitedException e) {
/*
* Nothing to do here. We default to a previously set value.
*/
}
Co jest już dla mnie brzydkie, ale w pewnych okolicznościach tolerowałbym.
Komentarze do dokumentacji
Javadoc i in.
Zwykle używam ich w metodach i klasach do dokumentowania wersji wprowadzających funkcję (lub zmieniających ją), szczególnie jeśli dotyczy to publicznego interfejsu API, i podam kilka przykładów (z wyraźnymi przypadkami wejścia i wyjścia oraz przypadkami specjalnymi). Chociaż w niektórych przypadkach lepiej jest udokumentować przypadek jednostkowy, testy jednostkowe niekoniecznie są czytelne dla człowieka (bez względu na to, jakiego używasz DSL).
Trochę robią mi błędy w dokumentowaniu pól / właściwości, ponieważ wolę końcowe komentarze do tego, a nie wszystkie ramy generowania dokumentacji obsługują końcowe komentarze do dokumentacji. Doxygen na przykład tak, ale JavaDoc nie, co oznacza, że potrzebujesz najlepszego komentarza do wszystkich swoich pól. Mogę to jednak przetrwać, ponieważ linie Java i tak są przez większość czasu stosunkowo długie, więc komentarz końcowy przeraziłby mnie jednakowo, przedłużając linię poza mój próg tolerancji. Gdyby Javadoc zastanawiał się kiedyś nad tym, byłbym o wiele szczęśliwszy.
Skomentowany kod
Używam pojedynczej linii tylko z jednego powodu, w językach podobnych do C (z wyjątkiem kompilacji dla ścisłego C, gdzie tak naprawdę ich nie używam): do komentowania rzeczy podczas kodowania. Większość IDE będzie musiała przełączać się na komentarze jednowierszowe (wyrównane do wcięcia lub w kolumnie 0), i to pasuje do tego, który używa dla mnie przypadku. Użycie przełącznika do komentarzy wieloliniowych (lub wybranie pośrodku linii, w przypadku niektórych IDE) utrudni łatwe przełączanie między komentarzem / odkomentowaniem.
Ale ponieważ jestem przeciwny komentowanemu kodowi w SCM, zwykle trwa to bardzo krótko, ponieważ usunęłam komentowane fragmenty przed zatwierdzeniem. (Przeczytaj moją odpowiedź na to pytanie na temat „edytowanych przez komentarze i SCM” )
Style komentarzy
Zwykle piszę:
- uzupełnij zdania poprawną gramatyką (w tym interpunkcją) w komentarzach do dokumentacji, ponieważ powinny one być czytane później w dokumencie API lub nawet jako część wygenerowanego podręcznika.
- dobrze sformatowane, ale bardziej luźne przy interpunkcji / wielkich literach dla bloków komentarzy zawierających wiele wierszy
- końcowe bloki bez interpunkcji (ze względu na miejsce i zwykle dlatego, że komentarz jest krótki, który brzmi bardziej jak wyrażenie w nawiasie)
Uwaga na temat programowania czytania i pisania
Być może zechcesz zainteresować się programowaniem literackim , przedstawionym w tym artykule przez Donalda Knutha .
Umiejętny paradygmat programowania [...] stanowi odejście od pisania programów w sposób i w kolejności narzuconej przez komputer, a zamiast tego umożliwia programistom tworzenie programów w kolejności wymaganej logiką i przepływem ich myśli. 2 Programy literackie są pisane jako nieprzerwana ekspozycja logiki w zwykłym ludzkim języku, podobnie jak tekst eseju [...].
Literackie narzędzia programistyczne są używane do uzyskania dwóch reprezentacji z literackiego pliku źródłowego: jeden odpowiedni do dalszej kompilacji lub wykonania przez komputer, „splątany” kod, a drugi do przeglądania jako sformatowana dokumentacja, o której mówi się, że jest „tkana” z piśmienne źródło.
Na marginesie i przykład: Framework JavaScript underscore.js , pomimo nieprzestrzegania mojego stylu komentowania, jest całkiem dobrym przykładem dobrze napisanej bazy kodu i dobrze uformowanego źródła z adnotacjami - choć może nie najlepiej użyć go jako referencja API).
To są osobiste konwencje. Tak, mogę być dziwny (i ty też możesz być). Jest w porządku, pod warunkiem, że przestrzegasz konwencji kodu twojego zespołu podczas pracy z rówieśnikami lub nie atakujesz radykalnie ich preferencji i nie żyjesz razem . Jest to część twojego stylu i powinieneś znaleźć cienką linię między rozwijaniem stylu kodowania, który definiuje cię jako programistę (lub jako wyznawcę szkoły myśli lub organizacji, z którą masz połączenie), a przestrzeganiem konwencji grupy o spójności .
:3,7 Align //
aby wyrównać komentarze w wierszach 3-7.