Prekladové mapy v PHP
Povedzme, že robíme stránku predávajúcu malinovku. Majme konfiguračný súbor a v ňom definované číselné konštanty identifikujúce druhy malinoviek.
define('MALINOVKA_CERVENA', 1); define('MALINOVKA_ZELENA', 2); define('MALINOVKA_ZLTA', 3); define('MALINOVKA_BIELA', 4);
S týmito konštantami bežne pracujeme. Ale jedného dňa potrebujeme iterovať cez všetky typy malinoviek a každej vypísať názov. Čo s tým? Za tie roky, čo robím s PHP a prichádzam do styku s rôznymi programátormi som vypozoroval, že nie každý sa vie s týmto triviálnym problémom popasovať. Až príliš časté riešenie vyzerá nejako podobne tomuto:
# pridanie do configu define('MALINOVKA_CERVENA_NAZOV', 'cervena'); define('MALINOVKA_ZELENA_NAZOV,', 'zelena'); define('MALINOVKA_ZLTA_NAZOV', 'zlta'); define('MALINOVKA_BIELA_NAZOV', 'biela'); # a v inom subore echo '<input type="radio" name="malinovka" value="' . MALINOVKA_CERVENA . '">' . MALINOVKA_CERVENA_NAZOV . "<br />"; echo '<input type="radio" name="malinovka" value="' . MALINOVKA_ZELENA . '">' . MALINOVKA_ZELENA_NAZOV . "<br />"; echo '<input type="radio" name="malinovka" value="' . MALINOVKA_ZLTA . '">' . MALINOVKA_ZLTA_NAZOV . "<br />"; echo '<input type="radio" name="malinovka" value="' . MALINOVKA_BIELA . '">' . MALINOVKA_BIELA_NAZOV . "<br />";
Naozaj ma prekvapuje veľká frekvencia výskytov uvedených riešení. Pritom je to jednoduché a stačí siahnuť po tzv. prekladovej mape a vložiť konštanty do poľa.
# prekladová mapa nie je nič iné, než obyčajné asociatívne pole $malinovky = array( MALINOVKA_CERVENA => MALINOVKA_CERVENA_NAZOV, MALINOVKA_ZELENA => MALINOVKA_ZELENA_NAZOV, MALINOVKA_ZLTA => MALINOVKA_ZLTA_NAZOV, MALINOVKA_BIELA => MALINOVKA_BIELA_NAZOV, ); # použitie foreach ($malinovky as $typ => $nazov) { echo '<input type="radio" name="malinovka" value="' . $typ . '">' . $nazov . '<br />"; } ?>
Problém prekladovej mapy je, že je to premenná. Kým konštanty sú globálne dostupné, tak prekladová mapa nie je. K tomuto však už pristupujeme podľa potrieb konkrétnej aplikácie. Môžeme si napríklad vytvoriť triedu so statickou premennou. (Pozor, je to elegantné a zároveň škaredé riešenie, v podstate sa totiž jedná o simuláciu globálnej premennej).
class Malinovky { protected static $druhy = array( MALINOVKA_CERVENA => MALINOVKA_CERVENA_NAZOV, MALINOVKA_ZELENA => MALINOVKA_ZELENA_NAZOV, MALINOVKA_ZLTA => MALINOVKA_ZLTA_NAZOV, MALINOVKA_BIELA => MALINOVKA_BIELA_NAZOV, ); public static dajDruhy() { return self::$druhy; } } # neskôr hocikde v kóde používame foreach (Malinovky::dajDruhy() as $typ => $nazov) { echo '<input type="radio" name="malinovka" value="' . $typ . '">' . $nazov . '<br />"; } ?>
Ak patríte medzi náročných (alebo pohodlných) programátorov, tak si triedu Malinovky napíšete
tak, aby implementovala interface Iterator.
Prekladové mapy sú jednoduché a účinné riešenie a je zaujímavé, že tak veľa pomerne dobrých programátorov ich nepoužíva. Dúfam, že tento článok napomôže zníženiu ich počtu.
Každý dobrý programátor vie, že čísla ani reťazce neexistujú. Jediné, čo naozaj existuje, sú konštanty. A každú konštantu má definovanú iba raz a (v optimálnom a trochu utopickom prípade) všetky na jednom mieste.
Zatiaľ nie sú žiadne komentáre.