Napsat kus kódu je jedna věc, napsat ho ale tak, abyste se v něm po čase vyznali, to už vyžaduje určitou znalost toho, jak by měl takový přehledný kód vypadat. Pavel Růžička vám poradí, co všechno byste měli dodržovat.

Píšeme-li zdrojový kód programu, skriptu, nebo třeba soubor kaskádových stylů, měli bychom dodržet určitou přehlednost kódu. Stroji, který náš kód zpracovává, je do jisté míry jedno, jak náš kód vypadá vizuálně, pokud je syntakticky správně. Doba, kdy se pro ušetření paměti psalo více příkazů na jeden řádek, je již také pryč. Někteří z programátorů mají často zažité určité nevhodné zásady pro úpravu (vzhled) kódu, začínající nezřídka nemají zásady žádné a kopírují jen určité způsoby, které vidí v různých příkladech – a bohužel ani tyto nejsou vždy psány nejlépe. Důvod psaní kódu přehledně je jasný – nejen, že se v něm snadno zorientuje i jiný programátor, ale i sám autor se snáze vyzná ve svém díle, když se k němu po určité době vrátí, protože je potřebuje upravit.

Článek navazuje na články o řádném zápisu JavaScriptu a kódu v ASP. Zde uvedená pravidla jsou psána s přihlédnutím k PHP, ovšem řada pravidel je použitelná všeobecně, například i při psaní souborů CSS, JSP a dalších.

Nejprve malá ukázka – který kód je přehlednější?

  1. if (x == y) {
        doA();
         x = y = z = 0;
    } else {
        doB();
    }
  2. if (x == y)
    {
        doA();
        x = y = z = 0;
    }
    else
    {
        doB();
    }
  3. if (x == y) { doA();
                       x = y = z = 0;
                    }
    else {doB()}
  4. if (x == y) { doA();  x = y = z = 0; }
    else {doB()}

Třetí a čtvrtá ukázka je jen odstrašujícím příkladem relikvie, jakou sem tam můžeme zahlédnout u programátorů, kteří kdysi dávno programovali v Pascalu. První ukázka je způsob, se kterým se nejčastěji setkáme mezi programátory, ale i v různých příkladech na internetu. Zkušenosti však ukazují, že mnohem přehlednější a tedy nejlepší je druhý způsob. Pokud je zanořeno více podmínek a výkonná část obsahuje více příkazů, pak je při použití prvního způsobu nutné stránkou rolovat nahoru a dolů pro nalezení odpovídajících uzavírajících závorek:

if (x == y) {
   if (b == c) {
   }
} else {
   if (d == e) {
           z = b;
   }
   if (z == a) {
       for (i = 0; i < 10; i++) {
       }
   }
}

Třetí a čtvrtý způsob zápisu kódu je v takovém případě velmi obtížné procházet, nelze jednoduše určit, které závorky uzavírají kterou část podmínky.

Vezmeme-li v potaz předchozí poznatky, vyplynou nám pro psaní kódu následující pravidla:

  1. uvádí se pouze jeden příkaz nebo výraz na jednom řádku, vyjma případů, kdy spolu příkazy úzce souvisí
  2. složené závorky začínají a končí na stejné úrovni odsazení

    if (x == y)
    {
        doA();
        x = y = z = 0;
    }

  3. v konstrukci case se každý blok navíc odděluje prázdným řádkem

    switch (x)
    {
    case 1:
        doA();

        break;

    default:
        doB();
    }

  4. při použití ?: se dlouhé výrazy píší raději každý zvlášť na nový řádek

    (podmínka) ? funct1() : func2();
      nebo
    (podmínka)
      ? dlouhý_výraz
      : jiný dlouhý výraz

  5. operátory by měly být odděleny zleva i zprava mezerou, vyjma operátorů . a -> a takzvaných unárních operátorů, například x++ (odsazení u těchto operátorů, které mají vyjadřovat bezprostřední vazbu, by bylo spíše matoucí). Odsazovat vše, co se ocitne v závorkách, není zrovna nejvhodnější, pokud však nejde o parametry funkce, je vhodné oddělit mezerou i výrazy v závorkách za klíčovými slovy, například po if, while a podobně.
    Příklad možného oddělování:

    if ( x == y )
    {
        x++;
        z = x * 1.125 + 10;
        timer->tick();
    }

    Příklad chybného (ne)oddělování:

    if(x==y){
     z=x*1.125+10;
    }

  6. odsazování bloků kódu:
    • vzhledem k chování různých editorů je pravděpodobně nejvhodnější používat 4 mezery pro každou úroveň
    • není vhodné používat tabelátory, některé editory je nezobrazují korektně a také tisk zdrojového kódu s tabulátory může být problematický
    • odsazuje se dle potřeby, ale ne více, než je nezbytné – nadbytečné odsazení učiní kód méně čitelným, zvláště pokud se konce nadbytečně odsazených řádků nevejdou do viditelné části okna editoru
    • pokud je kód příliš zanořen v odsazení, je paradoxně možné zcela zrušit odsazení (jestliže se v místě, kde bychom předpokládali odsazený blok, objeví blok zcela neodsazený, bude souvislost zřejmá a navíc umožníme snadnější čtení části, která by se jinak ocitla mimo viditelnou část obrazovky)

    function func()
    {
      if (something bad)
     {
         if (another thing bad)
        {
            while (more input)
            {
             }
         }
      }
    }

  7. bloky deklarací nebo bloky definující podobné hodnoty se zarovnávají tak, aby svisle „lícovaly“, tedy aby se při čtení kódu nacházely například znaky „$“ pod sebou:

      var      $mDate
      var&   $mrDate
      var&   $mrName
      var      $mName

      $mDate     = 0;
      $mrDate    = NULL;
      $mrName  = 0;
      $mName   = NULL;

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

1 Příspěvěk v diskuzi

Odpovědět