Kommentaar (programmeerimine)

**Kommentaar** on programmeerimises arvutiprogrammi lähtekoodi osa, mis sisaldab inimloetavaid märkmeid. Need märkmed võivad olla olulised programmeerijale, kuid kompilaatorid ja interpretaatorid üldjuhul eiravad neid. Kommentaaride vormistamise reeglid sõltuvad programmeerimiskeelest.

Siin käsitletakse nii programmeerimiskeelte, märgistuskeelte, konfiguratsioonifailide kui ka muid sarnases kontekstis ilmuvaid kommentaare eristamatult, kuna nende põhimõte on sama.

Kommentaare saab kasutada mitmeti: alates koodi varustamisest selgitustega kuni välise dokumentatsiooni tekitamiseni. Kommentaare kasutatakse ka lähtekoodi haldussüsteemide ja teiste väliste programmeerimistööriistade integreerimiseks koodi.

## Ülevaade

Kommentaarid tuleb märkida nii, et kompilaator või interpretaator nad sellistena ära tunneb. Kommentaarid esinevad koodis tavaliselt kas ploki- või reakommentaaridena .

Plokikommentaarid eraldavad koodi sees piirkonna, mis võib ulatuda üle mitme rea. See piirkond määratakse alguse- ja lõputähisega. Mõni programmeerimiskeel lubab kommentaare rekursiivselt üksteise sisse paigutada (näiteks MATLAB), kuid mõnes (näiteks Java) on see keelatud.

Reakommentaar algab kas algustähisega või mingist kindlast positsioonist. Reakommentaaril lõputähist ei ole, sest selleks on rea lõpp. Mõnes programmeerimiskeeles on olemas mõlemad kommentaariliigid, muidugi erinevate tähistega. Näiteks C++-is on plokikommentaari tähisteks `/*` ja `*/`, reakommentaari algustähis on `//`. Mõnes keeles on ainult üht sorti kommentaare, näiteks Ada kommentaarid algavad tähisega `--` ja kulgevad rea lõpuni, seal plokikommentaare pole.

Mõnes interpreteeritavas keeles, näiteks Prologis, kommentaarid formaalselt puuduvad. Nendes saab kirjutada alamprogrammi, mida kunagi välja ei kutsuta, ja selle kehasse kirjutada vajalikud märkused.

## Kommentaaride kasutamine

Kuidas on kõige parem kommentaare kasutada, on vaidlusalune teema . Inimesed pakuvad erinevaid ja vahel vastuolulisi ideid .

Kuna kommentaarid on sisu suhtes paindlikud, siis võib nende abil koodi lisada igasugust teavet, sealhulgas kasutut. Selle vältimiseks nõuab enamik tarkvaraarendajaid ja -analüütikuid kommenteerimise hea tava või koolkonna järgimist. Milles hea tava või koolkond seisneb, on suuresti kokkuleppe küsimus. Laias laastus on igas tarkvaraettevõttes oma stiil.

### Koodi kirjeldamine

Kommentaare võib kasutada kokkuvõtte tegemiseks või programmeerija kavatsuste selgitamiseks. Selle mõtteviisi esindajate arvates on parim viis kommentaare kirjutada lihtsas keeles; vajadus asju üle selgitada võib olla märk, et kood on liiga keeruline ja tuleks ümber kirjutada. 

"Ära kommenteeri halba koodi – kirjuta see ümber." 

"Head kommentaarid ei korda koodi ega selgita seda. Nad selgitavad selle eesmärki. Kommentaarid peaksid selgitama sinu kavatsusi paremini kui kood ise." 

Kommentaare saab kasutada ka selgitamaks, miks mingi osa koodist ei sobi sinna, kus ta on. Seda kasutatakse projektide juures, kus on vähe aega arendustegevuseks või kui parandatakse vigu. Näiteks: 
 
```vb
' Second variable dim because of server errors produced when reuse form data.
' No documentation available on server behavior issue, so just coding around it.
 vtx = server.mappath("local settings")
```


