1. prosince 2013, Brno Připravil: David Procházka

Podobné dokumenty
, Brno Připravil: David Procházka Návrhové vzory

24. listopadu 2013, Brno Připravil: David Procházka

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2008 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 24

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2009 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 25

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33

16. února 2015, Brno Připravil: David Procházka. Konstruktory a destruktory

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Návrhové vzory OMO, LS 2014/2015

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

1. Dědičnost a polymorfismus

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Generické programování

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Programování v C++ 1, 6. cvičení

PB161 Programování v jazyce C++ Přednáška 7

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

PB161 Programování v jazyce C++ Přednáška 7

IoC/DI. Tomáš Herceg Microsoft MVP (ASP.NET)

Programování v jazyce C a C++

Připravil: David Procházka. Programovací jazyk C++

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Chování konstruktorů a destruktorů při dědění

Vývoj informačních systémů. Architektura, návrh Vzory: Doménová logika

PŘETĚŽOVÁNÍ OPERÁTORŮ

10. března 2015, Brno Připravil: David Procházka. Programovací jazyk C++

Programování v C++ 1, 5. cvičení

Programování v C++ 2, 4. cvičení

Více o konstruktorech a destruktorech

20. Projekt Domácí mediotéka

návrhový vzor Singleton.

Základy objektové orientace I. Únor 2010

IRAE 07/08 Přednáška č. 1

Programování II. Polymorfismus

Programování II. Návrh programu II

State. Známý jako. Účel. Použitelnost. Stav, Object for States. umožňuje objektu měnit svoje chování v závislosti na stavu objekt mění svou třídu

8 Třídy, objekty, metody, předávání argumentů metod

Výčtový typ strana 67

Objektové programování

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Dalším příkladem může být například výstup dat na různá zařízení, souborů, grafických rozhraní, sítě atd.

Návrhové vzory Design Patterns

Programování v jazyce C a C++

Kód, který se nebude často měnit

Dědění, polymorfismus

