Úloha 5 – Predikáty a strážné podmínky (guard clauses) v rozhodování
| Site: | Moodle ZČU |
| Course: | Sada úloh pro procvičení v předmětu KVD/PGM1P (BP Vítek Dolný) |
| Book: | Úloha 5 – Predikáty a strážné podmínky (guard clauses) v rozhodování |
| Printed by: | Guest user |
| Date: | Sunday, 18 October 2026, 9:59 AM |
Úvod do úlohy
Podmínky v kódu rozhodují, co se stane dál: „Když platí A, udělej B, jinak C.“ Když jsou ale podmínky příliš dlouhé nebo se opakují, kód se špatně čte a hůř opravuje. V této úloze si ukážeme, jak podmínky zjednodušit: rozdělíme je na malé pojmenované kontroly (říkáme jim predikáty) a naučíme se používat stručné odmítnutí na začátku funkce (tzv. guard clause). Díky tomu bude kód čitelnější a bezpečnější pro budoucí změny.
Teorie a principy
-
Predikát (pojmenovaná kontrola)
Je to malá funkce, která vrátítruenebofalse. Např.jeDospely(vek)místo psanívek >= 18všude. Kód se pak snáz čte. -
Strážná podmínka (guard clause)
Na začátku funkce rychle ukončíme neplatné situace (return), a tím zmenšíme vnořeníifů. Čtenář hned ví, co nejde. -
Komentuj „proč“, ne „co“
Kód říká co se děje. Krátkým komentářem vysvětli proč to tak je (doménové pravidlo, limit, výjimka). -
Jednoduché → složitější
Nejdřív proveď levné a jednoduché testy (např. zda proměnná existuje), teprve pak ty složitější. -
Boolean srovnávej výslovně
Pro začátek klidně pišif (jeVip == true)aif (jePrihlasen == false). Je to delší, ale jasné.
Praktické příklady kódu
1) Predikáty + guard clauses (zjednodušený příklad bez objektů)
Poznámka k ekvivalentům:
-
if (jeVip)je totéž coif (jeVip == true) -
if (!prihlasen)je totéž coif (prihlasen == false)
Pro začátečníky ale necháváme výslovné porovnání, ať je logika vidět na první pohled.
2) Rozbití dlouhé podmínky na pojmenované mezivýsledky
Takhle se složitější výraz rozloží na čitelné kousky (proměnné se srozumitelnými názvy).
3) Mini HTML stránka s guard clause (ověření věku)
Typické chyby / záludnosti
-
Příliš dlouhá podmínka v jednom
if
Rozděl ji na predikáty a pojmenované mezivýsledky (jeDostatecnyVek,maSpravnouRoli…). -
Negace, které matou
if (!prihlasen == true)je matoucí na čtení. Pro začátek piš radějiif (prihlasen == false). -
Kód bez „rychlého odmítnutí“
Když je vstup špatný, skonči hned (return). Zbytečně se pak nevrstvíifvnoření. -
Chybějící vysvětlení „proč“
Krátký komentář u pravidla (např. „limit 200 Kč kvůli logistice“) výrazně pomáhá čtení. -
Míchání různých typů bez kontroly
Před porovnáním čísla používejNumber(x)a ověřNumber.isNaN(...) == false.
Shrnutí
-
Predikáty = malé funkce vracející
true/false, které dělají kód čitelnější. -
Guard clauses = rychlé odmítnutí neplatných stavů na začátku funkce.
-
Rozděl složité výrazy na pojmenované mezivýsledky s jasnými názvy.
-
Komentuj „proč“, ne „co“.
-
Pro začátečníky klidně piš
== true/== falseu booleanů pro větší srozumitelnost. -
Nejdřív jednoduché kontroly, až potom ty složitější.
Úloha
Zadání (kontext úlohy):
Představ si webovou aplikaci, která povoluje přístup jen některým uživatelům. Aby byl vstup povolen, musí uživatel splnit několik pravidel (věk, přihlášení, správná role). Cílem je napsat čitelný kód, který bude srozumitelný i pro ostatní.
Cíl úlohy:
Procvičíš si:
-
vytváření predikátů (malých funkcí vracejících true/false),
-
použití strážných podmínek (guard clauses),
-
rozdělení dlouhé podmínky na pojmenované mezivýsledky.
Vstupní podmínky:
Student pracuje pouze s nově vytvořeným souborem script.js.
Požadovaný výstup:
-
Napiš funkci
smiVstoupit(vek, jePrihlasen, role). -
Přidej predikáty (např.
jeDospely(vek),jePrihlasenUzivatel(jePrihlasen),maSpravnouRoli(role)). -
Ve funkci
smiVstoupitpoužij guard clause: pokud je vstupní věk neplatný (není číslo nebo je záporný), vrať hnedfalse. -
Rozděl složitou podmínku na pojmenované mezivýsledky a na jejich základě rozhodni, zda vrátíš
truenebofalse. -
Otestuj funkci s několika vstupy a výsledek vypiš do konzole pomocí
console.log().
Doplňující pokyny:
-
Piš podmínky s
== truea== false, aby byla logika jasná. -
Přidej krátký komentář „proč“ k alespoň jednomu pravidlu.
-
Dejte pozor na správné převedení věku na číslo (
Number(vek)).
Řešení úlohy
Co je zde splněno
-
Duplicitní a dlouhé podmínky převedeny do pojmenovaných predikátů (
jePrivilegovan,jeSouborPristupny,neniZakazano,jeAktivni,jeJenProAktivni,jeSouborVerejny). -
Použity guard clauses pro časné návraty (např. bez uživatele ihned
false). -
Kontrola rolí je řešena pomocí
Set+has(tabulkově řízená logika). -
U méně zřejmých částí jsou krátké komentáře a složitější výrazy rozděleny do mezivýsledků.
-
Zachováno původní chování – očekávané výstupy A–D odpovídají původní implementaci.