### Algoritmi kirjeldus

Mõnikord sisaldab programm uudseid või märkimisväärseid lahendusi mingile probleemile. Sellisel juhul võivad kommentaarid sisaldada selgitusi kasutatud meetodi kohta. Need selgitused võivad sisaldada diagramme ja matemaatilisi tõestusi. Seda võib lugeda koodi selgitamiseks, mitte koodi eesmärgi kirjeldamiseks. Inimesed, kes tegelevad koodibaasi hooldamisega, võivad selliseid selgitusi ülitähtsateks pidada, eriti kui lahendatakse väga erilisi probleeme või kui kasutatakse haruldasi lihtsustusi, konstruktsioone või ülesandeid. 

Näiteks võib programmeerija lisada kommentaari, selgitamaks, miks kasutati vahelepanemisega sortimist kiirsortimise asemel, kuigi esimene on teoreetiliselt aeglasem kui teine:
 
```java
list = [f (b), f (b), f (c), f (d), f (a), ...];
  // Need a stable sort. Besides, the performance really does not matter.
  insertion_sort (list);
```


### Andmete lisamine koodi

ASCII-kunsti abil saab koodi sisestada ja kommentaarina vormistada logosid, diagramme, vooskeeme ja muud . Autoriõiguste kohta käivad hoiatused võivad samuti lähtekoodis kommentaaridena olla. Binaarandmed võivad esineda koodis kommentaarina, kuid see on haruldane ja tavaliselt paigutatakse need eraldi faili. 

Järgmine koodilõik on lihtne ASCII diagramm, mis kujutab protsessivoogu süsteemi haldusskriptis Windows Script File, mis jookseb Windows Script Hostis. Kuigi lõik, kus kood asub, näib kommentaarina, ilmub diagramm hoopis XML CDATA lõigus, mis erineb kommentaarist, kuid võib täita samu ülesandeid . Mõnikord seisneb kommentaaride ja muude süntaksielementide vahe programmeerimis- ja märgistuskeeltes ainult nüanssides. Niederst viitab ühele sellisele juhtumile, öeldes: "Kahjuks võib XML tarkvara kommentaare ebaoluliseks infoks pidada ja need dokumendist kustutada enne selle töötlemist. Selle probleemi vältimiseks tuleb kasutada XML CDATA lõiku." 
 
```xml
<resource id="ProcessDiagram000">
 <![CDATA[
  HostApp (Main_process)
     |
     V
 script.wsf (app_cmd) --> ClientApp (async_run, batch_process)
                 |
                 |
                 V
          mru.ini (mru_history)   
 ]]>
 </resource>
```

Kuigi sarnase diagrammi saab ka kommentaarina lähtekoodi lisada, on siin näidatud, et programmeerija võib allikaid ka muul viisil lähtekoodi kaasata.

### Silumine

On üsna tavaline, et programmeerija mingi koodiosa välja kommenteerib, et see programmis ei käivituks. Seda tehakse laialdaselt programmi testimise ajal. Sealjuures tuleb olla ettevaatlik, sest väljakommenteeritav programmiosa võib ise kommentaare sisaldada, aga kõik keeled ei luba üht kommentaari teise sisse paigutada.
 
```c
if (opt.equals ("e"))
    opt_enabled = true;
  /*
   if (opt.equals ("d"))
    opt_debug = true;
  // */
  //*
  if (opt.equals ("v"))
     opt_verbose = true;
  // */
```

Selles programmilõigus on programmeerija silumisvaliku keelanud. Üksik kaldkriips esimese eraldaja ees on lüliti, mis lubab või keelab plokikommentaari.

### Automaatne dokumentatsiooni tekitamine

Arendustööriistad salvestavad mõnikord dokumentatsiooni ja meta-andmeid kommentaarides . Need võivad sisaldada sisestuspositsiooni automaatseks lisamiseks päisefaili ja käske faili süntaksi esiletõstmiseks  või faili versiooni numbrit . Selliseid funktsionaalse kontrolli kommentaare nimetatakse vahel annotatsioonideks. Dokumentatsiooni lähtekoodis hoidmine on üks viis, kuidas dokumenteerimist lihtsustada ja dokumentatsiooni värskena hoida, kuna dokumentatsioon uueneb siis koos koodiga .

