Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

12. diel - Najčastejšie chyby Java nováčikov - Vieš pomenovať premenné?

V predchádzajúcom cvičení, Riešené úlohy k 11. lekcii Javy, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V dnešnom Java tutoriále si ukážeme prvé tzv. dobré praktiky programovania v Jave. Nielen nováčikovia ich často porušujú a zanášajú tak do svojich programov zbytočné chyby, nerobíš ich náhodou tiež?

Slovo senior programátora

David Čápka - Základné konštrukcie jazyka Java

Gratulujem k zdolaniu prvých lekcií Základných konštrukcií jazyka Java!

Materiál pre dnešnú lekciu som zostavil na základe 20-ročných skúseností s programovaním. Ako šéfredaktorovi a lektorovi mi rukami prešli stovky, možno tisíce zdrojových kódov vytvorených komunitou. Nebolo ťažké si všimnúť, že väčšina z nich, hoci funguje, obsahuje zbytočné chyby, ktoré sa navyše stále dookola opakujú. Chyby napodiv často robili ako nováčikovia, tak skúsenejší programátori a aj ja som ich robil, keď som začínal.

Prišiel som na to, že základným a mylným predpokladom je:

✗ Program je správne, ak funguje.

Programy a domy

Predstavme si, že staviame dom. To, že sa nám páči a nefúka doňho, neznamená, že je správne postavený. Dom totiž musí mať premyslenú architektúru a pokiaľ nemá základy, o pár rokov sa nám začne zosúvať.

Programovanie je často prirovnávané k stavebníctvu práve s ohľadom na architektúru, tu však ide o tú softvérovú. Vysvetlime si prečo.

Ľudský mozog dokáže naraz pracovať len s určitým obmedzeným množstvom informácií. Zjednodušene môžeme povedať, že ak je program neprehľadne napísaný, od určitej chvíle by musel programátor udržať v hlave viac vecí, než človek vôbec dokáže. Pridávanie ďalších funkcií do takého programu potom vždy spôsobí, že v aplikácii vznikne chyba. V praxi to dopadá tak, že hobby projekt autora "prestane baviť" alebo komerčný projekt skrachuje, pretože je "už príliš zložitý".

Uveďme si ešte iný príklad – keď bude naša domácnosť usporiadaná tak, že kladivo bude v lekárničke, ktorá bude umiestnená v pivnici, asi ťažko v nej budeme schopní efektívne fungovať. Hoci tento príklad znie absurdne, jeho alternatívy v podobe programov vznikajú denne.

Kedy je program správne?

To je ľahké. Program je správne, ak:

  • funguje,
  • dodržiava dobré praktiky a
  • je otestovaný.

Všimnite si, že funkcionalita z pohľadu používateľa programu predstavuje len 1/3 kritérií kvality programu. Podobne ako funkčnosť domu z pohľadu bývajúceho predstavuje asi iba zlomok jeho reálnej kvality z hľadiska stavbariny.

Práve o porušovaní dobrých praktík a kvalite kódu sa dnes budeme baviť. Záleží nám na tom, aby ste boli naozaj dobrí, preto týchto lekcií nájdete naprieč našimi kurzami ešte niekoľko.

Ako správne pomenovávať premenné?

Hovorí sa, že 10 % času niečo programujeme a 90 % času pre to vymýšľame názov ;-) Ide samozrejme o zveličenie, ale vtip naráža na nutnosť stráviť určitý čas vymýšľaním názvov premenných. To aby každý vrátane nás vracajúcich sa po pár mesiacoch k vlastnému kódu pochopil, na čo daná premenná slúži. Všeobecne sa dá spoľahnúť na jednoduché pravidlo:

Premenné vždy pomenovávame podľa toho, čo obsahujú, nie podľa toho, na čo v programe slúžia.

Porovnajme nasledujúce 2 kódy:

✗ Chyba

String listing, text2;
int[5] array;
int foo, bar, x, calculation;

✓ Správne

String title, name;
int[5] answers;
int i, j, bonus, totalBonus;

Oba kódy vytvárajú premenné pre jednoduchý konzolový kvíz. V prvom príklade nie je vôbec jasné, čo niektoré premenné obsahujú, napr. pomenovať premennú array má asi rovnakú výpovednú hodnotu, ako by sme ju pomenovali variable.

Častou chybou je, že chceme napr. uložiť výsledok nejakého výpočtu a premennú pomenujeme calculation. Výpočet s premennou však vôbec nesúvisí, to je nejaká akcia (dej), premenná obsahuje vždy hodnotu (výsledok deja). Tou je tu v prípade kvízu totalBonus. Podobne je v prvom kóde pomenovaná premenná listing, pretože ju niekde vypisujeme. Z druhého kódu ale reálne vidíme, že obsahuje názov kvízu.

