Komentářové minidilema a souvislosti
Jednou z věcí, které se někdy řeší v coding conventions libovolného
většího projektu, je, jaký druh komentářů používat. Konkrétně v jazycích
odvozených od céčka jde o to, zda komentáře zapisovat spíše pomocí //
nebo /* ... */
.
Poslední dobou čím dál tím víc narážím na kód, kde se komentáře typu //
používají i pro komentáře přes více řádků (tj. každý řádek víceřádkového
komentáře začíná //
). Trochu jsem přemýšlel nad tím, proč to tak
je. Důvody jsou různé:
Racionální důvody
Jediným racionálním důvodem pro používání //
, který jsem kdy
slyšel, je, že když se později zakomentovává větší kus kódu, lze ho celý snadno
obalit komentářem typu /* ... */
. Kdyby se takovéto komentáře
vyskytovaly už v kódu samotném, tak by to nešlo.
Myslím, že tenhle důvod není oprávněný, protože stejně dobře jde kus kódu
zakomentovat pomocí spousty //
na začátku každé řádky. Dnešní
editory na to mají příkazy či makra – stačí označit blok kódu a zvolit v menu "comment/uncommetnt"
či něco podobného. "Sám od sebe" to určitě dovede
PSPad,
Eclipse a XEmacs, do
vimu jde tuto funkci doplnit triviálním
makrem; ostatní editory jsem nezkoumal.
Zakomentovávání kódu pomocí //
má navíc jednu nezanedbatelnou
výhodu, totiž že jde provádět rekurzivně. To u /* ... */
možné
není. (Mimochodem, mám neurčitý pocit, že kdysi dávno existoval v Borlandím
céčku přepínač umožňující nastavit u /* ... */
rekurzivní chování,
ale už je to dávno, co jsem ho používal...)
Naopak racionální důvod proti používání komentářů typu //
pro
víceřádkové komentáře je, že se špatně udržují. Při měnění komentářů nestačí
měnit text, ale musí se na každém řádku přidávat a ubírat značky. To samozřejmě
zdržuje a otravuje.
Psychologické důvody
Proč se tedy komentáře typu //
tak často používají i pro
víceřádkové komentáře, když vše zdá se svědčí proti nim? Protože se lépe píší
autorovi kódu! Dlouhý komentář totiž často vznikne jako původně jednořádková
poznámka a zde autor při psaní ušetří několik znaků. Pak se komentář postupně
rozšiřuje a správnou formu už mu nikdo nedá.
Vlastně je to celé speciální případ klasického programátorského problému: optimalizovat kód na psaní (tj. šetřit znaky) vs. optimalizovat kód na čtení a pozdější úpravy. Správné je pochopitelně to druhé, ale málokterý programátor si to uvědomuje, nebo je k tomu nucen – naopak, většinou je na něj vyvíjen tlak, aby dodal funkční kód, jak nejdřív to jde, a tak na nějakou "optimalizaci pro budoucnost" kašle.
(Poznámka pro matfyzáky informatiky a podobně postižené: Pokud vám něco říká pojem amortizovaná složitost, tak už možná vidíte analogii.)
Tohle je mimochodem docela zajímavé téma a zasloužilo by si určitě samostatný článek. Minimálně souvislosti chování programátorů s obyčejnou mikroekonomikou a také teorií her jsou velmi zajímavé. Snad někdy příště.
Hmm, od komentářů jsem se dostal trochu dál, než jsem chtěl :-) Nevadí. Moje
doporučení tedy zní: Používejte /* ... */
tak, jak to jen jde. Z
mého stručného rozboru snad jasně plyne, proč. A pokud jsem ve svých úvahách
něco opomněl, uvítám korekce.