Dokumentatsiooni generaatorite näited on programm javadoc, mis on mõeldud Java jaoks, Ddoc, mis on mõeldud D jaoks, doxygen, mida kasutatakse C++, C, Java ja IDLi jaoks, ning PHPdoc PHP jaoks.

C# ja Visual Basic kasutavad omadust XML Comments, mida loetakse IntelliSense'i abil kompileeritud .NET assemblerist.

## Vaated

Selle kohta, kuidas kommentaare lähtekoodis kasutada, on palju vaateid ja arvamusi . Osa neist on mitteametlikud ja põhinevad isiklikel eelistustel, teised on avaldatud ametlike juhistena .

### Vajadus kommentaaride järele

Asjatundjatel on väga erinev nägemus sellest, millal ja kuidas kommentaare koodi lisada.

Puuduvad kommentaarid võivad muuta koodi mõistmise raskeks, aga kommentaarid võivad segada või olla lausa kahjulikud, kui nad on vananenud, valed või lihtsalt arusaamatud. Mõni asjatundja leiab, et kommentaare tuleb kasutada minimaalselt, sest kood peab iseenesest arusaadav olema . Teised jälle leiavad, et kommentaare tuleb kasutada laialdaselt. On tavaline, et üle poole koodist moodustavad kommentaarid .

Nende kahe vaate vahele jääb veel arvamus, et kommentaarid pole iseenesest kasulikud ega kahjulikud, loeb vaid nende täpsus ja koodiga kaasas käimine. Seda eeldusel, et kommentaarid pole üleliigsed, liiga mahukad, keerulised majandada ega muul viisil segavad.

### Detailsus

Olenevalt lugejatest ja muudest asjaoludest võib koodi detailsus oluliselt erineda. 

Näiteks sobiks järgmine Java kommentaar algajate programmeerijate õpetamisel:
 
```java
String s = "Wikipedia"; /* Annab väärtuse "Wikipedia" muutujale s. */
```

Selline detailsus pole aga kohane reaalse programmi koodis ega muul juhul, kus tegemist on kogenud programmeerijatega. Sellised algelised kirjeldused on vastuolus soovitusega "Head kommentaarid ... selgitavad kavatsust".

### Ebaviisakad kommentaarid

Tuleb ette, et kommentaaride abil maandatakse stressi või räägitakse pahasti arendusvahenditest, konkurentidest, tööandjatest, töötingimustest ja isegi koodi enda kvaliteedist. Paljud asjatundjad peavad seda täiesti kohatuks, eriti kui koodi võib tulevikus vaadata keegi peale algse kommenteerija enda.

Selliseid juhtumeid võib näha internetis lehekülgedel, mis otsivad lähtekoodist roppusi.

Vähemalt sama ebaviisakas on kirjutada segane ja arusaadamatu programmilõik ning kommenteerida seda lausega: "Eks te proovige ära arvata, mida ma siin teen!"

### Kommentaaride turvalisus

Veebidisainis esineb kommentaaridega seotud turvaprobleeme. Pole tavatu, et HTML-i kommentaarid on rakenduse igale kasutajale tavalise tekstina nähtavad. Lõigud koodist, mis on HTML-i mallides välja kommenteeritud, on seetõttu turvarisk.

## Stiil

Kommentaaride kirjutamiseks lähtekoodi on palju stiile. Suurtes projektides, milles tegutseb palju programmeerijaid, lepitakse kommentaaride kasutamise stiil alguses kokku või kujuneb see töö käigus ise. Üldiselt eelistavad programmeerijad stiile, mis on järjepidevad, ei sega, on lihtsad täiendada ega lähe kergesti katki.

Järgmised C-keele kommentaarid demonstreerivad, kuidas kahes stiilis anda edasi sama teavet.
 
