Slíbil jsem přijít se silným lidským příběhem. Příběhem programátorky, která stojí před těžkou životní volbou. Její jméno je Sofie.
Jak už jste pochopili z druhé věty, Sofie nebyla právě pohledná žena. Zpoza prořídlých neupravených kadeří na vás přes velké umaštěné brýle hleděly dioptriemi zvětšená drobná očka, kostěné obroučky marně skrývaly uhří farmu táhnoucí se podél líček až ke knírku. V redakci, kde pracovala, platila za velmi zdatnou programátorku. Na svůj redakční systém byla náležitě pyšná, snad ještě víc, než na titul Miss Second Life 2007. Pýcha byla oprávněná, kód systému byl tak křišťálově čistý, že ani křišťál křišťálově čistější být nemůže.
Ačkoliv měla Sofie z návrhových vzorů velmi ráda právě singleton, jednalo se spíš o spřízněnost duchovní – v kódu jej používala umírněně, jen tam, kde se skutečně hodil. Například pro zapouzdření HTTP požadavku:
/**
* @copyright Sofie S., 2006
*/
class HttpRequest
{
/********************* singleton *******************/
private static $instance;
private function __construct()
{}
public static function getInstance()
{
if (self::$instance === null) {
self::$instance = new self;
}
return self::$instance;
}
private function __clone()
{}
private function __wakeup()
{}
/********************* HTTP request encapsulation *******************/
public function getRemoteAddress()
{
return isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null;
}
...
}
// užití
if (HttpRequest::getInstance()->isPost()) {
echo 'Hey mister POSTman!';
}
To pro představu snad stačí. Víc kódu ani ukázat nemůžu, protože nemám Sofiin souhlas a mazat kopyrajty si mi nechce. Ale určitě se shodneme na tom, že zapouzdření HTTP požadavku do formy singletonu je perfektní volba:
- program v PHP vždy obsluhuje jen jeden HTTP požadavek (a právě jeden)
- je praktická jeho globální dostupnost
- objekt se hezky líně inicializuje až při prvním použití
Klíčový je samozřejmě první bod. Mohlo by se stát, že by v budoucnu bylo potřeba operovat nad dvěma HTTP požadavky? To bezpochyby ne, odpověděla si Sofie už v době návrhu systému a volba singletonu byla jasná věc.
Nemá smysl zastírat, že se Sofii líbil jeden redaktor z vedlejší kanceláře. Věděli to všichni. Ona z něj byla doslova hotová! Stačilo, aby prošel kolem jejího počítače a rvala si rodidla. Proto když jednoho pondělního rána našla na stole vzkaz, že s ní chce o něčem mluvit, málem štěstím omdlela.
Řeč se týkala redakčního systému. Eman nešetřil chválou a dokonce prohlásil, že Sofie je jejich poklad a co by si bez ní počal. Pak se jí, snad omylem, letmo dotkl ramene. Sofie pocítila v podbřišku slastné zachvění. „Je tu něco, co jsem ti chtěl už dávno říct,“ pohlédl jí Eman do očí, „když mám dlouho otevřený článek a pak kliknu na uložit, tak se mi objeví: byl jste automaticky odhlášen, bla bla bla, a celý článek je v řiti. Můžeš s tím něco udělat?“
Nebylo na světě nic, co by Sofie pro Emana neudělala. Ihned se pustila do práce.
V podstatě šlo o banální úkol. Dokonce tuhle slyšela, že stejný problém dokázali po dvou letech vyřešit borci na jednom blogovém serveru, to by bylo, aby si s tím ona během půl hodinky neporadila! Princip je jednoduchý: v okamžiku, kdy se detekuje vypršení časového limitu a uživatel se automaticky odhlásí, tak se objekt s aktuálním HTTP požadavkem, který představuje třeba právě odeslání formuláře, uloží do session. A pak stačí jen upravit přihlašovací rutinu, aby po úspěšném přihlášení, je-li v session uložený tento objekt, tak se nastavil jako aktuální a vykonal. Je to otázka pár řádek kódu a za dvacet minut už bude sedět u Emana a předvádět mu, jak to báječně funguje. Dají si společně šálek kávy, plánovala si. A možná … možná ji bude chtít pozvat na skleničku, ačkoliv ona sklo nerada. Ale Emanovi neumí říci ne.
Na kávu ten den nedošlo. Zrada přišla z míst, odkud je Sofie nečekala. Zradil ji singleton. Sofie musela povolit serializaci objektu HttpRequest, musela vyřešit prohození těchto objektů v metodě getInstance, ale především se musela smířit s faktem, že na ten krátký okamžik, kdy se uložený požadavek obnovil ze session, tak na tu chvíli existovaly požadavky dva. I singleton tvořil pár. Jen ona zůstala sama.
Komentáře
Aleš Roubíček #1
Až je mi Sofie líto, s kým asi počne?
David Grudl #2
#1 Aleši Roubíčku, co jsem slyšel naposled, tak prý na nedávném srazu Linuxářů po ní jelo několik kluků a s jedním dokonce už chodí.
Martin Grames #3
#1 Aleši Roubíčku, Třeba si kvůli Emanovi vyrvala rodidla 😁 Výborný článek !
Martin Malý #4
#2 Davide Grudle, Její křišťálový příběh mě chytil za okoralé osrdí a donutil mne nominovat ji na Křišťálovou Lupu…
A to co popisuješ je, ehm, ukázka toho, čemu říkám „až na poli zjistili, že žigulík neseje…“
CZNeo #5
jak ty to děláš…brečím málokdy, ale u obou blogů dgx pravidelně…
petr #6
uhrovitá farma táhnoucí se až ke knírku… a eman který neuspokojuje… určitě si teď říkáte to co já…
mail na ni by nebyl?
v6ak #7
I tady bych byl proti Singletonu z více důvodů:
Byl bych ochoten připustit interface nebo abstraktní třídu (těžko říct, co by zde bylo lepší) a k tomu Singleton CurrentHttpRequest.
zirafka #8
ve funkci
getRemoteAddress
bychom prosili místo první dvojtečky otazníček.David Grudl #9
#8 zirafko, tomu říkám důslednost! A to si představ, že jsem v článku Emana několikrát přejmenoval na Emila a nikdo z první stovky čtenářů si toho nevšiml.
zirafka #10
#9 Davide Grudle, Já jsem článek nečetla, páč je určitě sexistický.
jos #11
davide, podpořim tvou snahu těmahle odkazama:
opensubscriber.com
mailarchive.com
PIF Vojtěch Schlesinger #12
Hezký příklad o tom, jak si člověk říká, no to je jasný singleton x)). A pak se bije do hlavy, proč z toho sakra dělal singleton a v nejhorším případě celé přepisování kódu x)
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.