Spustit prezentaci

Doporučené postupy v programování

Dokumentace

Vnitřní dokumentace · Komentáře · Popis rozhraní

Lubomír Bulej

KDSS MFF UK

Dokumentace

Vnější – mimo zdrojový kód

Vnitřní – součástí zdrojového kódu

Vnitřní dokumentace

Styl zápisu zdrojového kódu

Samovysvětlující kód (self-documenting)

Příklad: styl jako forma dokumentace

Rozhodovací varianta, méně srozumitelná

(1 x shift) !~ /^1?$|^(11+?)\1+$/

Příklad: styl jako forma dokumentace

Rozhodovací varianta, méně srozumitelná

(1 x shift) !~ /^1?$|^(11+?)\1+$/

Výčtová varianta, jasně srozumitelnější

sub p{$_[0],@_?p(grep$_%$_[0],@_):()}p 2..pop
Doufám, že nadsázka u "srozumitelnější" varianty je dostatečně srozumitelná. Pro zájemce odkazy na zdroje těchto skvělých příkladů:

Příklad: styl jako forma dokumentace

Samozatemňující kód

for ( i = 2; i <= num; i++ ) {
  meetsCriteria[ i ] = true;
}

for ( i = 2; i * i <= num; i++ ) {
  if (! meetsCriteria [i]) {
    continue;
  }

  for ( int j = i * i; j <= num; j += i ) {
    meetsCriteria [j] = false;
  }
}

for ( i = 2; i <= num; i++ ) {
  if ( meetsCriteria[ i ] ) {
    System.out.println ( i + " meets criteria." );
  }
}

Příklad: styl jako forma dokumentace

Samovysvětlující kód

for (primeCandidate = 2; primeCandidate <= primeLimit; primeCandidate++) {
  isPrime [primeCandidate] = true;
}

for (int factor = 2; factor * factor <= primeLimit; factor++) {
  if (! isPrime [factor]) {
    continue;
  }

  for (
    int factorableNumber = factor * factor;
    factorableNumber <= primeLimit;
    factorableNumber += factor
  ) {
    isPrime [factorableNumber] = false;
  }
}

for (primeCandidate = 2; primeCandidate <= primeLimit; primeCandidate++) {
  if (isPrime [primeCandidate]) {
    System.out.println (primeCandidate + " is prime.");
  }
}

Komentáře

Proč psát komentáře?

Vždyť kód vše jasně a přesně říká

Jenže kód je kód...

Cílem komentářů je tedy říct co kód neříká

Příklad: vhodný komentář

Výpočet odmocniny

/*
 * Compute the square root of Num using the
 * Newton-Raphson approximation.
 */
r = num / 2;
while (abs(r - (num / r)) > TOLERANCE) {
   r = 0.5 * (r + (num / r));
}

System.out.println ("r = " + r);
Komentář v příkladu plní oba uvedené cíle.

Příklad: nevhodné komentáře

Výpočet n-té mocniny základu

// set product to "base"
product = base;

// loop from 2 to "num"
for (int i = 2; i <= num; i++) {
  // multiply "base" by "product"
  product = product * base;
}

System.out.println ("Product = " + product);

Druhy komentářů

Opakování kódu

i++; // increment i

Vysvětlení kódu

Značky

Druhy komentářů

Shrnutí sekce kódu

Popis záměru

Dokumentace datových struktur

Druhy komentářů

Věci, co nelze v kódu vyjádřit

Jak efektivně komentovat?

Komentujte při/před psaním kódu

Vyhněte se byrokracii/formalitám

Jak efektivně komentovat?

Vyhněte se špatně udržovatelnému formátování

/***************************************\
* Tohle je sice hezky výrazný           *
* komentář, ale udržovat ho bude malá   *
* noční můra.                           *
\***************************************/

Nenahrazujte version-control systém

očůrávání kódu = potřeba u každé změny do komentáře napsat, kdo (někdy i kdy) ji provedl

Komentujte na úrovni bloků

Hlavní místa pro komentář

Vyhněte se řádkovým komentářům za kódem

Popis rozhraní

Dnes typicky součást kódu

Co na rozhraní dokumentovat?

Viz Effective Java: Programming Language Guide, Item 28.

Viz Effective Java: Programming Language Guide, Item 44.

Příklad: popis rozhraní součástí kódu

Java ~ JavaDoc

public interface List<E> extends Collection<E> {
  /* ... */

  /**
   * Returns the element at the specified position in this list.
   *
   * @param index index of element to return
   * @return the element at the specified position in this list.
   * @throws {@link IndexOutOfBoundsException} if the index is out of range
   *         (<tt>{@literal index < 0 || index >= size()}</tt>).
   */
  E get(int index);

  /* ... */
}

V Javě se na dokumentaci rozhraní používá nástroj JavaDoc. Programátor zapíše dokumentaci do speciálně označených a formátovaných komentářů, které JavaDoc projde a sestaví z nich dokumentaci v HTML.

Výhodou tohoto přístupu je, že dokumentace je pohromadě s kódem a hrozí tedy menší riziko jejího zastarání (kód bude aktualizován, ale dokumentace ne). Na druhou stranu, dokumentace zabírá v kódu dost místa a ztěžuje tak navigaci. Tento problém dnes naštěstí vcelku uspokojivě řeší různá vývojová prostředí.

Dokumentace v JavaDocu trpí značnou mírou byrokracie – např. kromě popisu metody je potřeba popsat zvlášť i její parametry, návratovou hodnotu a vyhazované výjimky, což udělá ze stručného neformálního komentáře na tři řádky poměrně dlouhý kus textu s redundancemi (zde např. popis metody a její návratové hodnoty). Pokud bychom popis některých prvků vynechali, objeví se ve vygenerované dokumentaci prázdné místo, což není moc pěkné. Příliš vhodné není ani použití HTML pro text komentáře, což vede k nutnosti escapování.

Byrokracie při psaní dokumentace vede k tomu, že psaní dokumentace je otravná činnost a programátoři ji tedy často nevykonávají, nejsou-li k tomu nuceni. Neformální komentáře by přitom možná napsali. Opět zde částečně pomáhají vývojová prostředí, která umí připravit šablonu dokumentačních komentářů.