použití návrhových vzorů v prostředí jazyka c# .net

37
Použití návrhových vzorů v prostředí jazyka C# .NET Bc. Michal Jakubec MCSE, MCSD, MCDBA, MCTS http://www.jakubec.cz/ 1

Upload: kaveri

Post on 22-Feb-2016

29 views

Category:

Documents


0 download

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 Presentation

TRANSCRIPT

Page 1: Použití návrhových vzorů v prostředí jazyka C# .NET

Použití návrhových vzorů v prostředí jazyka C# .NETBc. Michal JakubecMCSE, MCSD, MCDBA, MCTShttp://www.jakubec.cz/

1

Page 2: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 3: Použití návrhových vzorů v prostředí jazyka C# .NET

Návrhové vzory GoF1. část

3

Page 4: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 5: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 6: Použití návrhových vzorů v prostředí jazyka C# .NET

GoF: Gang of FourRalph Johnson, Erich Gamma,Richard Helm, John Vlissides

6

Page 7: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 8: Použití návrhových vzorů v prostředí jazyka C# .NET

Vzájemné vztahy vzorů GoF

8

Page 9: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 10: Použití návrhových vzorů v prostředí jazyka C# .NET

Vzory GoF v praktické ukázce Composite (Skladba) Builder (Stavitel) Interpreter (Interpret) Command (Příkaz)

…možná naleznete nějaké další :-)

10

Page 11: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 12: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 13: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 14: Použití návrhových vzorů v prostředí jazyka C# .NET

Zachycení hodnot proměnných Kolekce typu klíč-hodnota

14

Název proměnné (klíč kolekce) Hodnota proměnnéa 26

b 38

… …

Page 15: Použití návrhových vzorů v prostředí jazyka C# .NET

(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á

Page 16: Použití návrhových vzorů v prostředí jazyka C# .NET

Zachycení výrazu – Composite

16

«interface»IExpression

Symbol : string

BinaryExpression

Name : string

VariableExpression

Value : double

ConstantExpression

Left

Right

Page 17: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 18: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 19: Použití návrhových vzorů v prostředí jazyka C# .NET

Praktická ukázka (2/5) Implementace tvorby stromu výrazu

rozhraní IExpressionBuilder třída ExpressionParser třída InfixExpressionBuilder

19

Page 20: Použití návrhových vzorů v prostředí jazyka C# .NET

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);

Page 21: Použití návrhových vzorů v prostředí jazyka C# .NET

Praktická ukázka (3/5) Implementace výpočtu výrazu

rozhraní IContextmetoda IExpression.Evaluate(IContext) třída DictionaryContext

21

Page 22: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 23: Použití návrhových vzorů v prostředí jazyka C# .NET

Praktická ukázka (4/5) Implementace tvorby kontextu

rozhraní IContextBuilder třída ContextParser třída DictionaryContextBuilder

23

Page 24: Použití návrhových vzorů v prostředí jazyka C# .NET

Napojení na UI - Command

24

Execute()

«interface»ICommand

ButtonCalculate_Click()ToolbarCalculate_Click()

MainFormcommand

command.Execute();

CalculationCommand( entryExpression : Control, entryVariables : Control, entryResult : Control)Execute()

CalculationCommand

Page 25: Použití návrhových vzorů v prostředí jazyka C# .NET

Praktická ukázka (5/5) Implementace napojení na UI

rozhraní ICommand třída CalculationCommanddeklarace atributu typu ICommandvytvoření instance CalculationCommand

25

Page 26: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 27: Použití návrhových vzorů v prostředí jazyka C# .NET

Rok 2005: 10. výročí vzorů GoF

27

Zdroj: http://laputan.org/

Page 28: Použití návrhových vzorů v prostředí jazyka C# .NET

PřestávkaObčerstvení, názory, připomínky, otázky, odpovědi…

28

Page 29: Použití návrhových vzorů v prostředí jazyka C# .NET

Návrhové vzory EAA2. část

29

Page 30: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 31: Použití návrhových vzorů v prostředí jazyka C# .NET

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/

Page 32: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 33: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 34: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 35: Použití návrhových vzorů v prostředí jazyka C# .NET

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

Page 37: Použití návrhových vzorů v prostředí jazyka C# .NET

Závěr Diskuse: názory, připomínky, otázky, odpovědi

37