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

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

V minulé lekci, Pokročilá konfigurace PHP (XAMPP), jsme se naučili konfigurovat PHP (XAMPP) pro lokální vývoj reálných projektů, zprovoznili jsme si subdomény, odesílání emailů a import velkých MySQL souborů.

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

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é?

Ří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ě

$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;
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Oba kódy vytvářejí proměnné pro jednoduchý kvíz. U prvního příkladu není vůbec jasné, co některé proměnné obsahují.

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

Pojmenování polí

Pojmenování polí je jedním z největších kamenů úrazu v programování. Existuje jednoduché pravidlo:

Kolekce vždy pojmenováváme v množném čísle.

Opět tím samozřejmě následujeme poučku, že název proměnné je odvozený od toho, co je v proměnné uložené. A když je tam více věcí, měl by být logicky množné číslo.

Ukažme si pár chybných a správných příkladů deklarace polí:

✗ Špatně

$arr1 = [40000, 50000, 60000];
$arr2 = [80000, 100000, 120000];
$uzivatel = ['pepa', 'karel'];
$cisla = [40000, 50000, 60000];
$vek = [81, 25, 11, 45];
$pole = [true, true, false];
$novePole = [true, false, false];

✓ Správně

$platyVstup = [40000, 50000, 60000];
$platyVystup = [80000, 100000, 120000];
$uzivatele = ['pepa', 'karel'];
$platy = [40000, 50000, 60000];
$veky = [81, 25, 11, 45];
$odpovedi = [true, true, false];
$opraveneOdpovedi = [true, false, false];

Vyhneme se zavádějícím názvům jako $cisla, to už můžeme zas rovnou napsat $promenne. Snad nemusíme ani zmiňovat, že pole určitě nepojmenujeme $pole :) Podle toho, co je uvnitř opravdu uloženo, zvolíme jako název např. $platy, $odpovedi apod.

Speciálně pojmenování pole $arr jsem osobně viděl snad milionkrát a vždy je nutné chvíli rolovat zdrojovým kódem, aby člověk zjistil, co v něm vlastně je. Pokud je takovýchto názvů plná celá aplikace, člověk ztrácí čas, koncentraci a dělá chyby.

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ě

$zpráva = "Čau!";
$count = 0;

✓ Správně

$zprava = "Čau!";
$pocet = 0;

Nebo:

$message = "Čau!";
$count = 0;

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. Ty jsou v PHP 2 a zjednodušeně řečeno záleží na tom, zda programujeme:

  • objektově - tehdy používáme tzv. camelCase (česky velbloudí notace, kdy každé další slovo má velké písmeno a název pak vypadá jako hrby). Tuto konvenci budeme používat i my v kurzu, protože brzy začneme programovat objektově, což je způsob, kterým se dnes vytvářejí moderní projekty. Pro konstanty ovšem používáme velký SNAKE_CASE.
  • procedurálně - pro neobjektové projekty se zpravidla používá snake_case, kdy slova oddělujeme podtržítkem.

PHP samotné má pro spoustu své funkcionality i dva způsoby volání - buď přes třídy, kde je vše pojmenované camelCasem, nebo přes funkce používající k oddělení slov podtržítka. To aby stále podporovalo starší neobjektové projekty (za všechny si uveďme WordPress, na kterém běží půl miliardy webových stránek). PHP konvencím je také věnován celý kurz Standardy jazyka PHP.

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ě

$zprava1 = 'Ahoj';
$zpravaDve = 'No nazdar';
define('minimalniVek', 18);

Zde není jasné co je uloženo:

$prijato = $_GET['z']; // text, bajty, zprava, objednavka, ...?
$odeslano = 'No nazdar';
define('minimalni_vek', 18);

A zde je název nečitelný:

$prijatazprava = 'Ahoj'
$odeslanazprava = 'No nazdar';
define('MINIMALNIVEK', 18);

✓ Správně

$prijataZprava = 'Ahoj';
$odeslanaZprava = 'Rád tě vidím';
define('MINIMALNI_VEK', 18);

Nebo pro neobjektové projekty:

$prijata_zprava = 'Ahoj';
$odeslana_zprava = 'Rád tě vidím';
define('MINIMALNI_VEK', 18);

Zmíněné 2 správné styly pojmenování proměnných v jednom projektu nikdy nemícháme.

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ě

$zp = 'Ano';
$pz = 5;

✓ Správně

$zprava = 'Ano';
$pocetZprav = 5;

Některé starší PHP funkce jsou pojmenované právě pomocí zkratek, zkuste si schválně tipnout, co asi dělá strrchr() :-? Tuto konvenci PHP rychle opustilo, ale z důvodu zpětné kompatibility ji tu a tam ještě potkáme. Tento neduh je daň za to, že je tu s námi PHP už tak dlouho, výhodou zas je, že na něm běží většina Internetu.

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


 

Předchozí článek
Pokročilá konfigurace PHP (XAMPP)
Všechny články v sekci
Základní konstrukce jazyka PHP
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
5 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 (2)

 

 

Komentář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.

Zatím nikdo nevložil komentář - buď první!