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.