```c
/* 
      See on kommentaari keha.
      Esimene variant
 */

 /***************************\
 *                           *
 * See on kommentaari keha.  *
 * Teine variant             *
 *                           *
 \***************************/
```

Isiklik eelistus, programmeerimiskeskkond ja muud asjaolud mõjutavad seda, millist kommenteerimise stiili kasutatakse. Näiteks võib teine variant olla vastumeelne programmeerijale, kes ei kasuta redaktorit, mis kommentaari automaatselt vormindab ja joondab. 

Tarkvarakonsultant ja tehnoloogia asjatundja Allen Holub propageerib kommentaaride joondamist vasaku serva järgi.
 
```c
/* Seda stiili soovitab Holub C and C++ jaoks.
  * See on kirjas teoses "''Enough Rope''", reeglis 29.
  */

 /* See on teine moodus seda teha, samuti C-s.
 ** Niimoodi on kergem kirjutada redaktorites, mis automaatselt ei alusta kommentaari
 ** ülejäänud ridu ühe positsiooni võrra suurema taandega kui kommentaari esimest rida.
 ** Ka seda kasutatakse Holubi raamatus, reeglis 31.
 */
```


### Kommentaarid rea lõpus

Sel juhul eiratakse kogu teksti pärast ASCII märke // kuni rea lõpuni.
  
```c
// begin: Variation Three.
 // -------------------------
 // This is the comment body.
 // -------------------------
```

Eri koodiosade jaoks võib valida eri kommenteerimisstiili. Kui süntaks toetab nii reakommentaare kui plokikommentaare, siis üks võimalus on kasutada reakommentaare ääremärkusteks (toimetamine, struktureerimine) ja plokikommentaare üldisematel teemadel (funktsioonid, klassid, moodulid ja failid). 

### Märgendid

Kommentaarides kasutatakse märgendeid, et tähistada probleeme. Sellised märgendid on tavaliselt süntaksis esile tõstetud ja neid saab leida tavaliste programmeerimistööriistade, näiteks UNIX-i grepiga. Näited:
* **FIXME** – koodi märkimiseks, mis võib vajada ülevaatamist või ümbertegemist
* **NOTE** – dokumenteerimaks koodi sisu ja hoiatuseks probleemide eest
* **TODO** – märkimaks plaanitavaid muudatusi
* **XXX** – hoiatamaks programmeerijaid puudustega või vigase koodi eest.

Märgendid võivad pika aja peale kuhjuma hakata, seega on soovitav nende juurde märkida tegemise aeg ja autor, et järjepidamist lihtsustada.

## Näited

Kommentaaride kirjutamise reeglid erinevad keeleti oluliselt. Paljudes programmeerimiskeeltes on sellele keelele ainuomaseid kommenteerimismooduseid.

### Klassikaline BASIC

See BASIC-koodi lõik on täiesti töökorras programm, milles kommentaarid kirjeldavad programmi tööd. Sellised kommentaarid on mõeldud eelkõige algajale programmeerijale.

```qbasic
10 REM See BASICu programm näitab, kuidas kasutada PRINT- ja GOTO-lauset.
15 REM See täidab ekraani sõnaga "VIKIPEEDIA".
20 PRINT "VIKIPEEDIA"
30 GOTO 20
```

Selle programmi käivitamisel trükitakse ekraanile lõputult sõna "VIKIPEEDIA" (jutumärkideta).

### C

See C koodi lõik näitab sissejuhatava plokikommentaari kasutamist, et kirjeldada tingimuslause eesmärki. Kommentaar sisaldab peamisi termineid ja põhimõtteid ning programmeerija lühikest signatuuri. 

```c
/*
  * Check if we are over our maximum process limit, but be sure to
  * exclude root. This is needed to make it possible for login and
  * friends to set the per-user process limit to something lower
  * than the amount of processes root is running. -- Rik
  */
 if (atomic_read(&p->user->processes) >= p->rlim[RLIMIT_NPROC].rlim_cur
     && !capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE))
     goto bad_fork_free;
```

