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:

  1. pokud je vyhodnocování asercí vypnuté, tak se kód zbytečně neprovádí
  2. pokud by výraz vrátil řetězec, tak tento řetězec funkce assert vyhodnotí jako PHP kód
  3. 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ů.

Jakub Vrána, Seznámení s oblastí, 24.10.2005, diskuse: 6 (nové: 0)

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í.

ikona Jakub Vrána OpenID:

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');
?>

ikona Jakub Vrána OpenID:

Elegantní řešení je k vidění na http://llook.wz.cz/weblog/spot/assert-poznamka:
<?php
assert
('false; // poznámka k aserci');
?>

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

ikona Jakub Vrána OpenID:

Bohužel se necítím v této oblasti dostatečně erudovaný.

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.