Aserce
Školení, která pořádám
Funkce assert provede nastavenou akci (vypíše varování, zastaví program nebo zavolá uživatelskou funkci), pokud se její parametr vyhodnotí jako false. Používá se pro účely ladění a je možné ji volat buď s parametrem typu string (tehdy se předaný kód podobně jako u funkce eval provede) nebo s jakýmkoliv jiným výrazem:
<?php
assert('$pocet == 32');
assert($pocet == 32);
?>
Z několika důvodů je lepší tuto funkci volat vždy s řetězcem obsahujícím kód:
- pokud je vyhodnocování asercí vypnuté, tak se kód zbytečně neprovádí
- pokud by výraz vrátil řetězec, tak tento řetězec funkce assert vyhodnotí jako PHP kód
- v případě chyby se vyhodnocovaný kód dozvíme
Aserce je vhodné používat k provádění tzv. sanity-checks – k ověření podmínek, které by za všech okolností měly být splněny. Já jsem podobný mechanismus (ovšem v Delphi) využil u mariáše, kde se např. po zamíchání karet ověřuje, zda v balíčku zůstalo 32 karet nebo zda je součet peněz jednotlivých hráčů nulový. Aserce se samozřejmě dají snadno simulovat kódem if (assertion) { obsluha }
, ale proti tomuto způsobu mají několik výhod – jednak se dají snadno vypnout a jednak nabízí standardní nastavitelné ošetření neočekávaných stavů.
Diskuse
David Majda:
Podstatnou vadou na kráse PHPkovských asercí je, že narozdíl od všech rozumných programovacích jazyků nemají signaturu
assert(výraz, *informační_text*)
a tedy při porušení aserce se musím často kouknout do kódu, co se přesně stalo. Z popisu bych třeba věděl hned.
(Pokud si říkáte "z kódu přece hned poznáš, co udělal špatně", tak uvažte příklad knihovny, která je vevnitř poměrně komplikovaná, používá asserty a pak jejího uživatele, který vnitřnosti nechce znát a jen používá rozhraní knihovny a použije ho špatně, čímž vevnitř knihovny vyvolá assert. Takovému uživateli je hláška s kódem porušené podmínky uplně na nic.)
Závěr: Ve všech svých projektech si píšu assert vlastní.
Trochu krkolomné, spíše akademické, řešení:
<?php
function my_assert($assertion, $text)
{
assert_options(ASSERT_CALLBACK, create_function('$file, $line, $code', "echo '" . addcslashes($text, "\\'") . "';"));
assert($assertion);
}
my_assert('$pocet == 32', 'Nesprávný počet karet');
?>
Karel Benak:
A co pouzit bud PHPUnit testy, nebo SimpleUnit testy?
cita:
OT: nechtěl byste jako jedno z dalších témat napsat něco o snmp? ?yslím ýe nejsem jedniný koho by to zajímalo. díky cita
Jakub Vrána :
Bohužel se necítím v této oblasti dostatečně erudovaný.
Diskuse je zrušena z důvodu spamu.