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.

  1. Načtení stavu Aplikace pracuje s aktuální cenou a stavem objednávky.
  2. Vyhodnocení Všechny požadavky spojené přes && musí platit.
  3. Pravdivá větev Aplikace zahájí platbu.
  4. 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.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.