Chcete vytvářet čistší, lépe udržovatelný kód, který se dá v prostředí WordPressu mnohem snadněji upravovat a rozvíjet? Obrovský rozdíl může přinést věnování pozornosti konceptu návrhových vzorů. Pokud provedete použití návrhových vzorů během vývoje správně, může vám to ušetřit i nějaký čas.
Co jsou návrhové vzory?
Návrhové vzory nám pomáhají vytvářet software (samozřejmě včetně pluginů a šablon WordPressu) na základě již získaných znalostí těch před námi. Nemusíme znovu vynalézat kolo pro řešení některých běžných problémů, které se staly již mnoha vývojářům, a můžeme se zaměřit na specifika naší problémové oblasti a řešit požadavky zákazníků.
Návrhový vzor je opakovatelné řešení běžně se opakujícího problému v návrhu softwaru. Nelze jej použít přímo, ale poskytuje nám šablonu pro řešení problému, kterou lze opakovaně použít v mnoha podobných situacích.
Studium návrhových vzorů a jejich použití při vytváření nového kódu může výrazně zlepšit jeho strukturu a celkovou funkčnost a škálovatelnost.
Po jejich prostudování můžete také zkusit refaktorovat svůj starší kód pomocí návrhových vzorů a uvidíte, že kód může být mnohem lépe manažovatelný.
Vysvětlení návrhových vzorů pomocí hooků
Začněme něčím už známým pro většinu vývojářů WordPressu, a to jsou hooky, konkrétně akce a filtry, které se ve WordPressu hodně používají.
Jedná se o specifickou implementaci vzoru publisher-subscriber(pub-sub). V tomto vzoru definujeme publisher (vydavatele), subscriber (odběratele) a message broker (zprostředkovatele zpráv):
Vydavatelé (publisher) zveřejní nějakou konkrétní událost, v našem případě provedením do_action nebo apply_filters.
Odběratelé (subscriber) se mohou přihlásit k určitým událostem voláním add_action nebo add_filter a provést akci, když nastane událost, ke které se přihlásili.
Zprostředkovatel (message broker), v našem případě jádro WordPress, které zajistí, aby byli všichni odběratelé informováni o událostech vydavatelů, ke kterým jsou přihlášeni.
Výhody vzoru publisher-subscriber (pub-sub)
To nám přináší mnoho výhod. Vydavatel nemusí vědět nic o svém odběrateli a ani odběratelé nemusí vědět nic o vydavateli, pokud umí reagovat na vzniklou událost. I když deaktivujeme plugin, který události vytváří nebo odebírá, nezpůsobí to žádné chyby.
Myslím, že je velmi užitečné nejen odebírat hooky z jádra WordPressu nebo pluginů, ale také vytvářet hooky v kódu a stavět kolem nich svůj kód. Nejenže usnadníte život ostatním vývojářům, pokud se rozhodnou stavět na funkčnosti vašeho pluginu nebo šablony, ale věřte mi, že i váš život bude mnohem jednodušší při implementaci nové funkčnosti do vašeho pluginu nebo šablony.
Ve WordPressu lze použít mnoho dalších šikovných návrhových vzorů. Většinou vyžadují trochu více práce než hooky, ale mohou znamenat obrovský rozdíl v designu vašeho pluginu nebo šablony. Skvělým příkladem návrhového vzoru, který lze použít v kontextu WordPressu, je vzor singleton.
Vzor singleton
Tento vzor vyžaduje znalost objektově orientovaného programování. Pokud s ním nejste obeznámeni, nejprve si ho prostudujte a pak se můžete vrátit ke čtení.
Vzor singleton omezuje iniciaci určité třídy, takže lze vytvořit pouze jednu instanci třídy. Toho lze dosáhnout vytvořením soukromého konstruktoru, statické proměnné pro uložení instance a statické funkce getInstance()
. Tato funkce odpovídá za vytvoření instance objektu, pokud již není vytvořen a uložen v proměnné $instance
. Příklad můžete vidět níže
class SingletonClass
{
private static $instance = null;
private function __construct() {}
public static function getInstance()
{
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
}
Pokaždé, když se nějaký kód pokusí vytvořit novou instanci této třídy, spustí se chyba, protože jde o soukromý konstruktor (tohle je lepší zdokumentovat, aby nedošlo k nedorozumění), takže jediný způsob, jak získat instanci, je prostřednictvím naší funkce getInstance()
.
Jako příklad použití by bylo možné vytvořit základní třídu, jejíž odpovědností je vytvořit instanci všech našich funkcionalit pluginu. K této instanci můžeme navázat například konfigurační data, takže jsou přístupná odkudkoli v pluginu a není nutné je načítat z databáze nebo konfiguračního souboru vícekrát, pouze při vytvoření jediné instance této třídy.
Nepřehánějte to s používáním singleton vzoru
Myslím, že tento vzor je dobrým příkladem také proto, že jeho přílišné používání může být velmi svůdné, protože v mnoha situacích je snadnévidět výhody jeho použití. Neříkám, že by se neměl používat, ale před jeho použitím je třeba zvážit i jeho nevýhody.
Hlavní nevýhodou tohoto vzoru je podle mého názoru to, že pokaždé, když tento vzor použijeme, váže se naše funkčnost na přímou znalost singletonové třídy. To vytváří provázanost kódu a může způsobit, že pokud se rozhodneme něco v singletonu změnit, musíme provést mnoho změn v celém projektu.
Před použitím tohoto vzoru nebo jakéhokoli jiného vzoru proto vždy vše rozvažujte předem, ale pokud budete odvádět dobrou práci, bude to pro vás velmi přínosné.
Další vzory
V tomto článku jsme popsali dva návrhové vzory. Tyto vzory lze použít v mnoha situacích při vývoji WordPressu a mohou zlepšit váš kód a myšlení.
To je však jen velmi malá ukázka toho, co lze díky konceptu návrhových vzorů vytvořit. Návrhových vzorů, které lze při vývoji použít, je mnohem více. Jejich studium a použití by mohlo mít během vývoje obrovský význam a mohlo by mít velmi pozitivní dopad na to, co vyvíjíte.
Pokud vám nedělá problém angličtina, doporučuji vám použití vzorů vyzkoušet buď pomocí známé a kvalitní literatury, jako Design Patterns: Elements of Reusable Object-Oriented Softwarenebo Head First Design Patterns nebo na webech jako je refactoring.guru, kde je mnoho vzorů dobře popsáno včetně příkladů v PHP. V českém jazyku vyšel titul Návrhové vzory v PHP.