19. diel - Najčastejšie chyby PHP nováčikov - Vieš pomenovať premenné?
V minulej lekcii, Dátové typy v PHP , sme si vysvetlili, ako fungujú dátové typy v PHP, čo to je dynamické typovanie a ako funguje práca s rôznymi dátovými typmi.
V dnešnom PHP tutoriále si ukážeme prvý tzv. Dobré praktiky pre programovanie v PHP. Nielen nováčikovia je často porušujú a zanáša tak do svojich programov zbytočné chyby, možno je robíš tiež?
Slovo senior programátora
Gratulujem k zdolaniu prvých lekcií Základných konštrukciou jazyka PHP!
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.
Došiel som k tomu, že základným a mylným predpokladom je:
✗ Program je správne, ak funguje.
Programy a domy
Ak staviame dom, že sa nám páči a nefúka do neho neznamená, že je správne. Dom totiž musí mať premyslenú architektúru a pokiaľ nemá základy, za pár rokov sa nám začne zosúva.
Programovanie je často prirovnávané k stavebníctva práve z ohľadu na architektúru, tu 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 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ž moc zložitý".
Uveďme si ešte iný príklad - Keď bude naša domácnosť usporiadaná tak, že bude kladivo 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 jednoduché. Program je správne, ak:
- funguje,
- dodržiava dobré praktiky a
- je otestovaný.
Všimnite 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 len zlomok jeho reálne kvality z hľadiska murárstvo.
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 kurzy 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;-) Jedná sa samozrejme o zveličenie, však vtip naráža na nutnosť stráviť určitý čas nad 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, k čomu ona 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, k čomu v programe slúži.
Porovnajme nasledujúce 2 kódy:
✗ Špatně
$vypis = $_GET['n']; $text2 = "Jan Novák"; $pole = []; $foo = 0; $vypocet = 0;
\ ---
✓ Správně
$nazev = $_GET['n']; $jmeno = "Jan Novák"; $odpovedi = []; $bonus = 0; $celkovyBonus = 0;
\ --- \ ---
Oba kódy vytvárajú premenné pre jednoduchý kvíz. U prvého príkladu
nie je vôbec jasné, čo niektoré premenné obsahujú, napr. Pomenovať
premennú $pole
má asi rovnakú výpovednú hodnotu, ako by sme ju
pomenovali $promenna
.
Častá chyba je, že chceme napr. Uložiť výsledok
nejakého výpočtu a premennú pomenujeme
$vypocet
. 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íze
$celkovyBonus
. Podobne je v prvom kóde pomenovaná premenná
$vypis
, 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 nepojmenováváme premennej $pomocna
alebo $pom
pod.
Pozor na "Czechglish" a diakritiku
V zdrojovom kóde je na našej úrovni začiatočníkov jedno, akým jazykom budeme pomenovávať premennej (pokiaľ teda nepošleme Angličanovi kód v slovenčine).
Premenné v jednom projekte pomenovávame jedným jazykom a ak česky, tak bez diakritiky!
Opäť si ukážme príklady:
✗ Špatně
$zpráva = "Čau!"; $count = 0;
\ ---
✓ Správně
$zprava = "Čau!"; $pocet = 0;
alebo:
$message = "Čau!"; $count = 0;
\ --- \ ---
V identifikátoroch (napr. V názvoch premenných) nikdy nepoužívame háčiky 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, možno veľmi ľahko na háčik alebo čiarku zabudnúť a používame potom inú premennou! 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 apod.).
Viacslovné premenné
Dnešné aplikácie sú stále 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
biznis aplikáciách striedajú aj pomerne dlhé názvy ako
$userObjectOutputStreamFactory
a podobne.
Takto dlhý názov má však zmysel len 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ú
$textSPozdravemHelloWorld
, ale stačí nám tam len
$pozdrav
, ak tam iný nie je:)
Oddelenie slov
Kvôli čitateľnosti slová v takom názve premennej musíme nejako oddeliť. Viac slov oddeľujeme podľa konvencie daného programovacieho jazyka. Tie sú v PHP 2 a zjednodušene povedané záleží na tom, či programujeme:
- objektovo - vtedy používame tzv.
camelCase
(slovensky ťavie notácie, kedy každé ďalšie slovo má veľké písmeno a názov potom vyzerá ako hrby). Túto konvencii budeme používať aj my v kurze, pretože čoskoro začneme programovať objektovo, čo je spôsob, ktorým sa dnes vytvárajú moderné projekty. Pre konštanty však používame veľkýSNAKE_CASE
. - procedurálne - pre neobjektové projekty sa spravidla
používa
snake_case
, kedy slová oddeľujeme podčiarknikom.
PHP samotné má pre veľa svoje funkcionality aj dva spôsoby volania - buď cez triedy, kde je všetko pomenované CamelCase, alebo cez funkcie používajúce k oddeleniu slov podčiarknutia. To aby stále podporovalo staršie neobjektové projekty (za všetky si uveďme WordPress, na ktorom beží pol miliardy webových stránok). PHP konvenciám je tiež venovaný celý kurz Štandardy jazyka PHP.
Vyhneme sa pokiaľ možno číslovanie premenných a už vôbec nepíšeme
čísla slovami, nie $pozdrav2
ani $pozdravDve
. "Dve"
totiž nič nehovorí o tom, čo pozdrav obsahuje.
Ukážme si to na príkladoch:
✗ Špatně
$zprava1 = 'Ahoj'; $zpravaDve = 'No nazdar'; define('minimalniVek', 18);
Tu nie je jasné čo je uložené:
$prijato = $_GET['z']; // text, bajty, sprava, objednávka, ...? $odeslano = 'No nazdar'; define('minimalni_vek', 18);
A tu je názov nečitateľný:
$prijatazprava = 'Ahoj' $odeslanazprava = 'No nazdar'; define('MINIMALNIVEK', 18);
\ ---
✓ Správně
$prijataZprava = 'Ahoj'; $odeslanaZprava = 'Rád tě vidím'; define('MINIMALNI_VEK', 18);
Alebo pre neobjektové projekty:
$prijata_zprava = 'Ahoj'; $odeslana_zprava = 'Rád tě vidím'; define('MINIMALNI_VEK', 18);
\ --- \ ---
Spomínané 2 správne štýly pomenovanie premenných v jednom projekte nikdy nemiešame.
Nepoužívame skratky
Túto podkapitolu začne citácií:
Všetci si lámali hlavu, k čomu je ten stĺpec
DATNAR
. Až sa raz zistilo, že je to prej dátum
narodenia.
Táto zlá praktika je vlastne opakom viacslovných názvov premenných.
Nevymýšľame nezmyselné skratky, napríklad z názvu $pz
nikto
nespozná, že myslíme $prijataZprava
. Pomôcka môže byť:
Ak sa na kód pozrie niekto iný než my, mal by presne vedieť, čo v ktorej premennej je.
✗ Špatně
$zp = 'Ano'; $pz = 5;
\ ---
✓ Správně
$zprava = 'Ano'; $pocetZprav = 5;
\ --- \ ---
Niektoré staršie PHP funkcie sú pomenované práve pomocou
skratiek, skúste si schválne tipnúť, čo asi robí strrchr()
:
-? Túto konvencii PHP rýchlo opustilo, ale z dôvodu spätnej kompatibility ju
tu a tam ešte stretneme. Tento neduh je daň za to, že je tu s nami PHP už
tak dlho, výhodou zas je, že na ňom beží väčšina Internetu.
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, Najčastejšie chyby PHP začiatočníkov, robíš je tiež? , si ukážeme najčastejšie chyby
začiatočníkov v PHP, napr. Ohľadom vyhodnocovanie bool
výrazov
a DRY.