1. prosince 2013, Brno ´ Pˇripravil: David Prochazka
´ ´ ıme objekty Navrhov e´ vzory: vyrab´ ´ ´ ´ Zaklady objektoveho navrhu
´ Co jsou to navrhov e´ vzory
ˇ Obsah pˇredna´ sky 1
´ Co jsou to navrhov e´ vzory
2
´ Tovarny
3
´ ri Samotaˇ
4
Stavitele´
5
Shrnut´ı
Strana 2 / 28
´ Co jsou to navrhov e´ vzory
Strana 3 / 28
´ Navrhov e´ vzory – Design Patterns ´ ´ Navrhov e´ vzory muˇ oznaˇcit za fintu“, ˚ zeme s nadsazkou ” ˇ urcit ˇ y´ problem. ´ jak rˇesit ´ Existuje 23 zakladn´ ıch vzoru, ˚ od kter´ych se odvozuj´ı dalˇs´ı. ´ v knize Gama, Helm, Johnson, NV byly poprve´ popsany Vlissides: Design Patterns (Gang of Four) ´ ´ Vzorem muˇ rˇeˇsen´ı problemu. ˚ ze b´yt jakekoliv
´ Co jsou to navrhov e´ vzory
Strana 4 / 28
ˇ ´ Rozdelen´ ı navrhov ych ´ vzoru˚ 1
ˇ s´ı problemy ´ ´ ren´ı objektu˚ – Tvoˇrive´ vzory: Reˇ okolo vytvaˇ ´ y poˇcet instanc´ı, v´yber ˇ vhodne´ tˇr´ıdy jak zajistit spravn´ ´ noveho objektu atp.
2
´ ı zmeny: ˇ Strukturaln´ Snahou je zpˇrehlednit, resp. vhodneˇ ´ ´ an´ ´ ım a strukturovat system. Zab´yvaj´ı se uspoˇrad propojen´ım objektu. ˚ ´ en ˇ e´ v ´ ı: Zapouzdˇruj´ı urˇcite´ procesy provad Vzory chovan´ ´ ´ nekolika ˇ systemu. Napˇr. jak zajistit spolupraci tˇr´ıd pˇri ˇreˇsen´ı problemu. ´
3
´ Co jsou to navrhov e´ vzory
Vzory spolu souvis´ı
Pˇrevzato z: http://www.stickyminds.com/
Strana 5 / 28
´ Co jsou to navrhov e´ vzory
Strana 6 / 28
Pˇr´ıklad finty: Pˇrepravka ´ Prvn´ım jednoduch´ym nastrojem je pˇrepravka. ´ an ´ metodam ´ a ty do Jedna´ se o konteiner, kter´y je pˇredav ˇ umist’uj´ı data. nej ´ ´ V´yhodou je, zˇ e metody si nemus´ı pˇredavat data navzajem velke´ mnoˇzstv´ı parametru, ˚ ale jen jednu pˇrepravku“. ” ˇ ˇ eˇ rozhran´ı Zmenou obsahu pˇrepravky nedojde ke zmen ˇ am). ´ metody (ˇreˇsen´ı odolne´ vuˇ ˚ ci zmen
´ Co jsou to navrhov e´ vzory
Pˇrepravka: implementace 1 2 3 4
struct Pozice { int x ; int y ; };
5 6 7 8 9
struct Rozmer { int sirka ; int vyska ; };
Strana 7 / 28
´ Co jsou to navrhov e´ vzory
Strana 8 / 28
´ r implementace Komentaˇ ´ z co class, jen je v´ychoz´ı viditelnost struct je toteˇ public.1 ´ ale je nutne, ´ aby je nekdo ˇ Atributy mohou b´yt veˇrejne, hl´ıdal! Nen´ı dobre´ recyklovat“ pˇrepravky (pouˇziji Pozici m´ısto ” ˇ Rozmeru), Pˇrepravka muˇ ˚ ze b´yt pro pˇrenos mezi metodami nebo ´ ı skupiny hodnot pohromade. ˇ intern´ı pro uchovan´
1
Pouˇz´ıva´ se kdyˇz jedna´ o podobnou tˇr´ıdu, ktera´ z principu pouˇzit´ı nekontroluje svoje hodnoty
´ Tovarny
ˇ Obsah pˇredna´ sky 1
´ Co jsou to navrhov e´ vzory
2
´ Tovarny
3
´ ri Samotaˇ
4
Stavitele´
5
Shrnut´ı
Strana 9 / 28
´ Tovarny
Strana 10 / 28
´ ı metoda Tovarn´ ´ ı konstruktoru. Nahrazuje volan´ ´ Problem: Chci vracet ruzn ˚ e´ objekty nebo pˇred samotn´ym ˇ nejakou ˇ vytvoˇren´ım objektu potˇrebuji udelat cˇ innost.2 ˇ sen´ ´ ren´ı objektu˚ do specialn´ ´ ı ˇ ı: Zapouzdˇr´ım vytvaˇ Re ´ ı metody“. Pokud budu potˇrebovat instanci dane´ tovarn´ ” ´ metodu a ta mi instanci vrat´ ´ ı. tˇr´ıdy, pouze zavolam ´ instanci toho, co si Co jsem z´ıskal: Tˇr´ıda vubec znat ˚ necha´ vytvoˇrit. Tj. nen´ı nutne´ incudovat hlaviˇckove´ soubory ´ ren´ych tˇr´ıd. Mam ´ proces vytvaˇ ´ ren´ı pod kontrolou na vytvaˇ ´ m´ıste. ˇ jedinem
2
Existuje ˇrada dalˇs´ıch duvod u. ˚ ˚
´ Tovarny
Strana 11 / 28
´ ı metoda Tovarn´ Obt´ızˇ nost hry ˇ aby si uˇzivatel mohl na poˇcatku ´ Zajistete, hry zvolit obt´ızˇ nost. ´ ´ obt´ızˇ nosti jsou generovany ´ ve hˇre ruzn Na zaklad eˇ teto ˚ eˇ silne´ instance tˇr´ıdy Mutant.
´ Tovarny
Strana 12 / 28
´ ı metoda: komplexn´ı varianta Tovarn´ Visual Paradigm for UML Standard Edition(Faculty of Business and Economics, Mendel University of Agriculture and Forestry in Brno)
Mutant +getUtok() : int +getMutant(level : int) : Mutant * #Mutant() +~Mutant()
SilnyMutant #m_sila : int #m_jedovatost : int +SilnyMutant(sila : int, jedovatost : int) +getUtok() : int
SlabyMutant #m_sila : int +SlabyMutant(sila : int) +getUtok() : int
´ Tovarny
Strana 13 / 28
´ Abstraktn´ı tovarna Obt´ızˇ nost hry ˇ aby si uˇzivatel mohl na poˇcatku ´ Zajistete, hry zvolit obt´ızˇ nost. ´ ´ obt´ızˇ nosti jsou generovany ´ ve hˇre ruzn Na zaklad eˇ teto ˚ eˇ silne´ instance tˇr´ıd Mutant, Skeleton atp.
´ Tovarny
Strana 14 / 28
´ Abstraktn´ı tovarna: pˇr´ıklad Visual Paradigm for UML Standard Edition(Faculty of Business and Economics, Mendel University of Agriculture and Forestry in Brno)
EnemyFactory +getSkeleton() : Skeleton * +getMutant() : Mutant *
EasyEnemyFactory +getSkeleton() : Skeleton * +getMutant() : Mutant *
HardEnemyFactory +getSkeleton() : Skeleton * +getMutant() : Mutant *
<
> <> Mutant +~Mutant() +Mutant() +getAttack() : int StrongMutant #m_sila : int #m_jedovatost : int +StrongMutant(sila : int, jedovatost : int) +getAttack() : int
<>
WeakMutant #m_sila : int +WeakMutant(sila : int) +getAttack() : int
<>
Skeleton +Skeleton() +~Skeleton() +getAttack() : int
SkeletonKing -m_silaDechu : int +SkeletonKing(silaDechu : int) +getAttack() : int
SkeletonSoldier -m_silaKosti : int +SkeletonSoldier(silaKosti : int) +getAttack() : int
´ Tovarny
Strana 15 / 28
´ Abstraktn´ı tovarna: pˇr´ınos ´ ren´ı pˇr´ısˇ er je skryta uvnitˇr tovaren. ´ Logika vytvaˇ Nikdo nemuˇ ˚ ze vytvoˇrit chybnou instanci. Dokonce ani nev´ı s jakou instanc´ı pracuje.
´ ri Samotaˇ
ˇ Obsah pˇredna´ sky 1
´ Co jsou to navrhov e´ vzory
2
´ Tovarny
3
´ ri Samotaˇ
4
Stavitele´
5
Shrnut´ı
Strana 16 / 28
´ ri Samotaˇ
Strana 17 / 28
Monostate ´ ı seznam ´ Problem: Potˇrebuji m´ıt ve sve´ aplikaci unikatn´ urˇcit´ych objektu. ˚ Nesm´ı exitovat v´ıce ruzn´ ˚ ych seznamu. ˚ ´ Potˇrebuji b´yt nav´ıc schopen z kterehokoliv m´ısta aplikace k ˇ nemu pˇristoupit. Vektory: Potˇrebuji vytvoˇrit tˇr´ıdu, ktera´ bude v sobeˇ sluˇcovat ruzn ˚ e´ matematicke´ operace nad vektory. ˇ sen´ ˇ ı: Vytvoˇr´ım tˇr´ıdu zaloˇzenou pouze na statick´ych Re ´ ´ se statick´ym seznamem. metodach, ktere´ umoˇzn´ı praci ´ ´ T´ım jednoduˇse zajist´ım unikatnost v ramci aplikace. Vektory: vytvoˇr´ım tˇr´ıdu, ktera´ v sobeˇ bude m´ıt staticke´ metody, ktere´ vˇzdy provedou pˇr´ısluˇsnou operaci na pˇredan´ym vektorem (pˇredan´ymi vektory). ˇ virtualn´ ´ ı, ´ Problem: Staticke´ metody nemohou b´yt (ˇciste) proto nepujde odvozovat potomky tohoto seznamu. ˚
´ ri Samotaˇ
Strana 18 / 28
Monostate: pˇr´ıklad ´ Seznam zakazn´ ıku˚ ´ unikatn´ ´ ı seznam zakazn´ ´ Zaˇrid’te, aby v aplikaci byl evidovan ıku. ˚ ´ Tˇr´ıda spravuj´ıc´ı tento seznam bude poskytovat nastroje pro ´ ı potˇrebneho ´ ´ ˇ vyhledan´ zakazn´ ıka, pˇr´ıpadneˇ jeho zaloˇzen´ı. (Meli ˇ ı vˇsech objektu.) bychom na konci programu zajistit i uvolnen´ ˚
´ ri Samotaˇ
Strana 19 / 28
Monostate: pˇr´ıklad Visual Paradigm for UML Standard Edition(Faculty of Business and Economics, Mendel University of Agriculture and Forestry in Brno)
Zakaznik -m_jmeno : string -m_id : int +Zakaznik(jmeno : string, id : int) +getJmeno() : string +getId() : int <> createZakaznik -s_zakaznici
SpravceZakazniku -s_pocetZakazniku : int = 0 -s_zakaznici : vector = {} +getZakaznikByJmeno(jmenoZakaznika : string) : vector +getZakaznikById(id : int) : Zakaznik * +createZakaznik(jmenoZakaznika : string) : Zakaznik *
´ ri Samotaˇ
Strana 20 / 28
Singleton ´ Problem: Potˇrebuji m´ıt ve sve´ aplikaci objekt, kter´y ma´ ˇ urˇcit´y seznam jedinou instanci. (Muˇ ˚ ze obsahovat opet ´ (tiskova´ fronta) nebo cokoliv jineho (vstup/v´ystup dat) atp.) ˇ ´ ren´ı objektu. ˇ ı: Zamez´ım ruˇcn´ımu vytvaˇ Resen´ ˚ Pˇriprav´ıme si statickou metodu, ktera´ bud’ vytvoˇr´ı novou instanci nebo ´ ı existuj´ıc´ı. vrat´ Alternativy: Pokud vytvoˇren´ı objektu stoj´ı mnoho prostˇredku˚ a budeme jej urˇciteˇ potˇrebovat, lze jej vytvoˇrit dopˇredu (eager init.). Pokud naopak moˇzna´ potˇreba nebude, muˇ ˚ zeme jej vytvoˇrit aˇz tehdy, kdyˇz je potˇreba (lazy init.) ´ Problemy: Jak jej smazat? Synchronizace pˇri ´ ´ programovan´ ´ ı. multivlaknov em
´ ri Samotaˇ
Strana 21 / 28
Singleton: pˇr´ıklad Seznam chyb Vytvoˇrte logovac´ı tˇr´ıdu, ktera´ bude evidovat, kde v programu ´ nastal problem. Pˇri vytvoˇren´ı objektu se naˇcte seznam ´ u˚ ze souboru. Pˇri ukonˇcen´ı se vˇse necha´ pˇredchoz´ıch problem zapsat.
´ ri Samotaˇ
Strana 22 / 28
Singleton: pˇr´ıklad
Visual Paradigm for UML Standard Edition(Faculty of Business and Economics, Mendel University of Agriculture and Fore
Logger -s_instance : Logger* -m_errors : vector<string> +getLogger() : Logger * +addError(error : string) : void +storeErrors() : void -Logger() -loadErrors() : void
-s_instance
Stavitele´
ˇ Obsah pˇredna´ sky 1
´ Co jsou to navrhov e´ vzory
2
´ Tovarny
3
´ ri Samotaˇ
4
Stavitele´
5
Shrnut´ı
Strana 23 / 28
Stavitele´
Strana 24 / 28
Builder ´ Problem: Potˇrebujeme vytvoˇrit sloˇzit´y objekt (dokument, ´ ı. Podle situace, muˇ ryt´ırˇe), kter´y ma´ spoustu souˇcast´ ˚ ze ´ ren´y objekt vypadat velmi odliˇsne. ˇ vytvaˇ ˇ ˇ ame ´ ˇ ˇ ı: Udel Resen´ nekolik samostatn´ych tˇr´ıd, ktere´ se ´ reneho ´ budou specializovat na tvorbu ruzn´ ˚ ych variant vytvaˇ objektu. (produktu). Kaˇzda´ tˇr´ıda bude implementovat ˇ ıd´ıc´ı tˇr´ıda vˇsechny kroky nezbytne´ k jeho vytvoˇren´ı. R´ ´ dostane ˇreˇceno, ktereho tvurce“ pouˇ z ije a zavola´ metody ˚ ” ˇ pro vytvoˇren´ı produktu. Nen´ı tak nutne´ volat je ruˇcne. ´ ´ ı Pozor: Nejedna´ se o alternativu tovarny. Tady se nevyrab´ ´ jen jeden a ten sam´y ruzn´ ˚ ı potomci produktu, ale stale ˇ produkt. Jen muˇ ˚ ze vypadat ruzn ˚ e.
Stavitele´
Strana 25 / 28
Builder: pˇr´ıklad ´ Generator dokumentu˚ ´ kter´y umoˇzn´ı generovat dokumenty ruzn´ Vytvoˇrte kod, ˚ ych typu˚ (Latex, XML atp.). Vˇsechny dokumenty budou obsahovat ´ ´ zejmena text. Budou se liˇsit pouze strukturou uloˇzeneho textu. ˇ aby se dalo generovan´ ´ ı v budoucnu rozˇs´ıˇrit o dalˇs´ı Zajistete, ´ formaty.
Stavitele´
Strana 26 / 28
Builder: pˇr´ıklad Visual Paradigm for UML Standard Edition(Faculty of Business and Economics, Mendel University of Agriculture and Forestry in Brno)
XmlDocumentBuilder +XmlDocumentBuilder() +buildHeader() : void +buildFooter() : void +buildPage(content : string) : void +getSiteMap() : string
DocumentBuilder #m_document : Document* +DocumentBuilder() +createNewDocument() : void +buildHeader() : void +buildFooter() : void +buildPage(content : string) : void +getDocument() : Document *
LatexDocumentBuilder -m_encoding : string +LatexDocumentBuilder(encoding : string) +buildHeader() : void +buildFooter() : void +buildPage(content : string) : void -buildEncoding() : void
-m_builder
DocumentDirector -m_builder : DocumentBuilder* +DocumentDirector(builder : DocumentBuilder *) +setDocumentBuilder(builder : DocumentBuilder *) : void +constructDocument(text : string) : Document *
<> createNewDocument
#m_document
Document -m_content : string +Document() +addContent(newContent : string) : void +getContent() : string
Shrnut´ı
ˇ Obsah pˇredna´ sky 1
´ Co jsou to navrhov e´ vzory
2
´ Tovarny
3
´ ri Samotaˇ
4
Stavitele´
5
Shrnut´ı
Strana 27 / 28
Shrnut´ı
Strana 28 / 28
Shrnut´ı ˇ ´ ren´ı tˇr´ıd (aˇz na Proˇsli jsme si nekolik vzoru˚ t´ykaj´ıc´ıch se vytvaˇ Monostate). ´ ı tˇr´ıda (factory method), tovarna ´ Tovarn´ (factory), abstraktn´ı ´ ´ ret ruzn tovarna (abstract factory) – jak vytvaˇ ˚ e´ typy objektu, ˚ ´ ren´ı zapouzdˇrit na jedine´ m´ısto v aplikaci. jak toto vytvaˇ ´ cek (singleton), jednostavov´y objekt (monostate) – Jedinaˇ potˇrebujeme zajistit, aby dane´ od dane´ tˇr´ıdy existovala pouze jedna instance. Tvurce (builder ) – komplexn´ı objekt muˇ ˚ ˚ ze m´ıt mnoho ´ je to ten sam´y objekt), vyvaˇ ´ r´ıme ruzn´ ˚ ych podob (ale stale ho ruzn´ ˚ ymi zpusoby. ˚