návrhové vzory v programování
TRANSCRIPT
Návrhové vzory v programování
Jan TichýWebCamp, 27. března 2008
Program přednášky
Co jsou návrhové vzory
Typy návrhových vzorů
Příklady konkrétních návrhových vzorů
Literatura a elektronické zdroje
Co jsou návrhové vzory
• Obecné řešení častého problému při návrhu software
• Explicitně pojmenované obecné principy, které programátoři intuitivně dávno znají
• Návrhové vzory × algoritmy × knihovny
Proč používat návrhové vzory
• Podporují správné programátorské postupy• Podporují principy čistého OOP• Nevymýšlíte již vymyšlené• Rozšiřitelnost a znovupoužitenost aplikace• Čitelnost aplikace, jednotná filozofie
Typy návrhových vzorů
• Creational patterns – Factory, Singleton, Builder, Prototype, Object Pool...
• Structural patterns – Adapter, Bridge, Composite, Decorator, Facade...
• Behavioral patterns – Chain of Responsibility, Iterator, Observer, Strategy, Template Method...
• Architectural patterns – MVC,
• Concurrency patterns – Read Write Lock...
Factory Method
instance se nezískává přes konstruktor, ale nepřímo pomocí statické metody
metoda může vracet i již existující instanci
nejsme vázáni konkrétní třídou instance
v obecnějším pojetí deklaruje jen rozhraní, konkrétní typy instance určují potomci
často využívána v rámci ostatních vzorů
Singleton
v aplikaci nejvýše jedna instance nějaké třídy
typicky instance aktuálního uživatele
například Zend_Auth, Zend_Registry, Zend_Controller_Front, pooly, cache apod.
využívá Factory Method
konstruktor, klonování, serializovatelnost
z puristického hlediska není úplně čistý
Singleton: proč objekt a nikoliv třída
objekt může implementovat rozhraní
odkaz na něj se může předávat jako parametr
je možné i v průběhu aplikace rozhodnout, které třídy bude vytvářený objekt instancí
pokud odpovídá nějakému objektu reálného světa, je zpravidla vhodné jej instancovat
Library class
seskupené statické metody
nevytváří se instance, jen statické volání
mělo by se zabránit možnosti instancování
pokud je potřeba nějaká statická proměnná, možná bude vhodnější použít singleton
například Zend_Json
Iterator
zajišťuje sekvenční přístup k nějakému seznamu, kontejneru, poli apod.
zapouzdřuje vnitřní implementaci uložištěv PHP (SPL) zabudovaný interface Iterator,
jeho implementace lze použít v cyklu foreachsprávně by neměl být instancován přímo, ale
pomocí Factory method nad daným uložištěmnapř. Zend_Config, Zend_Form apod.
Template Method
definuje základní kostru nějakého algoritmu
dílčí kroky mohou definovat až jednotliví potomci pomocí překrytých metod
struktura algoritmu ale zůstává stejná
šablonová metoda je zpravidla finální
rodič je zpravidla abstraktní
Adapter
potřebuji, aby třída měla jiné rozhraní, než má
mezi ni a sebe vložím adaptér, který převede skutečné rozhraní na mnou požadované
sjednocení různých rozhraní do jednotného
požadované rozhraní dáno zpravidla nějakým definovaným interface – tři možnosti realizace
např. Zend_Auth, Zend_Db, Zend_Translate
Decorator
Alternativa k dědění
Přidává k objektu další dodatečnou funkčnost
Původní objekt zabalí do jiného objektu
Vnější objekt zajišťuje nové funkce, vše ostatní deleguje na původní objekt
Oba dva by měli mít společného rodiče (abstraktní třída či interface)
Observer
Pozorovatelé se na začátku zaregistrují u pozorovaného objektu
Při nějaké události pak pozorovaný objekt upozorní všechny registrované pozorovatele
Typicky u událostmi řízeného programování
Registrace dynamicky anebo natvrdo v kódu
Literatura
Erich Gamma, Richard Helm, Ralph Johnson, John Vlisside: Design Patterns: Elements of Reusable Object-Oriented Software. Addison Wesley, 1995.
Erich Gamma, Richard Helm, Ralph Johnson, John Vlisside: Návrh programů pomocí vzorů. Stavební kameny objektově orientovaných programů. Grada, 2003.
Rudolf Pecinovský: Návrhové vzoryComputer press, 2007.
Elektronické zdroje
• Bruce Eckel: Thinking in patterns. www.bruceeckel.com
• Wikipedia: en.wikipedia.org/wiki/Design_pattern (computer_science)
• Vince Huston: www.vincehuston.org/dp/
• Miloš Dvořák: Návrhové vzory (design patterns)objekty.vse.cz/Objekty/Vzory
• Pavel Drbal: objekty.vse.cz
• Ilja Kraval: www.objects.cz
Díky za pozornost
Otázky, připomínky, doplnění?
www.phpguru.cz ;-)