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 foreach
správně by neměl být instancován přímo, ale
 pomocí Factory method nad daným uložištěm
např. 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
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é vzory
  Computer 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 ;-)

More Related Content

PPT
Czjug Zari 2008
PPT
Squid 3 for windows blogbudaqdegil.blogspot.com
PPTX
Výkonnost webových aplikací
PPTX
Použitelnost
PPTX
Konec cargo kultu
PPTX
Analytika ve světě PPC
PPTX
Vybrané e-shopářské vychytávky z Google Analytics
PDF
RFM analýza
Czjug Zari 2008
Squid 3 for windows blogbudaqdegil.blogspot.com
Výkonnost webových aplikací
Použitelnost
Konec cargo kultu
Analytika ve světě PPC
Vybrané e-shopářské vychytávky z Google Analytics
RFM analýza

Similar to Návrhové vzory v programování (20)

PDF
Martin Kopta: Výhody a nevýhody paternů v GUI
PDF
Úvod do OOP
PDF
KST/ICSHP - 5. a 6. přednáška
PDF
App Design Architecture
PPTX
Dependency injection v .Net Frameworku
PDF
KST/ICSHP - 1. přednáška
DOCX
PPTX
Pokročilé techniky programování .NET a C#
PDF
Spring framework - J2EE S Lidskou Tvari
PDF
Úvod do vývoje pro platformu iOS [ZČU 24.4.2014]
PPTX
Solid principy v oop návrhu
PDF
Vývoj aplikací pro iOS
PPTX
PPTX
Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)
PPTX
TNPW2-2014-01
ODP
20101124 Aplikované nástroje SW inženýra
PDF
KST/ICSHP - 3. a 4. přednáška
PPTX
Entity Framework v enterprise aplikacích
PPTX
Clean code
PDF
4 sa433 prednadka 03
Martin Kopta: Výhody a nevýhody paternů v GUI
Úvod do OOP
KST/ICSHP - 5. a 6. přednáška
App Design Architecture
Dependency injection v .Net Frameworku
KST/ICSHP - 1. přednáška
Pokročilé techniky programování .NET a C#
Spring framework - J2EE S Lidskou Tvari
Úvod do vývoje pro platformu iOS [ZČU 24.4.2014]
Solid principy v oop návrhu
Vývoj aplikací pro iOS
Zend Framework 2.0 (ZFMeetup Praha 3.11.2011)
TNPW2-2014-01
20101124 Aplikované nástroje SW inženýra
KST/ICSHP - 3. a 4. přednáška
Entity Framework v enterprise aplikacích
Clean code
4 sa433 prednadka 03
Ad

More from Taste Medio (20)

PDF
Zodpovědně na automatizovaný účet
PDF
Pépécéčkaři versus Google Analytics 4
PDF
Jak (a proč) pracovat s klíčovkou?
PDF
Vyhodnocování tendrů aneb insighty z B2B průzkumů
PDF
Právní bitvy o PPCčka aneb věděli jste, že...?
PDF
Retenční analýza - krok za krokem
PDF
Dejte data z vašeho XML feedu do správné kondice
PPTX
Impresní remarketing RTB a FB
PDF
Symboly značky prakticky
PDF
Marketingový framework PAVRD
PDF
Pozornost jako spouštěč i zabiják krizí
PDF
DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?
PPTX
Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...
PPTX
Bageta plná hejtu
PDF
Collabim: behind the scene (part #001)
PDF
"Jak výhodně incestovat" aneb srandy s klíčovkami
PDF
Agentura/In-house/Freelance - kde dělat SEO?
PDF
Příběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuci
PDF
Kde jsou limity zákaznické 360°?
PDF
Marketing a data. Umíme v nich najít hodnotu?
Zodpovědně na automatizovaný účet
Pépécéčkaři versus Google Analytics 4
Jak (a proč) pracovat s klíčovkou?
Vyhodnocování tendrů aneb insighty z B2B průzkumů
Právní bitvy o PPCčka aneb věděli jste, že...?
Retenční analýza - krok za krokem
Dejte data z vašeho XML feedu do správné kondice
Impresní remarketing RTB a FB
Symboly značky prakticky
Marketingový framework PAVRD
Pozornost jako spouštěč i zabiják krizí
DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?
Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...
Bageta plná hejtu
Collabim: behind the scene (part #001)
"Jak výhodně incestovat" aneb srandy s klíčovkami
Agentura/In-house/Freelance - kde dělat SEO?
Příběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuci
Kde jsou limity zákaznické 360°?
Marketing a data. Umíme v nich najít hodnotu?
Ad

Návrhové vzory v programování

  • 1. Návrhové vzory v programování Jan Tichý WebCamp, 27. března 2008
  • 2. 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
  • 3. 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
  • 4. 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
  • 5. 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...
  • 6. 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ů
  • 7. 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ý
  • 8. 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
  • 9. 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
  • 10. 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 foreach správně by neměl být instancován přímo, ale pomocí Factory method nad daným uložištěm např. Zend_Config, Zend_Form apod.
  • 11. 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í
  • 12. 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
  • 13. 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)
  • 14. 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
  • 15. 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é vzory Computer press, 2007.
  • 16. 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
  • 17. Díky za pozornost Otázky, připomínky, doplnění? www.phpguru.cz ;-)

Editor's Notes

  • #7: instance se nezískává přes konstruktor, ale nepřímo pomocí statické metody – factory1.php metoda může vracet i již existující instanci – factory2.php nejsme vázáni konkrétní třídou instance – factory3.php 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ů, například singleton, (iterator), pool
  • #8: lazy/late initialization – odložená (pozdní, líná) inicializace – až v getInstance early ( časná ) inicializace – již při deklaraci statické proměnné – private static $instance = new Foo; -- unexpected T_NEW serializovatelnost – unserialize je vedle konstruktoru a klonování další cesta, jak vznikají instance – byly by tam dvě singleton1.php – základní kostra singleton2.php – ukázka na Auth singleton3.php – totéž na statické třídě
  • #9: singleton3.php – ukázka statické Auth třídy
  • #10: zabránit instancování – soukromý konstruktor, deklarace jako konečná (final) library1.php – můj Convert library2.php - Zend_Json
  • #11: - v SPL (Standard PHP Library) – Iterator, RecursiveIterator, RecursiveIteratorIterator, ArrayIterator, DirectoryIterator, CachingIterator apod. - iterator1.php – definice interface - iterator2.php –ukázka použití – instancování iterátoru „vedle“ uložiště – uložiště se klonuje apod. (rozhraní Iterable v Javě) – odděluje se tak samotné uložiště od svého iterátoru – na to je ale potřeba mít možnost soukromých vnitřních tříd, což PHP neumí
  • #12: template1.php
  • #13: adapter1.php - nebo samostatná třída implementující daný interface, která má instanci cílové třídy ve své proměnné – Zend_Auth_Adapter_Interface adapter2.php - buď obecný předek všech adaptérů s implicitníma metodama + jejich předefinování v konkrétních potomcích (nevýhoda – nutnost mít ho jako předka) -- např. abstract class Zend_Translate_Adapter_Abstract, Zend_Db_Adapter_Abstract - ale i tady by měl být k dispozici interface! a vše proti němu – u Zendu chybí adapter3.php - nebo potomek cílové třídy implementující daný interface – v Zendu není – ukázka s Nette
  • #14: decorator1.php - prasopes
  • #15: například reverzní kaskáda u kaskádové transparentní hierarchické cache