Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 50% výuky zdarma!
Pouze tento týden sleva až 80 % na e-learning týkající se Javy

Lekce 14 - Nejčastější chyby Java nováčků - Umíš pojmenovat proměnné? Nové

V minulé lekci, Matematické funkce v Javě a knihovna Math, jsme se naučili používat různé užitečné matematické funkce.

V dnešním Java tutoriálu si ukážeme první tzv. dobré praktiky pro programování v Javě. Nejen nováčci je často porušují a zanáší tak do svých programů zbytečné chyby, možná je děláš také?

Slovo senior programátora

David Čápka

Gratuluji ke zdolání prvních lekcí Základních konstrukcí jazyka Java!

Materiál pro dnešní lekci jsem sestavil na základě 20letých zkušeností s programováním. Jako šéfredaktorovi a lektorovi mi rukama prošly stovky, možná tisíce zdrojových kódů vytvořených komunitou. Nebylo těžké si všimnout, že většina z nich, ačkoli funguje, obsahuje zbytečné chyby, které se navíc stále dokola opakují. Chyby kupodivu často dělali jak nováčci, tak zkušenější programátoři a i já jsem je dělal, když jsem začínal.

Došel jsem k tomu, že základním a mylným předpokladem je:

✗ Program je správně, pokud funguje.

Programy a domy

Pokud stavíme dům, že se nám líbí a nefouká do něj neznamená, že je správně. Dům totiž musí mít promyšlenou architekturu a pokud nemá základy, za pár let se nám začne sesouvat.

Programování je často přirovnáváno ke stavebnictví právě z ohledu na architekturu, zde ovšem tu softwarovou. Vysvětleme si proč.

Lidský mozek dokáže najednou pracovat jen s určitým omezeným množstvím informací. Zjednodušeně můžeme říci, že pokud je program nepřehledně napsaný, od určité chvíle by musel programátor udržet v hlavě více věcí, než člověk vůbec dokáže. Přidávání dalších funkcí do takového programu pak vždy způsobí, že v aplikaci vznikne chyba. V praxi to dopadá tak, že hobby projekt autora "přestane bavit" nebo komerční projekt zkrachuje, protože je "už moc složitý".

Uveďme si ještě jiný příklad - Když bude naše domácnost uspořádaná tak, že bude kladivo v lékárničce, která bude umístěna ve sklepě, asi těžko v ní budeme schopní efektivně fungovat. Ačkoli tento příklad zní absurdně, jeho alternativy v podobě programů vznikají denně.

Kdy je program správně?

To je snadné. Program je správně, pokud:

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

Všimněte si, že funkcionalita z pohledu uživatele programu představuje jen 1/3 kritérií kvality programu. Podobně, jako funkčnost domu z pohledu bydlícího představuje asi jen zlomek jeho reálné kvality z hlediska stavařiny.

Právě o porušování dobrých praktik a kvalitě kódu se dnes budeme bavit. Záleží nám na tom, abyste byli opravdu dobří, proto těchto lekcí naleznete napříč našimi kurzy ještě několik.

Jak správně pojmenovávat proměnné?

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Říká se, že 10% času něco programujeme a 90% času pro to vymýšlíme název ;-) Jedná se samozřejmě o nadsázku, nicméně vtip naráží na nutnost strávit určitý čas nad vymýšlením názvů proměnných. To aby každý včetně nás vracejících se po pár měsících k vlastnímu kódu, pochopil, k čemu ona proměnná slouží. Obecně se dá spolehnout na jednoduché pravidlo:

Proměnné vždy pojmenováváme podle toho, co obsahují, nikoli podle toho, k čemu v programu slouží.

Porovnejme následující 2 kódy:

✗ Špatně

String vypis, text2;
int[5] pole;
int foo, bar, x, vypocet;

✓ Správně

String nazev, jmeno;
int[5] odpovedi;
int i, j, bonus, celkovyBonus;

Oba kódy vytvářejí proměnné pro jednoduchý konzolový kvíz. U prvního příkladu není vůbec jasné, co některé proměnné obsahují, např. pojmenovat proměnnou pole má asi stejnou vypovídací hodnotu, jako bychom ji pojmenovali promenna.

