Slovník pojmů
Podmínka v programování
Podmínka vybírá kód podle výsledku logického výrazu. Její dobrý název a malý rozsah pomáhají zachovat význam business pravidla i při pozdější změně.
Stručná definice
Rozhodnutí podle true nebo false.
Logický neboli boolean výraz vyhodnotí true nebo false. Podmínka tuto hodnotu použije k výběru větve programu; boolean hodnota sama není podmínka, ale její výsledek nebo vstup.
Dobrá podmínka vyjadřuje konkrétní význam. Místo dlouhého anonymního výrazu je často čitelnější pojmenovat proměnnou nebo funkci například $canPayOrder.
Jaký problém řeší
Umožňuje aplikaci reagovat na stav a pravidla.
Podmínka je jedním krokem algoritmu. Rozhoduje například o povolení platby, validaci vstupu, zobrazení chyby nebo přechodu objednávky do dalšího stavu.
- platba jen pro nezrušenou objednávku s kladnou cenou
- autorizace operace nad chráněnými daty
- validace vstupu a volba odpovědi API
- stav načítání, prázdného výsledku nebo hotových dat ve frontendu
Praktický příklad
Pojmenované pravidlo pro zahájení platby
Ukázka neschovává tři pravidla do několika vnořených větví. Funkce vrátí pojmenovaný výsledek a guard clause ihned ukončí neplatnou cestu.
Kontrola v prohlížeči může uživateli pomoci, ale není bezpečnostní hranice. Server musí znovu ověřit stav objednávky i oprávnění.
PHP
function canPayOrder(Order $order): bool
{
return !$order->isCancelled()
&& $order->totalInCents() > 0
&& !$order->isPaid();
}
if (!canPayOrder($order)) {
throw new DomainException('Objednávku nelze zaplatit.');
}
Jak funguje
Rozhodnutí o platbě objednávky
Podmínka je malá, ale její důsledek může být změna důvěryhodného stavu.
- Načtení stavu Aplikace pracuje s aktuální cenou a stavem objednávky.
- Vyhodnocení Všechny požadavky spojené přes && musí platit.
- Pravdivá větev Aplikace zahájí platbu.
- Nepravdivá větev Operaci odmítne a vrátí srozumitelný stav.
Hlavní části a varianty
Větvení má odpovídat typu rozhodnutí.
Nejkratší zápis nebývá automaticky nejčitelnější.
if, else a elseif
Volí hlavní, opačnou a další variantu podle logického výrazu.
Porovnání
V PHP i JavaScriptu je při známém typu obvykle vhodné === a !==; pravidla převodu se ale mezi jazyky liší.
&& a ||
&& vyžaduje všechny části, || alespoň jednu. Jejich záměna mění business význam.
Guard clause
Krátká návratová nebo chybová větev omezí zbytečné vnořování.
Omezení a časté chyby
Více větví nemusí znamenat více jistoty.
Čitelné rozhodování
- pojmenovat složitý boolean výraz
- preferovat guard clause před hlubokým vnořením
- testovat hranice pravidla
Rizika
- zaměnit = za porovnání
- zaměnit && a ||
- považovat klientskou podmínku za autorizaci
Praktické použití
Pravidlo má být čitelné i při výjimce.
Vnořené podmínky se rychle čtou hůř, protože čtenář drží v hlavě více negací. Pomůže rozdělení do pojmenovaných funkcí nebo změna toku na guard clauses.
Cílem není podmínky odstranit, ale nechat jejich tvar odpovídat skutečným rozhodnutím, ne technickým detailům.
Boolean je hodnota true nebo false, kdežto podmínka je konstrukce, která podle výsledku zvolí cestu. PHP i JavaScript dokážou v podmínkovém kontextu převést některé hodnoty na truthy nebo falsy, ale u business pravidel je bezpečnější pracovat s pojmenovaným booleanem. Čtenář pak neodvozuje význam z kombinace nul, prázdných řetězců a negací.
Pokud rozhodujete mezi několika variantami jedné hodnoty, může být přehlednější switch nebo v novějším PHP match. Ternární operátor se hodí pro krátký výraz s jasnými oběma výsledky, ne pro několik pravidel najednou. Cyklus může podobnou podmínku vyhodnocovat opakovaně, ale podmínka sama není automaticky ověřená autorizace ani celý algoritmus.
Porovnání a přiřazení je třeba rozlišit i při review: v PHP i JavaScriptu výraz s = mění hodnotu, zatímco === porovnává hodnotu i typ. Volnější porovnání má v obou jazycích vlastní pravidla převodu, která mohou zamlžit business význam. Jednoduché pojmenované rozhodnutí a test obou větví jsou proto obvykle bezpečnější než co nejkratší zápis.
Podmínka by měla pojmenovat důvod rozhodnutí, ne jen technický detail. Například canPayOrder říká, co pravidlo znamená, zatímco směs několika porovnání nutí čtenáře význam znovu skládat. U kritického kroku objednávky se navíc vyplatí otestovat zrušený stav, nulovou cenu, již provedenou platbu i kombinaci těchto hranic.
Při práci s objednávkou bývá užitečné oddělit ověření technického vstupu od pravidla, zda je akce v aktuálním stavu povolená. První může říct, že požadavek neobsahuje číslo objednávky, druhé že objednávka už byla zaplacena. Rozlišení vede k přesnější chybové odpovědi, přehlednějším testům a menšímu riziku, že se business rozhodnutí schová do obsluhy formuláře.
Kontrola změny
Ověřte význam každého spojení.
Nejdřív vyslovte novou pravdu pravidla a testy, potom upravte zápis.
- rozlišit boolean hodnotu a rozhodovací konstrukci
- ověřit &&, ||, negaci a hranice porovnání
- omezit zbytečné vnořování
- vykonat autorizaci na serveru
Časté otázky
Podmínky v každodenním kódu
Je boolean a podmínka totéž?
Ne. Boolean je hodnota, podmínka je konstrukce, která podle ní větví.
Kdy použít guard clause?
Když neplatný nebo výjimečný stav může skončit na začátku funkce.
Kdy je vhodný switch nebo match?
Při volbě mezi variantami jedné hodnoty; složitá kombinace pravidel může být čitelnější přes if.
Zaručí podmínka autorizaci?
Ne. Musí používat důvěryhodná data a běžet na serveru.
Osobní zkušenost
Business pravidla mají být vidět i v kódu.
V PHP aplikacích odděluji rozhodnutí o stavu objednávek a oprávněních tak, aby šla přesně testovat.