Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

13. diel - Časté chyby Python nováčikov - Vieš pomenovať premenné?

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

V dnešnej lekcii Pythonu si ukážeme prvé tzv. dobré praktiky pre programovanie v Pythone. Často ich porušujú nielen nováčikovia a programátori tak zanášajú do svojich programov zbytočné chyby. Nerobíš ich tiež?

Slovo senior programátora

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

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

Materiál dnešnej lekcie som zostavil na základe dvadsiatich rokov 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 hoci väčšina týchto kódov 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. Medzi chybujúcich som v začiatkoch patril aj ja.

Dospel som k tomu, že základným a mylným predpokladom je:

✗ Program je správny, ak funguje.

Programy a domy

Ak staviame dom, tak to, že sa nám páči a nefúka do neho, neznamená, že je postavený správne. Dom totiž musí mať premyslenú architektúru, a ak nemá základy, o pár rokov sa nám začne rozpadať.

Programovanie je často prirovnávané k stavebníctvu práve s ohľadom na architektúru, v našom prípade však 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 napísaný neprehľadne, od určitej chvíle 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ť" a komerčný projekt skrachuje, pretože je už "veľmi 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 s ňou budeme schopní efektívne fungovať. Hoci znie tento príklad absurdne, jeho alternatívy v podobe programov vznikajú denne.

Kedy je program správny?

To je jednoduché. Program je správny, ak:

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

Všimnime si, že funkcionalita z pohľadu uží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.

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

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 nadsádzku, 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, kto sa po pár mesiacoch vracia 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

output = "Capital cities"
text2 = "John Doe"
array = []
foo = 0
calculation = 0

✓ Správne

title = "Capital cities"
name = "John Doe"
answers = []
bonus = 0
total_bonus = 0

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

Častou chybou tiež 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í, je to nejaká akcia (dej), premenná vždy obsahuje hodnotu (výsledok deja). Tou je tu v prípade kvízu total_bonus. Podobne je v prvom kóde pomenovaná premenná output, 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 sa týka programu na kvízy?

Premenné tiež nikdy nepomenovávame auxiliary alebo aux apod.

Pozor na mixovanie jazykov a diakritiku

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

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

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

✗ Chyba

message = "Čau!"
počet = 0

✓ Správne

message = "Čau!"
count = 0

Alebo:

sprava = "Čau!"
pocet = 0

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

Hoci moderné jazyky podporujú kódovanie UTF-8 aj v identifikátoroch, na mäkčeň alebo čiarku je možné veľmi ľahko zabudnúť a používame potom 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 na opis toho, čo je v premennej uložené, nestačilo. 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 user_object_output_stream_factory 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. V Hello world aplikácii teda nebudeme vytvárať premennú text_with_greeting_hello_world, ale stačí nám len greeting, pokiaľ tam iný nie je :)

Oddelenie slov

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

  • Viac slov oddeľujeme podľa konvencie daného programovacieho jazyka. Tá je v Pythone špecifikovaná dokumentom PEP 8 a na oddeľovanie slov odporúča používať podčiarkovníky. Táto notácia je niekedy tiež nazývaná ako snake_case (slovensky "hadia notácia", kedy sú slová písané malými písmenami a oddelené podčiarkovníkmi, text teda pri troche fantázie vyzerá, ako by sa "plazil"). V iných jazykoch sa môže na oddelenie slov používať napr. veľké písmeno (ako camelCase a ďalšie notácie). Iné notácie v Pythone používame len výnimočne, a pokiaľ na to máme dobrý dôvod. To môže nastať napr. vtedy, ak pracujeme s knižnicou portovanou z iného systému, ktorá používa inú notáciu, ktorú chceme zachovať.
  • Vyhneme sa, ak je to možné, číslovaniu premenných a už vôbec nepíšeme čísla slovami, nie greeting2 ani greeting_two. "Dve" totiž nehovorí nič o tom, čo pozdrav obsahuje.
snake_case - Základné konštrukcie jazyka Python camelCase - Základné konštrukcie jazyka Python

Ukážme si to na príkladoch:

✗ Chyba

message1 = "Hello"
messageTwo = "Oh dear"

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

received = input_buffer[0] # text, message, order, ...?
sent = "Oh dear"

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

receivedmessage = "Hello"
sentmessage = "Oh dear"

✓ Správne

received_message= "Hello"
sent_message= "Nice to see you"

Nepoužívame skratky

Túto podkapitolu začnime citáciou:

Všetci si lámali hlavu nad tým, na čo slúži 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 received_message. Pomôcka môže byť:

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

✗ Chyba

ms = "Yes"
nm = 5

✓ Správne

message = "Yes"
number_of_messages = 5

Ako sme sľúbili, 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 nasledujúcej lekcii, Textové reťazce v Pythone druhýkrát - Práca so znakmi, nás čaká prehĺbenie znalostí o reťazcoch. Naučíme sa ich formátovať, porovnávať a používať ich metódy.


 

Predchádzajúci článok
Riešené úlohy k 12. lekcii Pythonu
Všetky články v sekcii
Základné konštrukcie jazyka Python
Preskočiť článok
(neodporúčame)
Textové reťazce v Pythone druhýkrát - Práca so znakmi
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
147 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