Bc Michal Jakubec MCSE MCSD MCDBA MCTS httpwwwjakubeccz 1 Agenda 1700 až 1710 Představení WUGu 1710 až 1830 Návrhové vzory GoF 1830 až 1845 Přestávka a občerstvení ID: 810103
Download The PPT/PDF document "Použití návrhových vzorů v prostře..." is the property of its rightful owner. Permission is granted to download and print the materials on this web site for personal, non-commercial use only, and to display it on your personal computer provided you do not modify the materials and that you retain all copyright notices contained in the materials. By downloading content from our website, you accept the terms of this agreement.
Slide1
Použití návrhových vzorů v prostředí jazyka C# .NET
Bc. Michal JakubecMCSE, MCSD, MCDBA, MCTShttp://www.jakubec.cz/
1
Slide2Agenda
17:00 až 17:10 – Představení WUGu17: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
2
Slide3N
ávrhové vzory
GoF
1. část
3
Slide4Co 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
4
Slide5K č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é schopnostiUsnadň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)5
Slide6Jak začít s návrhovými vzory?
Pořiďte si knihu GoF a mějte ji po ruceSeznamte se s UML
Připravte si tužku
a
papírpozději postačí propiska
Diskutujte o vzorech a svých návrzích s kolegy
Mějte
odhodlání
a pevnou vůliabstrakci se člověk učí celý život6
Slide7Klasifikace vzorů GoF
7
Úč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
Slide8Vzájemné vztahy vzorů GoF
8
Slide9Zadá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
9
Slide10Vzory GoF
v praktické ukázceComposite (Skladba)Builder
(Stavitel)
Interpreter
(Interpret)Command (Příkaz)
…možná naleznete nějaké další
10
Slide11Podoba uživatelského rozhraní
11
Kalkulátor
algebraických výrazů
a - (b + c)
Výraz:
a = 12,
b = 3, c = 5
Proměnné:
4
Výsledek:
Zavřít
Vy
počítat
X
Smazat
http://
www.infoq.com/presentations/Modeling-the-User-Interface
Slide12Gramatika 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.
12
Slide13Příklady vyhovující gramatice
36a + b12 + c5 + a * 9 + b – c5 +
(a
*
9) + b – c
(
abc
+
xyz) / opq(24 + (b * 3)) / (a – 2)13
Slide14Zachycení hodnot proměnných
Kolekce typu klíč-hodnota
14
Název
proměnné (klíč kolekce)
Hodnota proměnné
a
26
b
38
…
…
Slide15Zachycení výrazu v paměti
(24 + (b * 3))
/
(a – 2
)
15
/
+
-
24
*
b
3
2
a
Kořen
Binární
strom
Konstanta
Binární výraz
Proměnná
Slide16Vzor Composite
(Skladba)skládáním jednoduchých objektů získáme funkční celek
16
Slide17Zachycení výrazu
– Composite17
Slide18Praktická ukázka (1/5)
Implementace zachycení výrazurozhraní 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í18
Slide19Vzor Builder
(Stavitel)Odděluje konstrukci složeného objektu od jeho reprezentace
19
Slide20Tvorba stromu výrazu –
Builder20
+ 1 2
1 + 2
1 2 +
Slide21Praktická ukázka (2/5)
Implementace tvorby stromu výrazurozhraní IExpressionBuilder
třída
ExpressionParser
třída InfixExpressionBuilder
21
Slide22Vzor Interpreter
(Interpret)Definuje reprezentaci gramatiky a způsob jejího vyhodnocení (interpretace)
22
Slide23Výpočet výrazu –
Interpreter23
Slide24Praktická ukázka (3/5)
Implementace výpočtu výrazurozhraní IContext
metoda
IExpression.Evaluate
(IContext)
třída
DictionaryContext
24
Slide25Tvorba kontextu – Builder
25
Slide26Praktická ukázka (4/5)
Implementace tvorby kontexturozhraní IContextBuilder
třída
ContextParser
třída DictionaryContextBuilder
26
Slide27Vzor Command
(Příkaz)Zapouzdří operaci tak, aby bylo možné ji předávat a užívat různými subjekty
27
Slide28Napojení na UI - Command
28
Slide29Praktická ukázka (5/5)
Implementace napojení na UIrozhraní ICommand
třída
CalculationCommand
deklarace atributu typu ICommand
vytvoření instance
CalculationCommand
29
Slide30Shrnutí
Vzor Composite (Skladba)zachycení struktury algebraického výrazuVzor 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?30
Slide31Trochu historie…
Christopher Alexander:A
Pattern
Language, 1977Kent Beck, Ward
Cunningham:
Using
Pattern Languages for Object-Oriented Programs, OOPSLA, 1987GoF: Design Patterns, OOPSLA, 199431
Slide32GoF: Gang
of Four
Ralph
Johnson, Erich
Gamma,Richard Helm, John
Vlissides
32
Slide33Rok 2005: 10. výročí vzorů GoF
33
Zdroj: http://laputan.org/
Slide34Přestávka
Občerstvení, názory, připomínky, otázky, odpovědi…
34
Slide35Návrhové vzory
v praxi3. část
35
Slide36Typické problémy ze života
Decorator vs. ProxyMediator vs.
Observer
Visitor
vs. Interpreter
Singleton
v různých podobách
36
Slide37Decorator vs. Proxy
Decoratorskládá funkčnost
objektů
zachovává rozhraní
Proxyupravuje
funkčnost
objektu
zachovává
rozhraní37
Slide38Mediator vs.
ObserverMediatorfixní vztahy
(většinou
)
Observer
variabilní
vztahy
(většinou)
38
Otázka: Najdete v těchto diagramech syntaktickou chybu?
Slide39Visitor vs.
InterpreterVisitorvisitor
se při
průchodu mění
Interpreter
kontext se při
průchodu nemění
39
Slide40Singleton v různých podobách
veřejný statický atribut
internal sealed class
Singleton
{
public static readonly Singleton Instance = new Singleton();
private Singleton() { ... }
}
40
Slide41Singleton 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()
{ ... }
}
41
Slide42Singleton 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()
{ ... }
}
42
Slide43Singleton 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()
{ ... }
}
43
Slide44Singleton 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()
{ ... }
}
44
Slide45Singleton 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)
{
if (instance == null)
instance = new Singleton
();
}
}
return instance
;
}
}
private Singleton() { ... }
}
45
Slide46O vzorech EAA
hlavním autorem Martin Fowlerhttp://www.martinfowler.com
zejména architektonické a návrhové vzory
vzory připraveny na základě bohatých zkušeností autora z tvorby business aplikací
46
Slide47Přehled vzorů EAA
Domain Logic Patterns
Transaction
Script
(110), Domain Model (116),
Table Module
(125),
Service Layer
(133).Data Source Architectural PatternsTable 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)47
Zdroj: http://martinfowler.com/eaaCatalog/
Slide48Praktická ukázka (1/2)
Domain Model – třídy reprezentující prvky výrazu a hodnoty proměnnýchRepository – hlavní přístupový bod k mechanismu persistence výrazů a hodnot proměnných
48
Slide49Princip Inversion of Control (IoC)
49
Slide50Dependency Injection
Tři základní metody „kontejnerové“ injekcepomocí 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
50
Slide51Praktická ukázka (2/2)
Dependency Injection – výměna implementace mechanismu persistence Adapter (GoF) – doplňková funkčnost k mechanismu persistence výrazů
51
Slide52Zdroje
http://sourcemaking.com/http://martinfowler.com/eaaCatalog/index.html
http
://
martinfowler.com/articles/injection.html
52
Slide53Závěr:
Diskuse: názory, připomínky, otázky, odpovědi
53