See näide on T`fork.c` failist Linuxi tuuma lähtekoodis.

### ColdFusion

ColdFusion kasutab sarnaseid kommentaare nagu HTML/XML, kuid kahe kriipsu asemel on selle eraldajates kolm kriipsu. ColdFusioni mootor filtreerib need kommentaarid välja ja neid ei väljastata.

```html4strict
<cfoutput>
   Tere, maailm!<br />
 </cfoutput>
```


### Fortran 90

See FORTRANi koodi lõik näitab, kuidas kommentaare selles keeles kasutatakse.

```fortran
!* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
!* Kõik tähemärgid pärast hüüumärki loetakse kommentaariks.  *
!* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
       PRINT "WIKIPEDIA" ! Fortran 90 võttis kasutusele reakommentaarid.
       END
```


### Java

See Java koodi lõik näitab plokikommentaari kasutamist, et kirjeldada `setToolTipText` meetodit. Selle vormindus vastab Sun Microsystemsi Javadoci standardile ja on mõeldud javadoci protsessoriga lugemiseks.

```java
/**
  * Registers the text to display in a tool tip. The text 
  * displays when the cursor lingers over the component.
  *
  * @param text  the string to display. If the text is null, 
  *              the tool tip is turned off for this component.
  */
 public void setToolTipText(String text) {
```


### Perl

Reakommentaar Perlis ja mitmes teises skriptikeeles algab trellidega (#). Kommentaar alguses nimega shebang ütleb süsteemile, millist interpretaatorit kasutada.

```perl
#!/usr/bin/perl
my $s = "Vikipeedia"; # Annab muutujale s väärtuseks "Vikipeedia".
print $s . "\n";      # Lisab uue rea pärast väljastamist kestades (shells), mis seda automaatselt ei tee.
```


### PHP

Kommentaarid PHPs võivad olla kas C++ stiilis (nii rea- kui plokikommentaarid) või Perli stiilis. PHPDoc on javadocilt üle võetud stiil ja üsna levinud viis PHP koodi dokumenteerimiseks. 

### Python

Kommentaarid Pythonis algavad trellidega "#". Et operatsioonisüsteem teaks, millist interpretaatorit kasutada, algavad Pythoni programmid märkidega `#!`. 

```python
#!/usr/bin/python
# See programm trükib ekraanile "Tere, maailm!". 
print "Tere, maailm!"
```


### Ruby

Üherealised kommentaarid Rubys algavad trellidega "#":

```ruby
See ei ole kommentaar
#See on kommentaar
See ei ole kommentaar
```

Mitmerealised kommentaarid lähevad reserveeritud sõnade "begin" ja "end" vahele:

```ruby
See ei ole kommentaar
=begin
Siin vahel
ignoreeritakse kõike :)
=end
See ei ole kommentaar
```


### SQL

Transact-SQLi süntaks toetab kaht tüüpi kommentaare . Plokikommentaar langeb ühte C++ ja Java plokikommentaaridega.

```sql
/*
See on kommentaari 1. rida
See on kommentaari 2. rida
*/
SELECT COUNT(*)
       FROM Authors
```

Teine kommenteerimise võimalus Transact-SQL-is on reakommentaar, mis langeb ühte Ada kommentaaridega:

```sql
-- See on üherealine kommentaar,
-- millele järgneb teine rida.
SELECT COUNT(*) 
       FROM Authors
       WHERE Authors.name = 'Smith'; -- Märkus: me tahame ainult Smithi
                                     -- See kommentaar ilmub pärast SQL koodi
```


## Viited

## Välislingid
* How to Write Comments Denis Krukovsky (inglise keeles)
* Source Code Documentation as a Live User Manual PTLogica (inglise keeles)
* How to Write Comments for the Javadoc Tool (inglise keeles)
* Doxygen Dokumenteerimissüsteem C, C++-i, JAVA, Objecitve-C, Python'i, IDL'i ja mõningal määral PHP, C# ja D jaoks. (inglise keeles)