Častá chyba je, že chceme např. uložit výsledek nějakého výpočtu a proměnnou pojmenujeme vypocet. Výpočet s proměnnou ovšem vůbec nesouvisí, to je nějaká akce (děj), proměnná obsahuje vždy hodnotu (výsledek děje). Tou je zde v případě kvízu celkovyBonus. Podobně je v prvním kódu pojmenovaná proměnná vypis, protože ji někde vypisujeme. Z druhého kódu ale reálně vidíme, že obsahuje název kvízu.

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

Také nikdy nepojmenováváme proměnné pomocna nebo pom apod.

Pozor na "Czechglish" a diakritiku

Ve zdrojovém kódu je na naší úrovni začátečníků jedno, jakým jazykem budeme pojmenovávat proměnné (pokud tedy nepošleme Angličanovi kód v češtině).

Proměnné v jednom projektu pojmenováváme jedním jazykem a pokud česky, tak bez diakritiky!

Opět si ukažme příklady:

✗ Špatně

String zpráva = "Čau!";
int count;

✓ Správně

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

Nebo:

String message = "Čau!";
int count;

V identifikátorech (např. v názvech proměnných) nikdy nepoužíváme háčky a čárky. V hodnotách v nich uložených je to již samozřejmě v pořádku.

Přestože moderní jazyky podporují kódování UTF-8 i v identifikátorech, lze velmi snadno na háček nebo čárku zapomenout a používáme pak jinou proměnnou! Navíc soubor se zdrojovým kódem může zpracovávat aplikace, která jej nepodporuje, a typicky se to i časem stane (např. je občas problém zobrazit diakritiku v příloze mailovým klientem apod.).

Víceslovné proměnné

Dnešní aplikace jsou stále složitější. Často se stane, že by jedno slovo nestačilo k popisu toho, co je v proměnné uloženo. Pak je výhodné použít více slov. Krátké identifikátory z 80. let tak v současných business aplikacích střídají i poměrně dlouhé názvy jako userObjectOutputStreamFactory a podobně.

Takto dlouhý název má ovšem smysl jen ve složité aplikaci, kde je několik podobných proměnných a proto musíme přidat další slovo. Nebudeme tedy v Hello world aplikaci vytvářet proměnnou textSPozdravemHelloWorld, ale stačí nám tam jen pozdrav, pokud tam jiný není :)

Oddělení slov

Kvůli čitelnosti slova v takovém názvu proměnné musíme nějak oddělit:

  • Více slov oddělujeme podle konvence daného programovacího jazyka, ta je v Javě tzv. camelCase (česky velbloudí notace, kdy každé další slovo má velké písmeno a název pak vypadá jako hrby). V jiných jazycích se může používat např. podtržítko jako snake_case a další notace.
  • Vyhneme se pokud možno číslování proměnných a už vůbec nepíšeme čísla slovy, ne pozdrav2 ani pozdravDve. "Dvě" totiž nic neříká o tom, co pozdrav obsahuje.
camelCase snake_case

Ukažme si to na příkladech:

✗ Špatně

String zprava1;
String zpravaDve;

Zde není jasné co je uloženo:

String prijato; // text, bajty, zprava, objednavka, ...?
String odeslano;

A zde je název nečitelný:

String prijatazprava;
String odeslanazprava;

✓ Správně

String prijataZprava;
String odeslanaZprava;

Nepoužíváme zkratky

Tuto podkapitolu započněme citací:

Všichni si lámali hlavu, k čemu je ten sloupec DATNAR. Až se jednou zjistilo, že je to prej datum narození.

Tato špatná praktika je vlastně opakem víceslovných názvů proměnných. Nevymýšlíme nesmyslné zkratky, například z názvu pz nikdo nepozná, že myslíme prijataZprava. Pomůcka může být:

Pokud se na kód podívá někdo jiný než my, měl by přesně vědět, co v které proměnné je.

✗ Špatně

String zp;
int pz;

✓ Správně

String zprava;
int pocetZprav;

Jak jsme slibovali, k tématu dobrých praktik se ještě několikrát vrátíme v podobných, spíše odpočinkových lekcích :)

V příští lekci, Nejčastější chyby Java začátečníků, děláš je také?, si ukážeme nejčastější chyby začátečníků v Javě, např. ohledně pojmenování kolekcí, boolean výrazů a DRY.


 

