Oto pytanie, które lubię sobie zadawać, zastanawiając się, czy dodać komentarz do sekcji kodu: Co mogę przekazać, aby pomóc następnej osobie lepiej zrozumieć ogólne zamiary kodu, aby mogli zaktualizować, naprawić lub rozszerzyć to szybciej i bardziej niezawodnie?
Czasami poprawna odpowiedź na to pytanie jest taka, że w tym momencie kodu nie można nic dodać, ponieważ wybrałeś już nazwy i konwencje, które sprawiają, że intencja jest tak oczywista, jak to tylko możliwe. Oznacza to, że napisałeś solidny samodokumentujący się kod, a wstawienie tam komentarza najprawdopodobniej pogorszy, a nie pomoże. (Zauważ, że zbędne komentarze mogą z czasem uszkodzić niezawodność kodu, spowalniając zsynchronizowanie się z rzeczywistym kodem w czasie, a tym samym utrudniając rozszyfrowanie prawdziwych zamiarów.
Jednak w prawie każdym programie i dowolnym języku programowania napotkasz punkty, w których pewne krytyczne koncepcje i decyzje podjęte przez oryginalnego programistę - przez ciebie - nie będą już widoczne w kodzie. Jest to prawie nieuniknione, ponieważ dobry programista zawsze programuje na przyszłość - to nie tylko po to, aby program działał raz, ale także aby wykonać wszystkie jego przyszłe poprawki i wersje oraz rozszerzenia i modyfikacje oraz porty i kto wie, co zrobić działają również poprawnie. Ten drugi zestaw celów jest o wiele trudniejszy i wymaga dużo więcej myślenia, aby dobrze sobie radzić. Jest to również bardzo trudno dobrze wyrazić w większości języków programowania, które są bardziej skoncentrowane na funkcjonalności - czyli na powiedzenie tego, co robi ten wersja programu musi teraz zrobić, aby była zadowalająca.
Oto prosty przykład tego, co mam na myśli. W większości języków szybkie wyszukiwanie małej struktury danych w linii będzie na tyle skomplikowane, że ktoś, kto na nią spojrzy po raz pierwszy, prawdopodobnie nie od razu rozpozna, co to jest. Jest to okazja na dobry komentarz, ponieważ możesz dodać coś o zamiarze kodu, który później czytelnik z pewnością doceni natychmiast jako pomocny w odszyfrowaniu szczegółów.
I odwrotnie, w językach takich jak oparty na logice język Prolog, wyszukiwanie małej listy może być tak niewiarygodnie trywialne i zwięzłe, że każdy dodany komentarz byłby po prostu szumem. Tak więc dobre komentowanie jest z konieczności zależne od kontekstu. Obejmuje to czynniki, takie jak mocne strony używanego języka i ogólny kontekst programu.
Najważniejsze jest to: Myśl w przyszłość. Zadaj sobie pytanie, co jest dla Ciebie ważne i oczywiste na temat tego, jak program powinien być rozumiany i modyfikowany w przyszłości. [1]
W przypadku tych fragmentów kodu, które są naprawdę samo-dokumentujące, komentarze po prostu powodują hałas i zwiększają problem koherencji w przyszłych wersjach. Więc nie dodawaj ich tam.
Ale w przypadku tych części kodu, w których podjęto krytyczną decyzję z kilku opcji lub w których sam kod jest na tyle skomplikowany, że jego cel jest niejasny, dodaj swoją specjalną wiedzę w formie komentarza. Dobrym komentarzem w takim przypadku jest taki, który pozwala przyszłemu programistowi dowiedzieć się, co należy zachować bez zmian - to zresztą koncepcja niezmiennego twierdzenia - i co można zmienić.
[1] To wykracza poza kwestię komentarzy, ale warto o tym wspomnieć: jeśli okaże się, że masz bardzo jasny obraz tego, jak Twój kod może się zmienić w przyszłości, prawdopodobnie powinieneś pomyśleć nie tylko o komentarzu i osadzeniu tych parametrów w samym kodzie, ponieważ prawie zawsze będzie to bardziej niezawodny sposób na zapewnienie niezawodności przyszłych wersji kodu, niż próba użycia komentarzy do skierowania nieznanej przyszłej osoby we właściwym kierunku. Jednocześnie chcesz uniknąć nadmiernej generalizacji, ponieważ ludzie są bardzo słabi w przewidywaniu przyszłości, w tym w przyszłości zmian w programie. Spróbuj więc zdefiniować i uchwycić rozsądne i sprawdzone wymiary przyszłości na wszystkich poziomach projektowania programu, ale nie