použití návrhových vzorů v prostředí jazyka c# .net
DESCRIPTION
Použití návrhových vzorů v prostředí jazyka C# .NET. Bc. Michal Jakubec MCSE, MCSD, MCDBA, MCTS http://www.jakubec.cz/. 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 EAA - PowerPoint PPT PresentationTRANSCRIPT
Použití návrhových vzorů v prostředí jazyka C# .NETBc. Michal JakubecMCSE, MCSD, MCDBA, MCTShttp://www.jakubec.cz/
1
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 EAA 20:00 – Diskuse: postřehy z praxe
2
Návrhové vzory GoF1. část
3
Co je návrhový vzor? Definice
„Obecně použitelné řešeníurčitého problému v určitém kontextu“
SpecifikaceNázev vzoruPopis problémuPopis řešeníDůsledky použití vzoru, příp. alternativy
4
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
5
GoF: Gang of FourRalph Johnson, Erich Gamma,Richard Helm, John Vlissides
6
Klasifikace vzorů GoF
7
Účel Přístup
Tvorba instancí(Creational)
Struktura(Structural)
Chování(Behavioral)
Třída Factory Method Adapter (C) InterpreterTemplate Method
Instance Abstract Factory BuilderPrototypeSingleton
Adapter (I)BridgeCompositeDecoratorFaçadeFlyweightProxy
Chain of ResponsibilityCommandIteratorMediatorMementoObserverStateStrategyVisitor
Vzájemné vztahy vzorů GoF
8
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
9
Vzory GoF v praktické ukázce Composite (Skladba) Builder (Stavitel) Interpreter (Interpret) Command (Příkaz)
…možná naleznete nějaké další :-)
10
Podoba uživatelského rozhraní
11
Kalkulátor algebraických výrazů
a - (b + c)Výraz:
a = 12, b = 3, c = 5Proměnné:
4Výsledek:
ZavřítVypočítat
X
Smazat
http://www.infoq.com/presentations/Modeling-the-User-Interface
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.
12
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)
13
Zachycení hodnot proměnných Kolekce typu klíč-hodnota
14
Název proměnné (klíč kolekce) Hodnota proměnnéa 26
b 38
… …
(24 + (b * 3)) / (a – 2)
Zachycení výrazu v paměti
15
/
+ -
24 *
b 3
2a
KořenBinární strom
Konstanta
Binární výraz
Proměnná
Zachycení výrazu – Composite
16
«interface»IExpression
Symbol : string
BinaryExpression
Name : string
VariableExpression
Value : double
ConstantExpression
Left
Right
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í
17
18
Tvorba stromu výrazu – Builder
+ 1 2 1 + 2 1 2 +
BuildConstant(value : double)BuildVariable(name : string)BuildOperation(symbol : string)BuildLeftBracket()BuildRightBracket()GetProduct() : IExpression
«interface»IExpressionBuilder
ExpressionParser(builder : IExpressionBuilder)Parse(text : string) : IExpression
ExpressionParserbuilder
InfixExpressionBuilder PostfixExpressionBuilderPrefixExpressionBuilder
Praktická ukázka (2/5) Implementace tvorby stromu výrazu
rozhraní IExpressionBuilder třída ExpressionParser třída InfixExpressionBuilder
19
20
Výpočet výrazu – Interpreter
GetValue(string name) : double
«interface»IContext
Evaluate(context : IContext) : double
«interface»IExpression
Context(Dictionary<string, double>)GetValue(string name) : double
items : Dictionary<string, double>
DictionaryContext// pro ConstantExpression return value;
// pro VariableExpression return context.GetValue(name);
// pro BinaryExpression sčítání return left.Evaluate(context) + right.Evaluate(context);
Praktická ukázka (3/5) Implementace výpočtu výrazu
rozhraní IContextmetoda IExpression.Evaluate(IContext) třída DictionaryContext
21
22
Tvorba kontextu – Builder
BuildName(name : string)BuildValue(value : double)BuildAssignment()BuildDelimiter()GetProduct() : IContext
«interface»IContextBuilder
ContextParser(builder : IContextBuilder)Parse(text : string) : IContext
ContextParserbuilder
DictionaryContextBuilder LinkedListContextBuilderArrayContextBuilder
Praktická ukázka (4/5) Implementace tvorby kontextu
rozhraní IContextBuilder třída ContextParser třída DictionaryContextBuilder
23
Napojení na UI - Command
24
Execute()
«interface»ICommand
ButtonCalculate_Click()ToolbarCalculate_Click()
MainFormcommand
command.Execute();
CalculationCommand( entryExpression : Control, entryVariables : Control, entryResult : Control)Execute()
CalculationCommand
Praktická ukázka (5/5) Implementace napojení na UI
rozhraní ICommand třída CalculationCommanddeklarace atributu typu ICommandvytvoření instance CalculationCommand
25
Shrnutí Implementace vzoru Composite (Skladba)
zachycení struktury algebraického výrazu Implementace vzoru Builder (Stavitel)
tvorba stromu výrazu z jeho textové podoby tvorba kontextu z jeho textové podoby
Implementace vzoru Interpreter (Interpret) výpočet hodnoty výrazu dle kontextu
Implementace vzoru Command (Příkaz) napojení na UI
… nějaké další vzory?
26
Rok 2005: 10. výročí vzorů GoF
27
Zdroj: http://laputan.org/
PřestávkaObčerstvení, názory, připomínky, otázky, odpovědi…
28
Návrhové vzory EAA2. část
29
O vzorech EAA hlavním autorem Martin Fowler
http://www.martinfowler.com převážně architektonické a návrhové
vzory „na míru“ podnikovým aplikacím a jejim potřebám
30
Přehled vzorů EAA 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)
31
Zdroj: http://martinfowler.com/eaaCatalog/
Rozšíření ukázkové aplikace Máme aplikaci, která umožňuje
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
Rozšiřme aplikaci tak, aby umožňovala uložení zadaného algebraického výrazu a hodnot
proměnných pro další spuštění aplikace snadnou změnu konkrétní implementace funkčnosti
aplikace z jednoho místa v kódu
32
Vzory EAA v praktické ukázce Repository – hlavní přístupový bod k
mechanismu persistence výrazů a hodnot proměnných
Dependency Injection – výměna implementace mechanismu persistence
Domain Model – třídy reprezentující prvky výrazu a hodnoty proměnných
Adapter (GoF) – doplňková funkčnost k mechanismu persistence výrazů
33
Dependency Injection Tři základní metody „kontejnerové“ injekce
pomocí konstruktorůpomocí setterůpomocí „injekčních“ rozhraní
Alternativa pomocí EAA vzoru Registrystatické rozhraní – „pevné“ metody vrací
produktdynamické rozhraní – produkt získáván z
kolekce či pomocí reflexe34
Praktická ukázka (1/1) Uložení zadaného algebraického výrazu a
hodnot proměnných pro další spuštění aplikace třída Repositoryrozhraní IRepositoryProvider třída SimpleRepositoryProvider
Změna konkrétní implementace funkčnosti z jednoho místa v kódu třída ServiceLocator
35
Zdroje http://sourcemaking.com/ http://martinfowler.com/articles/injection.html
36
Závěr Diskuse: názory, připomínky, otázky, odpovědi
37