Pokud neuvedeme override, vznikne v synu nová (nevirtuální) metoda (a pochopitelně se nezavolá, jak bychom

NMIN201 Objektově orientované programování 1 / :36:09

NPRG031 Programování II 1 / :25:46

Design Patterns. Tomáš Herceg Microsoft MVP (ASP.NET)

Programování v C++ 2, 7. cvičení

umístit žeton mafiána na městskou lokaci, NEBO místo umístění žetonu mafiána může hráč zahrát strategickou kartu Akce

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

Vývoj informačních systémů. Přehled témat a úkolů

PREPROCESOR POKRAČOVÁNÍ

Facade. Známý jako. Účel. Motivace. Facade, Fasáda

Jazyk C++ I. Šablony

Jazyk C# (seminář 3)

Programování v C++ 3, 3. cvičení

Programování II. Úvod do dědičnosti 2018/19

Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo

Quo vadis programování? Automatizace vyhodnocování studentských úloh

Vyřešené teoretické otázky do OOP ( )

IntraDoc. Řešení pro státní správu a samosprávu.

Cvičení č. 3. Sdílené prostředky a synchronizace Program Banka. 4 body

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

Funkční objekty v C++.

Virtuální metody - polymorfizmus

Dědičnost (inheritance)

typová konverze typová inference

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Semin aˇr Java X Radek Koˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2011 Radek Koˇc ı Semin aˇr Java N avrhov e vzory, Z asady...

Infrastruktura UML. Modelování struktury v UML. Superstruktura UML. Notace objektů. Diagramy objektů

Abstract Factory úvod

Programování II. Návrh programu I 2018/19

Abstraktní třída a rozhraní

Cvičení z programování v C++ ZS 2016/2017 Přemysl Čech

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Návrh aplikace. Project Westpon. Inteligentní simulátor budov. Martin Mudra, Jan Smejkal, Onřej Macoszek, Marek Žehra, Jiří Slivárich

Student s Life. Návrhová dokumentace (Design) Lukáš Barák, Jakub Ječmínek, Jaroslav Brchel, Jiří Zmeškal

Jazyk C++ I. Šablony 2

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

Software602 Form Designer

Příloha: Dodatečné informace, včetně přesného znění žádosti dodavatele o dodatečné informace

Jazyk C++ I. Polymorfismus

Rozhraní SAX, SAX vs. SAX2. Jaroslav Ciml

Principy objektově orientovaného programování

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Programujeme v softwaru Statistica

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

PB161 Základy OOP. Tomáš Brukner

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Transkript:

1. prosince 2013, Brno Připravil: David Procházka Návrhové vzory: vyrábíme objekty Základy objektového návrhu

Co jsou to návrhové vzory Strana 2 / 28 Obsah přednášky 1 Co jsou to návrhové vzory 2 Továrny 3 Samotáři 4 Stavitelé 5 Shrnutí

Co jsou to návrhové vzory Strana 3 / 28 Návrhové vzory Design Patterns Návrhové vzory můžeme s nadsázkou označit za fintu, jak řešit určitý problém. Existuje 23 základních vzorů, od kterých se odvozují další. NV byly poprvé popsány v knize Gama, Helm, Johnson, Vlissides: Design Patterns (Gang of Four) Vzorem může být jakékoliv řešení problému.

Co jsou to návrhové vzory Strana 4 / 28 Rozdělení návrhových vzorů 1 Tvořivé vzory: Řeší problémy okolo vytváření objektů jak zajistit správný počet instancí, výběr vhodné třídy nového objektu atp. 2 Strukturální změny: Snahou je zpřehlednit, resp. vhodně strukturovat systém. Zabývají se uspořádáním a propojením objektů. 3 Vzory chování: Zapouzdřují určité procesy prováděné v systému. Např. jak zajistit spolupráci několika tříd při řešení problému.

Co jsou to návrhové vzory Strana 5 / 28 Vzory spolu souvisí Převzato z: http://www.stickyminds.com/

Co jsou to návrhové vzory Strana 6 / 28 Příklad finty: Přepravka Prvním jednoduchým nástrojem je přepravka. Jedná se o konteiner, který je předáván metodám a ty do něj umist ují data. Výhodou je, že metody si nemusí předávat data navzájem velké množství parametrů, ale jen jednu přepravku. Změnou obsahu přepravky nedojde ke změně rozhraní metody (řešení odolné vůči změnám).

Co jsou to návrhové vzory Strana 7 / 28 Přepravka: implementace 1 struct Pozice { 2 int x; 3 int y; 4 }; 5 6 struct Rozmer { 7 int sirka ; 8 int vyska ; 9 };

Co jsou to návrhové vzory Strana 8 / 28 Komentář implementace struct je totéž co class, jen je výchozí viditelnost public. 1 Atributy mohou být veřejné, ale je nutné, aby je někdo hlídal! Není dobré recyklovat přepravky (použiji Pozici místo Rozměru), Přepravka může být pro přenos mezi metodami nebo interní pro uchování skupiny hodnot pohromadě. 1 Používá se když jedná o podobnou třídu, která z principu použití nekontroluje svoje hodnoty

Továrny Strana 9 / 28 Obsah přednášky 1 Co jsou to návrhové vzory 2 Továrny 3 Samotáři 4 Stavitelé 5 Shrnutí

Továrny Strana 10 / 28 Tovární metoda Nahrazuje volání konstruktoru. Problém: Chci vracet různé objekty nebo před samotným vytvořením objektu potřebuji udělat nějakou činnost. 2 Řešení: Zapouzdřím vytváření objektů do speciální tovární metody. Pokud budu potřebovat instanci dané třídy, pouze zavolám metodu a ta mi instanci vrátí. Co jsem získal: Třída vůbec znát instanci toho, co si nechá vytvořit. Tj. není nutné incudovat hlavičkové soubory vytvářených tříd. Mám proces vytváření pod kontrolou na jediném místě. 2 Existuje řada dalších důvodů.

Továrny Strana 11 / 28 Tovární metoda Obtížnost hry Zajistěte, aby si uživatel mohl na počátku hry zvolit obtížnost. Na základě této obtížnosti jsou generovány ve hře různě silné instance třídy Mutant.

Továrny Strana 12 / 28 Tovární metoda: komplexní varianta Visual Paradigm for UML Standard Edition(Faculty of Business and Economics, Mendel University of Agriculture and Fo 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

Továrny Strana 13 / 28 Abstraktní továrna Obtížnost hry Zajistěte, aby si uživatel mohl na počátku hry zvolit obtížnost. Na základě této obtížnosti jsou generovány ve hře různě silné instance tříd Mutant, Skeleton atp.

Továrny Strana 14 / 28 Abstraktní továrna: pří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 * <<instantiate>> EasyEnemyFactory +getskeleton() : Skeleton * +getmutant() : Mutant * HardEnemyFactory +getskeleton() : Skeleton * +getmutant() : Mutant * <<instantiate>> Mutant +~Mutant() +Mutant() +getattack() : int <<instantiate>> <<instantiate>> Skeleton +Skeleton() +~Skeleton() +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 SkeletonKing -m_siladechu : int +SkeletonKing(silaDechu : int) +getattack() : int SkeletonSoldier -m_silakosti : int +SkeletonSoldier(silaKosti : int) +getattack() : int

Továrny Strana 15 / 28 Abstraktní továrna: přínos Logika vytváření příšer je skryta uvnitř továren. Nikdo nemůže vytvořit chybnou instanci. Dokonce ani neví s jakou instancí pracuje.

Samotáři Strana 16 / 28 Obsah přednášky 1 Co jsou to návrhové vzory 2 Továrny 3 Samotáři 4 Stavitelé 5 Shrnutí

Samotáři Strana 17 / 28 Monostate Problém: Potřebuji mít ve své aplikaci unikátní seznam určitých objektů. Nesmí exitovat více různých seznamů. Potřebuji být navíc schopen z kteréhokoliv místa aplikace k němu přistoupit. Vektory: Potřebuji vytvořit třídu, která bude v sobě slučovat různé matematické operace nad vektory. Řešení: Vytvořím třídu založenou pouze na statických metodách, které umožní práci se statickým seznamem. Tím jednoduše zajistím unikátnost v rámci aplikace. Vektory: vytvořím třídu, která v sobě bude mít statické metody, které vždy provedou příslušnou operaci na předaným vektorem (předanými vektory). Problém: Statické metody nemohou být (čistě) virtuální, proto nepůjde odvozovat potomky tohoto seznamu.

Samotáři Strana 18 / 28 Monostate: příklad Seznam zákazníků Zařid te, aby v aplikaci byl evidován unikátní seznam zákazníků. Třída spravující tento seznam bude poskytovat nástroje pro vyhledání potřebného zákazníka, případně jeho založení. (Měli bychom na konci programu zajistit i uvolnění všech objektů.)

Samotáři Strana 19 / 28 Monostate: příklad Visual Paradigm for UML Standard Edition(Faculty of Business and Economics, Mendel University of Agriculture and Forestry Zakaznik -m_jmeno : string -m_id : int +Zakaznik(jmeno : string, id : int) +getjmeno() : string +getid() : int <<instantiate>> createzakaznik -s_zakaznici SpravceZakazniku -s_pocetzakazniku : int = 0 -s_zakaznici : vector<zakaznik*> = {} +getzakaznikbyjmeno(jmenozakaznika : string) : vector<zakaznik*> +getzakaznikbyid(id : int) : Zakaznik * +createzakaznik(jmenozakaznika : string) : Zakaznik *

Samotáři Strana 20 / 28 Singleton Problém: Potřebuji mít ve své aplikaci objekt, který má jedinou instanci. (Může obsahovat opět určitý seznam (tisková fronta) nebo cokoliv jiného (vstup/výstup dat) atp.) Řešení: Zamezím ručnímu vytváření objektů. Připravíme si statickou metodu, která bud vytvoří novou instanci nebo vrátí existující. Alternativy: Pokud vytvoření objektu stojí mnoho prostředků a budeme jej určitě potřebovat, lze jej vytvořit dopředu (eager init.). Pokud naopak možná potřeba nebude, můžeme jej vytvořit až tehdy, když je potřeba (lazy init.) Problémy: Jak jej smazat? Synchronizace při multivláknovém programování.

Samotáři Strana 21 / 28 Singleton: příklad Seznam chyb Vytvořte logovací třídu, která bude evidovat, kde v programu nastal problém. Při vytvoření objektu se načte seznam předchozích problémů ze souboru. Při ukončení se vše nechá zapsat.

Samotáři Strana 22 / 28 Singleton: příklad Visual Paradigm for UML Standard Edition(Faculty of Business and Economics, Mendel Logger -s_instance : Logger* -m_errors : vector<string> +getlogger() : Logger * +adderror(error : string) : void +storeerrors() : void -Logger() -loaderrors() : void -s_instance

Stavitelé Strana 23 / 28 Obsah přednášky 1 Co jsou to návrhové vzory 2 Továrny 3 Samotáři 4 Stavitelé 5 Shrnutí

Stavitelé Strana 24 / 28 Builder Problém: Potřebujeme vytvořit složitý objekt (dokument, rytíře), který má spoustu součástí. Podle situace, může vytvářený objekt vypadat velmi odlišně. Řešení: Uděláme několik samostatných tříd, které se budou specializovat na tvorbu různých variant vytvářeného objektu. (produktu). Každá třída bude implementovat všechny kroky nezbytné k jeho vytvoření. Řídící třída dostane řečeno, kterého tvůrce použije a zavolá metody pro vytvoření produktu. Není tak nutné volat je ručně. Pozor: Nejedná se o alternativu továrny. Tady se nevyrábí různí potomci produktu, ale stále jen jeden a ten samý produkt. Jen může vypadat různě.

Stavitelé Strana 25 / 28 Builder: příklad Generátor dokumentů Vytvořte kód, který umožní generovat dokumenty různých typů (Latex, XML atp.). Všechny dokumenty budou obsahovat zejména text. Budou se lišit pouze strukturou uloženého textu. Zajistěte, aby se dalo generování v budoucnu rozšířit o další formáty.

Stavitelé Strana 26 / 28 Builder: pří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 LatexDocumentBuilder -m_encoding : string +LatexDocumentBuilder(encoding : string) +buildheader() : void +buildfooter() : void +buildpage(content : string) : void -buildencoding() : void DocumentBuilder #m_document : Document* +DocumentBuilder() +createnewdocument() : void +buildheader() : void +buildfooter() : void +buildpage(content : string) : void +getdocument() : Document * -m_builder DocumentDirector -m_builder : DocumentBuilder* +DocumentDirector(builder : DocumentBuilder *) +setdocumentbuilder(builder : DocumentBuilder *) : void +constructdocument(text : string) : Document * <<instantiate>> createnewdocument #m_document Document -m_content : string +Document() +addcontent(newcontent : string) : void +getcontent() : string

Shrnutí Strana 27 / 28 Obsah přednášky 1 Co jsou to návrhové vzory 2 Továrny 3 Samotáři 4 Stavitelé 5 Shrnutí

Shrnutí Strana 28 / 28 Shrnutí Prošli jsme si několik vzorů týkajících se vytváření tříd (až na Monostate). Tovární třída (factory method), továrna (factory), abstraktní továrna (abstract factory) jak vytvářet různé typy objektů, jak toto vytváření zapouzdřit na jediné místo v aplikaci. Jedináček (singleton), jednostavový objekt (monostate) potřebujeme zajistit, aby dané od dané třídy existovala pouze jedna instance. Tvůrce (builder) komplexní objekt může mít mnoho různých podob (ale stále je to ten samý objekt), vyváříme ho různými způsoby.