Úloha 4 – Refaktoring podmínek s vedlejšími efekty
| Stránky: | Moodle ZČU |
| Kurz: | Sada úloh pro procvičení v předmětu KVD/PGM1P (BP Vítek Dolný) |
| Kniha: | Úloha 4 – Refaktoring podmínek s vedlejšími efekty |
| Vytiskl(a): | Guest user |
| Datum: | neděle, 18. října 2026, 09.59 |
Úvod do úlohy
Když už studenti zvládnou logické operátory a jejich kombinace, je důležité zaměřit se na odhalování a opravování chyb. Logické výrazy totiž patří k místům, kde se začátečníci často pletou – jednak kvůli složitosti podmínek, jednak kvůli nejasnostem v prioritách operátorů nebo chování short-circuit evaluace. Umět chyby nejen poznat, ale i vysvětlit, proč k nim dochází, je skvělý krok k tomu, aby psali spolehlivý a čitelný kód.
Teorie a principy
-
Nesprávná negace: Negace
!musí být aplikovaná na správnou část výrazu. Bez závorek často dojde k jinému výsledku, než autor zamýšlel. -
Chybějící závorky při kombinaci operátorů: Přestože JavaScript má jasně danou prioritu (
!>&&>||), v dlouhých podmínkách je snadné se splést. -
Ignorování short-circuit evaluace: Někdy se spoléháme, že se vyhodnotí všechny části podmínky, ale některé funkce nebo výrazy se přeskočí. To může vést k chybějícím vedlejším efektům.
-
Nepřehledné řetězení podmínek: Pokud má výraz více než 2–3 operátory bez rozdělení nebo komentářů, snadno se ztratí logika.
Praktické příklady chyb a oprav
1. Chybná negace
2. Zapomenuté závorky při kombinaci
3. Ignorování short-circuit chování
Typické chyby / záludnosti
-
Záměna
=za==nebo===v podmínkách (místo porovnání dojde k přiřazení). -
Příliš složité podmínky na jeden řádek – i když jsou syntakticky správné, špatně se čtou a snadno se v nich udělá chyba.
-
Špatné chápání negace u složených výrazů – studenti často zapomenou, že
!(a && b)není totéž co!a && b. -
Neuvědomění si truthy/falsy hodnot – například prázdný řetězec
""nebo číslo0mohou způsobit opačné vyhodnocení, než začátečník čeká.
Shrnutí
-
Dávej pozor na to, kam přesně umisťuješ negaci
!. -
Používej závorky k jasnému vyjádření logiky a nezávislost na prioritě operátorů.
-
Pamatuj, že short-circuit evaluace může přeskočit části kódu (např. volání funkcí).
-
U složitých podmínek se vyplatí rozdělení na menší kroky nebo využití mezivýsledků.
Úloha
Zadání (kontext úlohy)
Spravuješ skript, který rozhoduje, zda odeslat newsletter uživateli. V kódu jsou chyby v negacích, závorkách a ve způsobu volání funkce se side-effectem (zápis do logu). Tvým úkolem je podmínky opravit a zpřehlednit.
Cíl úlohy
Procvičíš si správné použití logických operátorů &&, ||, !, závorek a pochopíš, kdy se druhá část výrazu nemusí vyhodnotit (short-circuit).
Vstupní podmínky
-
Pracuješ s přiloženým souborem
script.js.
Požadovaný výstup
-
Oprav logiku tak, aby se newsletter odeslal pouze tehdy, když platí všechno z následujícího:
-
uživatel je potvrzen (
potvrzen === true), -
má ověřený e-mail (
overenEmail === true), -
není odhlášen (
odhlasen === false), -
má souhlas se zasíláním (
maSouhlas === true).
-
-
Zajisti, aby se funkce
zapisAktivitu()vždy zavolala před rozhodnutím (mimo podmínku), aby ji nepřeskočilo zkrácené vyhodnocování. -
Použij závorky pro jasnou a čitelnou logiku.
-
Přidej proměnnou
maSouhlas(boolean) a zahrň ji do rozhodování – bez souhlasu se nikdy neodesílá.
Doplňující pokyny
-
Dávej pozor, co neguješ – operátor
!aplikuj na přesně tu část, kterou chceš popřít (např.!odhlasen). -
Pokud je podmínka delší, rozděl ji na více řádků nebo si připrav mezivýsledky.
-
Nepoužívej
==, preferuj===/!==. -
Nespoléhej na vyhodnocení uvnitř
ifs voláním funkce; side-effecty dělej mimo podmínku.
Soubor
Řešení úlohy
Co je zde splněno
-
Opraveny chyby v původní logice (
!potvrzen && ...→ správně jako pozitivní kontroly a jedna negace jen uodhlasen). -
Funkce
zapisAktivitu()se volá před vyhodnocením podmínky, aby nebyla přeskočena kvůli short-circuit. -
Přidána podmínka
maSouhlas, bez které se newsletter nikdy neodesílá. -
Použity mezivýsledky (
jePotvrzen,maOverenyEmail…) pro lepší čitelnost a přehlednost. -
Logika je zapsaná pomocí
&&a závorek jednoznačně.
Poznámky
Tento přístup je čitelnější než vnořené podmínky na jednom řádku – dobře ukazuje, co přesně se kontroluje.
Pokud by bylo cílem mít stručný zápis, šlo by použít i přímo: