Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Použití návrhových vzorů v prostředí jazyka C# .NET
Bc. Michal Jakubec MCSE, MCSD, MCDBA, MCTS
2
Agenda 17:00 až 17:10 – Představení WUGu
17:10 až 18:30 – Návrhové vzory GoF 18:30 až 18:45 – Přestávka a občerstvení 18:45 až 20:00 – Návrhové vzory v praxi 20:00 – Diskuse: postřehy z praxe
3
1. část Návrhové vzory GoF
4
„Obecně použitelné řešení určitého problému v určitém kontextu“
Co je návrhový vzor? Definice „Obecně použitelné řešení určitého problému v určitém kontextu“ Specifikace Název vzoru Popis problému Popis řešení Důsledky použití vzoru, příp. alternativy
5
K čemu je to dobré? Společný slovník vývojářů a architektů
Nemusíte "objevovat kolo" Velice inspirativní pro další profesní rozvoj Rozvíjí návrhové schopnosti Usnadňují řešení návrhových a vývojových problémů (většinou) Vedou k získání tvárnější implementace funkčnosti (většinou)
6
Jak začít s návrhovými vzory?
Pořiďte si knihu GoF a mějte ji po ruce Seznamte se s UML Připravte si tužku a papír později postačí propiska Diskutujte o vzorech a svých návrzích s kolegy Mějte odhodlání a pevnou vůli abstrakci se člověk učí celý život
7
Klasifikace vzorů GoF Účel Přístup Tvorba instancí (Creational)
Struktura (Structural) Chování (Behavioral) Třída Factory Method Adapter (C) Interpreter Template Method Instance Abstract Factory Builder Prototype Singleton Adapter (I) Bridge Composite Decorator Façade Flyweight Proxy Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy Visitor
8
Vzájemné vztahy vzorů GoF
9
Zadání ukázkové aplikace
Vytvořte aplikaci, která umožní zadání jednoduchého algebraického výrazu s konstantami a proměnnými v textové formě zadání hodnot jednotlivých proměnných ve výrazu vyhodnocení výrazu a zobrazení výsledku
10
Vzory GoF v praktické ukázce
Composite (Skladba) Builder (Stavitel) Interpreter (Interpret) Command (Příkaz) …možná naleznete nějaké další
11
Podoba uživatelského rozhraní
Kalkulátor algebraických výrazů a - (b + c) Výraz: a = 12, b = 3, c = 5 Proměnné: 4 Výsledek: Zavřít Vypočítat X Smazat
12
Gramatika platných výrazů
Zápis v Backusově-Naurově formě (BNF): <expr> ::= <number> | <var> | <expr> <oper> <expr> | "(" <expr> ")" <oper> ::= '+' | '-' | '*' | '/' <number> ::= <digit> | <digit> <number> <digit> ::= "0" | "1" | "2" | … | "9" <var> ::= <letter> | <letter> <var> <letter> ::= "a" | "b" | "c" | ... | "z" Možný výskyt bílých znaků (mezery, tabulátory, apod.) v definici pro přehlednost neuvádím.
13
Příklady vyhovující gramatice
36 a + b 12 + c 5 + a * 9 + b – c 5 + (a * 9) + b – c (abc + xyz) / opq (24 + (b * 3)) / (a – 2)
14
Zachycení hodnot proměnných
Kolekce typu klíč-hodnota Název proměnné (klíč kolekce) Hodnota proměnné a 26 b 38 …
15
Zachycení výrazu v paměti
(24 + (b * 3)) / (a – 2) Binární strom Binární výraz / Kořen + - Konstanta 24 * a 2 Proměnná b 3
16
Vzor Composite (Skladba)
skládáním jednoduchých objektů získáme funkční celek
17
Zachycení výrazu – Composite
18
Praktická ukázka (1/5) Implementace zachycení výrazu
rozhraní IExpression třída ConstantExpression třída VariableExpression třída BinaryExpression Doplnění překrytí metody ToString() umožní zobrazení textové podoby výrazu – užitečné pro ladění
19
Vzor Builder (Stavitel)
Odděluje konstrukci složeného objektu od jeho reprezentace
20
Tvorba stromu výrazu – Builder
+ 1 2 1 + 2 1 2 +
21
Praktická ukázka (2/5) Implementace tvorby stromu výrazu
rozhraní IExpressionBuilder třída ExpressionParser třída InfixExpressionBuilder
22
Vzor Interpreter (Interpret)
Definuje reprezentaci gramatiky a způsob jejího vyhodnocení (interpretace)
23
Výpočet výrazu – Interpreter
24
Praktická ukázka (3/5) Implementace výpočtu výrazu rozhraní IContext
metoda IExpression.Evaluate(IContext) třída DictionaryContext
25
Tvorba kontextu – Builder
26
Praktická ukázka (4/5) Implementace tvorby kontextu
rozhraní IContextBuilder třída ContextParser třída DictionaryContextBuilder
27
Vzor Command (Příkaz) Zapouzdří operaci tak, aby bylo možné ji předávat a užívat různými subjekty
28
Napojení na UI - Command
29
Praktická ukázka (5/5) Implementace napojení na UI rozhraní ICommand
třída CalculationCommand deklarace atributu typu ICommand vytvoření instance CalculationCommand
30
Shrnutí Vzor Composite (Skladba) Vzor Builder (Stavitel)
zachycení struktury algebraického výrazu Vzor Builder (Stavitel) tvorba stromu výrazu z jeho textové podoby tvorba kontextu z jeho textové podoby Vzor Interpreter (Interpret) výpočet hodnoty výrazu dle kontextu Vzor Command (Příkaz) napojení na UI … nějaké další vzory?
31
Trochu historie… Christopher Alexander: A Pattern Language, 1977
Kent Beck, Ward Cunningham: Using Pattern Languages for Object-Oriented Programs, OOPSLA, 1987 GoF: Design Patterns, OOPSLA, 1994
32
GoF: Gang of Four Ralph Johnson, Erich Gamma, Richard Helm, John Vlissides
33
Rok 2005: 10. výročí vzorů GoF Zdroj:
34
Občerstvení, názory, připomínky, otázky, odpovědi…
Přestávka
35
3. část Návrhové vzory v praxi
36
Typické problémy ze života
Decorator vs. Proxy Mediator vs. Observer Visitor vs. Interpreter Singleton v různých podobách
37
Decorator vs. Proxy Decorator Proxy skládá funkčnost objektů
zachovává rozhraní Proxy upravuje funkčnost objektu
38
Mediator vs. Observer Mediator Observer fixní vztahy (většinou)
variabilní vztahy (většinou) Otázka: Najdete v těchto diagramech syntaktickou chybu?
39
Visitor vs. Interpreter
visitor se při průchodu mění Interpreter kontext se při průchodu nemění
40
Singleton v různých podobách
veřejný statický atribut internal sealed class Singleton { public static readonly Singleton Instance = new Singleton(); private Singleton() { ... } }
41
Singleton v různých podobách
veřejná statická vlastnost internal sealed class Singleton { private static readonly Singleton instance = new Singleton(); public static Singleton Instance get return instance; } private Singleton() { ... }
42
Singleton v různých podobách
veřejná statická vlastnost jako proxy internal sealed class Singleton { private static Singleton instance; public static Singleton Instance get if (instance == null) instance = new Singleton(); return instance; } private Singleton() { ... }
43
Singleton v různých podobách
synchronizace vícevláknového přístupu (jde to lépe?) internal sealed class Singleton { private static volatile Singleton instance; public static Singleton Instance get lock(typeof(Singleton)) if (instance == null) instance = new Singleton(); return instance; } private Singleton() { ... }
44
Singleton v různých podobách
synchronizace vícevláknového přístupu (lepší varianta) internal sealed class Singleton { private static object syncRoot = new object(); private static volatile Singleton instance; public static Singleton Instance get lock(syncRoot) if (instance == null) instance = new Singleton(); return instance; } private Singleton() { ... }
45
Singleton v různých podobách
double-checked locking optimization internal sealed class Singleton { private static object syncRoot = new object(); private static volatile Singleton instance; public static Singleton Instance get if (instance == null) lock(syncRoot) instance = new Singleton(); } return instance; private Singleton() { ... }
46
O vzorech EAA hlavním autorem Martin Fowler
zejména architektonické a návrhové vzory vzory připraveny na základě bohatých zkušeností autora z tvorby business aplikací
47
Přehled vzorů EAA Zdroj: http://martinfowler.com/eaaCatalog/
Domain Logic Patterns Transaction Script (110), Domain Model (116), Table Module (125), Service Layer (133). Data Source Architectural Patterns Table Data Gateway (144), Row Data Gateway (152), Active Record (160), Data Mapper (165). Object-Relational Behavioral Patterns: Unit of Work (184), Identity Map (195), Lazy Load (200) Object-Relational Structural Patterns: Identity Field (216), Foreign Key Mapping (236), Association Table Mapping (248), Dependent Mapping (262), Embedded Value (268), Serialized LOB (272), Single Table Inheritance (278), Class Table Inheritance (285), Concrete Table Inheritance (293), Inheritance Mappers (302). Object-Relational Metadata Mapping Patterns: Metadata Mapping (306), Query Object (316), Repository (322). Web Presentation Patterns: Model View Controller (330), Page Controller (333), Front Controller (344), Template View (350), Transform View (361), Two-Step View (365), Application Controller (379). Distribution Patterns: Remote Facade (388), Data Transfer Object (401) Offline Concurrency Patterns: Optimistic Offline Lock (416), Pessimistic Offline Lock (426), Coarse Grained Lock (438), Implicit Lock (449). Session State Patterns: Client Session State (456), Server Session State (458), Database Session State (462). Base Patterns: Gateway (466), Mapper (473), Layer Supertype (475), Separated Interface (476), Registry (480), Value Object (486), Money (488), Special Case (496), Plugin (499), Service Stub (504), Record Set (508) Zdroj:
48
Praktická ukázka (1/2) Domain Model – třídy reprezentující prvky výrazu a hodnoty proměnných Repository – hlavní přístupový bod k mechanismu persistence výrazů a hodnot proměnných
49
Princip Inversion of Control (IoC)
50
Dependency Injection Tři základní metody „kontejnerové“ injekce
pomocí konstruktorů pomocí setterů pomocí „injekčních“ rozhraní Alternativa pomocí EAA vzoru Registry statické rozhraní – „pevné“ metody vrací produkt dynamické rozhraní – produkt získáván z kolekce či pomocí reflexe
51
Praktická ukázka (2/2) Dependency Injection – výměna implementace mechanismu persistence Adapter (GoF) – doplňková funkčnost k mechanismu persistence výrazů
52
Zdroje http://sourcemaking.com/
53
Diskuse: názory, připomínky, otázky, odpovědi
Závěr:
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.