Předchozí článek
Matematické funkce v Javě a knihovna Math
Všechny články v sekci
Základní konstrukce jazyka Java
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
1 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (1)

 

 

Komentáře

Avatar
naco
Člen
Avatar
naco:4. března 21:43

jak je to s používáním identifikátoru typu proměnné v názvu? Má to smysl? třeba String strJmeno, boolean blnPrihlasen

 
Odpovědět
4. března 21:43
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na naco
David Čápka:5. března 10:37

To je špatně, podle názvu ve většině případů poznáš, že jméno bude String a že přihlášen bude boolean. Co se dělá je, že třeba ve formulářových aplikacích uděláš proměnnou jmenoField, aby bylo poznat, že to je políčko k zadání jména a ne to jméno, nebo třeba že proměnnou s továrnou zakončíš Factory apod, ale psát takové základní typy jako String nebo boolean je spíše nepřehledné, nikdy jsem to neviděl v reálném projektu použité.

Odpovědět
5. března 10:37
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
naco
Člen
Avatar
Odpovídá na David Čápka
naco:5. března 10:42

Díky, je mi jasné, že u String nebo boolean to asi z názvu vyplyne, ale u integer, double nebo float by to smysl mít mohlo. Ale pokud se to nepoužívá, asi to v praxi smysl nemá :-)

 
Odpovědět
5. března 10:42
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na naco
David Čápka:5. března 11:45

Pokud tam je číslo ulice a pak vzdálenost v kilometrech, tak se dá zas předpokládat co je celé a co desetinné, nejdůležitější je opravdu aby bylo poznat co v té proměnné je uloženo, ten typ je už druhotná informace a dá se odvodit. Se všemi čísly se pracuje také dost podobně a IDE by ti mělo typ vypsat, když na tu proměnnou najedeš myší.

Odpovědět
5. března 11:45
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
MpCk
Člen
Avatar
MpCk:12. března 10:34

Ano, proměnné jsou základ programu.. ale s tím souvisí - a podle mě je daleko důležitější - správné a výstižné pojmenování funkcí/metod :) určitě ve většině případů když pracuejš s proměnnou je to lokální proměnná v metodě - ve své podstatě je jedno co obsahuje, metoda ji jen má za úkol nějak zpracovat.. v krátkých metodách (který odladíš bez problémů) není problém prom. pojmenovat zkratkou nebo jako "pom" (stejně jako v cyklu nepoužiješ jako čítač cyklu nic jiného než i,j,k..).. ale tyhle krátké metody pak používáš nejčastěji - a když nemá výstižný název -> ztratíš se..

 
Odpovědět
12. března 10:34
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na David Čápka
Lubor Pešek:14. března 18:01

Když si člověk přečte takovýto článek, tak lze říct jen jedno. Chybí tu tlačítko - ohodnoť finančně článek.
Toto je nehorázně skvělý přínos a nápad.

Začínám si být už jistý, že itnetwork v takové podobě, v jaké ho teď máš, by měl být nepostradatelným vstupním materiálem pro každou školu programátorů.

Často se stává, že u tutoriálů vidím nedostatek, který by začátečník nemusel dobře pochopit, ale tvoje články takovou chybu nemají a obzvlášť tento je naprosto prvotřídní a nedovedu si představit, že bych to sám řekl lépe nebo že bych něco lepšího našel.

Trošku namyšleně můžu říct, že toto osobně už nepotřebují, ale pro začátečníky jsi skutečně velkým přínosem. Díky tobě budeme mít programátory!!

Odpovědět
14. března 18:01
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na naco
Lubor Pešek:14. března 18:05

Spíš se to používá u referenčních datových typů. Hlavně při používání frameworků se často použije v podstatě název objektu. Je to z toho důvodu, že frameworky velmi často pracují pouze s jednou beanou. Proto je také často scope pro řadu frameworků nastavený defaultně jako singleton.

Ale v případě, kdy definuješ logiku ve třídě, tak je to jednoduché - pojmenovávej to tak, jako kdybys chtěl udělat v tom prezentaci a potom, co ti program začne fungovat, tak si sám polož otázky - když se podíváš na proměnou String jmeno. Pochopíš, co se tím jménem myslí? (jméno uživatele, firmy, psa?).

Odpovědět
14. března 18:05
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.