Na navigaci | Klávesové zkratky

Singleton Sofie S.

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

  1. Aleš Roubíček #1

    avatar

    Až je mi Sofie líto, s kým asi počne?

    před 16 lety | reagoval [2] David Grudl [3] Martin Grames
  2. David Grudl #2

    avatar

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

    před 16 lety | reagoval [4] Martin Malý
  3. Martin Grames #3

    avatar

    #1 Aleši Roubíčku, Třeba si kvůli Emanovi vyrvala rodidla ? Výborný článek !

    před 16 lety
  4. Martin Malý #4

    avatar

    #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…“

    před 16 lety
  5. CZNeo #5

    avatar

    jak ty to děláš…brečím málokdy, ale u obou blogů dgx pravidelně…

    před 16 lety
  6. 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?

    před 16 lety
  7. v6ak #7

    I tady bych byl proti Singletonu z více důvodů:

    • Jak chceš mockovat?
    • nemusím se zajímat jen o současný http požadavek, ale i o jiný, jako v příkladu.

    Byl bych ochoten připustit interface nebo abstraktní třídu (těžko říct, co by zde bylo lepší) a k tomu Singleton CurrentHttpRequest.

    před 16 lety
  8. zirafka #8

    ve funkci getRemoteAddress bychom prosili místo první dvojtečky otazníček.

    před 16 lety | reagoval [9] David Grudl
  9. David Grudl #9

    avatar

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

    před 16 lety | reagoval [10] zirafka
  10. zirafka #10

    #9 Davide Grudle, Já jsem článek nečetla, páč je určitě sexistický.

    před 16 lety
  11. jos #11

    davide, podpořim tvou snahu těmahle odkazama:

    opensubscriber.com

    mailarchive.com

    před 16 lety
  12. PIF Vojtěch Schlesinger #12

    avatar

    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)

    před 15 lety

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.


phpFashion © 2004, 2024 David Grudl | o blogu

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.