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 C začátečníků - Umíš pojmenovat proměnné? Nové

V dnešním C tutoriálu si ukážeme první tzv. dobré praktiky pro programování v jazyce C. 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 C!

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ě

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

✓ Správně

char nazev[255], jmeno[255];
int odpovedi[5];
int i, j, bonus, celkovy_bonus;

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 celkovy_bonus. 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ě

char zpráva[] = "Čau!";
int count;

✓ Správně

char zprava[] = "Čau!";
int pocet;

Nebo:

char 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 new_user_memory_cache_lifetime 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ší slova. Nebudeme tedy v Hello world aplikaci vytvářet proměnnou text_s_pozdravem_hello_world, 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 Céčku nejčastěji under_score neboli snake_case (česky "hadí notace", kdy jsou slova malými písmeny a oddělená podtržítky, text pak při troše fantazie vypadá jako by se "plazil"). Pro makra používáme velký SNAKE_CASE. V jiných jazycích se může používat k oddělení slov např. velké písmeno jako camelCase a další notace.
  • Vyhneme se pokud možno číslování proměnných a už vůbec nepíšeme čísla slovy, ne pozdrav2 ani pozdrav_dve. "Dvě" totiž nic neříká o tom, co pozdrav obsahuje.
snake_case camelCase

Ukažme si to na příkladech:

✗ Špatně

#define minimalniVek 18

// ...
char zprava1[255];
char zpravaDve[255];

Zde není jasné co je v proměnných uloženo:

#define minimalni_vek 18

// ...
char prijato[255]; // text, bajty, zprava, objednavka, ...?
char odes[255];

A zde je název makra i proměnných nečitelný:

#define MINIMALNIVEK 18

// ...
char prijatazprava[255];
char odeszpr[255];

✓ Správně

#define MINIMALNI_VEK 18

// ...
char prijata_zprava[255];
char odeslana_zprava[255];

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 prijata_zprava.

Určitě vás nyní napadá, že konvenci zkratek používá pro názvy svých funkcí samotné Céčko. V té době totiž nebyly aplikace ještě tak složité a nebyl kladen takový důraz na orientaci v nich. Nezasvěcený člověk určitě z názvu nepozná, co asi dělá funkce strrchr(). Zatímco Céčko se už asi předělávat nebude, my se můžeme naučit psát naše programy správněji.

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ě

char zprv[255];
int pz;

✓ Správně

char zprava[255];
int pocet_zprav;

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 C začátečníků, děláš je také?, si ukážeme nejčastější chyby začátečníků v C, např. ohledně pojmenování kolekcí, bool výrazů a DRY.


 

Předchozí článek
Struktury v jazyce C
Všechny články v sekci
Základní konstrukce jazyka C
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
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 (2)

 

 

Komentáře

Avatar
DarkCoder
Člen
Avatar
DarkCoder:20. března 23:24

Při vytváření názvu proměnné se snažíme o to, aby byl název validní, čitelný, výstižný, snadno zapisovatelný a byl v souladu s ostatními názvy v programu.

ANO

Názvy, které jsou tvořeny z více slov zapisujeme pomocí camelCase, PascalCase nebo snake_case.
Názvy, které budeme chtít sdílet široké veřejnosti, píšeme výhradně v anglickém jazyce.
Názvy proměnných píšeme výhradně v jednom jazyce.
Pro ukazatelové proměnné zapisujeme znak '*' spojitě s názvem proměnné.
Pro názvy, ze kterých nemusí být na první pohled vidět jejich typ, využíváme výhody Maďarské notace.
Názvy pro ukazatelové proměnné vytváříme pomocí prefixu 'p' nebo "p_".
Názvy, u kterých přidáváme komentář zapisujeme na samostatný řádek.
U názvů, u kterých lze význam obtížně vystihnout, přidáváme doplňující komentář.
Mezi názvem a operátorem píšeme jednu mezeru.
K názvům Boolovských proměnných přidáváme dotazovací sloveso.
Názvy globálních proměnných vytváříme pomocí prefixu 'g' nebo "g_".
Názvy konstant zapisujeme výhradně velkými písmeny.
Názvy proměnných, jejichž doba životnosti je krátká, píšeme krátké.
Názvy polí se zapisují výhradně v množné formě.

NE

Názvy, které začínají číslicí.
Názvy, které končí podtržítkem.
Názvy, které obsahují nestandartní platné znaky.
Názvy, které se obtížně zapisují a vyslovují.
Názvy, které se shodují s klíčovým slovem.
Názvy, které se shodují se jménem funkce.
Názvy, které jsou shodné pro lokální a globální proměnnou.
Názvy, které se diametrálně liší od názvu proměnné stejného smyslu.
Názvy, které na první pohled nedávají žádný význam nebo jsou matoucí.
Názvy, jejichž význam je tvořen vynecháním písmen, zkratkovitě.
Názvy, kde počátečními znaky jsou dvě podtržítka nebo podtržítko následované velkým písmenem.
Názvy, které obsahují dvě nebo více podtržítek za sebou.
Názvy, které jsou příliš krátké nebo příliš dlouhé.
Názvy, jejichž délka je větší než 32 znaků.
Názvy, u kterých jsou dva znaky vizuálně podobné a přesto odlišné.
Názvy, kde všechny znaky jsou psány velkými písmeny a název neobsahuje podtržítko.
Názvy, kde všechny znaky jsou psány malými písmeny a název neobsahuje podtržítko.

Názvů pro proměnnou, splňující pravidla uvedená v úvodu, lze vytvořit mnoho. Který z nich je ale ten správný?

Pokud se chcete přesvědčit, zda Vámi zvolený název pro proměnnou je správný, požádejte kolegu o to, aby Vám sdělil co si myslí, že daná proměnná představuje. Pokud jeho odpověď odpovídá tomu co proměnná skutečně představuje, je název vhodný. A naopak, pokud představa bude odlišná nebo Vy sami si nebudete jisti, pak je název pro proměnnou špatně zvolený a je nutné jej změnit.

Pokud už jste sami nějaké programy napsali, otevřte si jejich zdrojový kód, podívejte se a zodpovězte si sami, zda stále víte, jaký význam má ta která proměnná v programu. Dost možná si na vše nevzpomenete...

Jak ale budete psát víc a víc programů, bude pro Vás vymyšlení vhodného názvu pro proměnnou jednodušší a přirozenější.

Odpovědět
20. března 23:24
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
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 1 zpráv z 1.