Návrhové vzory (design pattern) jsou způsoby, jak přemýšlet o programování.
Přináší sbírku rad, hotových postupů, best-practices a pohledů na vývoj. Pro každé programové paradigma a typ úlohy existují určité návrhové vzory, které se nejlépe hodí.
V programování se řešení určitých typů úloh neustále opakuje, proto dává smysl zvolit jednu metodu, jak tyto úlohy řešit a tu stále opakovat.
Hlavní přínos vzniká zejména při vývoji v týmu, kdy všichni vědí, jakým způsobem se bude aplikace vyvíjet (podle jakého návrhového vzoru) a ten pouze aplikují. Tímto následně odpadají zbytečné desítky hodin debugování podivně napsaného kódu a snahy pochopit principy, které autor zamýšlel.
Můj oblíbený návrhový vzor je MVC (z anglických slov Model View Controller), který říká, že se aplikace dělí na 3 nezávislé vrstvy, které se volají postupně a předávají si data.
Například při vykreslování stránky to může vypadat tak, že se nejprve rozhodne, o jaký typ stránky jde (například detail kategorie), proto se zavolá CategoryController s metodou detail.
Konkrétní příklad (hodně zjednodušuji):
class CategoryController{public CategoryManager $categoryManager;public function actionDetail(string $id): void{$this->template->id = $id;$this->template->category = $this->categoryManager->getById($id);}}
Poznámka:
Jde pouze o ukázkový kód, který vysvětluje princip návrhového vzoru
MVC.V reálné implementaci bychom museli dále dořešit, jak například získat instanci
CategoryManagerua jak ho předat do property. Typicky se pro tento typ úlohy používáDependency injection.
Ještě před vykreslením stránky pro detail kategorie se nejprve zavolá CategoryController, který má za úkol přijmout aktuální požadavek (tedy, že vykreslujeme detail kategorie s určitým ID, který získá router třeba v URL), získá data (zeptá se na ně odpovídajícího Modelu) a finální data předá do šablony pro vykreslení.
Obrovská výhoda tohoto principu je zejména v tom, že můžeme napsat mnoho modelů (aplikační logiky), která je nezávislá na způsobu prezentování dat (šabloně) a vzniká tím znovupoužitelný kód. Pokud budeme totiž chtít CategoryManager použít v jiném projektu, jednoduše přes Controller předáme specifickým způsobem data, která se vykreslí podle šablony, který definuje sám projekt, zatímco aplikační logika zůstane stejná a ničemu to nevadí, protože softwarová vrstva splnila své domluvené rozhraní a zodpovědnost.
Praktická poznámka:
Návrhový vzor
MVCpoužívá většina moderních frameworků, jako je například Nette, Symfony, Laravel a další.S
MVCse můžeme setkat i při vývoji mobilních aplikací a dalších typů softwaru, kde potřebujeme získat data a ta vykreslit v šabloně podle typu stránky nebo pohledu.
Obecně v programování existuje mnoho návrhových vzorů, které se pro vývoj webů nehodí. Tento seznam popisuje nejdůležitější vzory, které sám používám a měli byste je znát.
Kompletní přehled všech návrhových vzorů, příklady jejich použití a podrobné vysvětlení najdete na samostatné stránce.
Model (aplikační logika a data), View (šablona a pohled na data) a Controller (propojení Modelu a View).Dependency injection, kdy má každá služba jen jednu instanci, která se předává napříč aplikací).Adapter převádí data z jednoho typu na druhý (typicky převádíme nativní PHP datové typy na databázové a zase zpět).Návrhových vzorů existuje ještě celá řada, toto byly ty nejdůležitější, které byste měli znát.
Některé programátorské techniky vývoje se považují za tzv. anti pattern, což je přesný opak návrhového vzoru. Obvykle jde o techniku, při které vzniká podivný kód, který nelze jednoduše debugovat, udržovat a chová se "magicky".
Typickým příkladem je použití Globálních proměnných.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články a novinky nejen ze světa PHP a programování. Nenechte si ujít jediný článek.
Články píše Jan Barášek © 2009-2025 | Kontakt | Mapa webu
Status | Aktualizováno: ... | cs