Ruku na srdce - kto z vás by pochopil, že kód vľavo je program na kvízy?

Tiež nikdy nepomenovávame premenné auxiliary alebo aux a pod.

Pozor na mixovanie jazykov a diakritiku

V zdrojovom kóde je na našej úrovni začiatočníkov jedno, akým jazykom budeme pomenovávať premenné (pokiaľ teda nepošleme Angličanovi kód v slovenčine).

Premenné v jednom projekte pomenovávame jedným jazykom a ak po slovensky, tak bez diakritiky!

Opäť si ukážme príklady:

✗ Chyba

String message = "Čau!";
int počet;

✓ Správne

String message = "Hi!";
int count;

Alebo:

String sprava = "Čau!";
int pocet;

V identifikátoroch (napr. v názvoch premenných) nikdy nepoužívame mäkčene a dĺžne. V hodnotách v nich uložených je to už samozrejme v poriadku.

Napriek tomu, že moderné jazyky podporujú kódovanie UTF-8 aj v identifikátoroch, možno veľmi ľahko na mäkčeň alebo dĺžeň zabudnúť a používame tak inú premennú! Navyše súbor so zdrojovým kódom môže spracovávať aplikácia, ktorá ho nepodporuje, a typicky sa to aj časom stane (napr. je občas problém zobraziť diakritiku v prílohe mailovým klientom a pod.).

Viacslovné premenné

Dnešné aplikácie sú čoraz zložitejšie. Často sa stane, že by jedno slovo nestačilo na opis toho, čo je v premennej uložené. Potom je výhodné použiť viac slov. Krátke identifikátory z 80. rokov tak v súčasných business aplikáciách striedajú aj pomerne dlhé názvy ako userObjectOutputStreamFactory a podobne.

Takto dlhý názov má však zmysel iba v zložitej aplikácii, kde je niekoľko podobných premenných a preto musíme pridať ďalšie slovo. Nebudeme teda v Hello world aplikácii vytvárať premennú textWithGreetingHelloWorld, ale stačí nám tam len greeting, pokiaľ tam takáto premenná už nie je :)

Oddelenie slov

Kvôli čitateľnosti slov v takom názve premennej ich musíme nejako oddeliť:

  • Viac slov oddeľujeme podľa konvencie daného programovacieho jazyka, tá je v Jave tzv. camelCase (slovensky ťavie notácie, kedy každé ďalšie slovo má veľké písmeno a názov potom vyzerá ako hrby). V iných jazykoch sa môže používať napr. podčiarkovník ako snake_case a ďalšie notácie.
  • Vyhneme sa pokiaľ možno číslovaniu premenných a už vôbec nepíšeme čísla slovami, nie greeting2 ani greetingTwo. "Two" totiž nič nehovorí o tom, čo pozdrav obsahuje.
camelCase - Základné konštrukcie jazyka Java snake_case - Základné konštrukcie jazyka Java

Ukážme si to na príkladoch:

✗ Chyba

String message1;
String messageTwo;

Tu nie je jasné, čo je uložené:

String received; // text, message, order, ...?
String sent;

A tu je názov nečitateľný:

String receivedmessage;
String sentmessage;

✓ Správne

String receivedMessage;
String sentMessage;

Nepoužívame skratky

Túto podkapitolu začnime citáciou:

Všetci si lámali hlavu, k čomu je ten stĺpec DATBIR. Až sa raz zistilo, že je to vraj dátum narodenia (date of birth).

Táto zlá praktika je vlastne opakom viacslovných názvov premenných. Nevymýšľame nezmyselné skratky, napríklad z názvu rm nikto nespozná, že myslíme receivedMessage. Pomôcka môže byť:

Pokiaľ sa na kód pozrie niekto iný ako my, mal by presne vedieť, čo v ktorej premennej je.

✗ Chyba

String ms;
int nm;

✓ Správne

String message;
int numberOfMessages;

Ako sme sľubovali, k téme dobrých praktík sa ešte niekoľkokrát vrátime v podobných, skôr odpočinkových lekciách :-)

V budúcej lekcii, Textové reťazce v Jave - Práca s jednotlivými znakmi, na vás čaká prekvapenie ;-)


 

Predchádzajúci článok
Riešené úlohy k 11. lekcii Javy
Všetky články v sekcii
Základné konštrukcie jazyka Java
Preskočiť článok
(neodporúčame)
Textové reťazce v Jave - Práca s jednotlivými znakmi
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
48 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity