370 likes | 487 Views
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
E N D
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 20:00 – Diskuse: postřehy z praxe
1. část Návrhové vzory GoF
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
Trochu historie… Christopher Alexander:A PatternLanguage, 1977 Kent Beck, WardCunningham: Using Pattern Languages for Object-Oriented Programs, OOPSLA, 1987 GoF: Design Patterns, OOPSLA, 1994
GoF: Gang ofFour Ralph Johnson, Erich Gamma,Richard Helm, John Vlissides
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
Vzory GoF v praktické ukázce Composite (Skladba) Builder (Stavitel) Interpreter (Interpret) Command (Příkaz) …možná naleznete nějaké další :-)
Podoba uživatelského rozhraní Kalkulátor algebraických výrazů X Výraz: a - (b + c) Proměnné: Výsledek: a = 12, b = 3, c = 5 4 Vypočítat Smazat Zavřít 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.
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)
Zachycení hodnot proměnných Kolekce typu klíč-hodnota
Zachycení výrazu v paměti Binární strom Binární výraz / Kořen + - Konstanta 24 * a 2 Proměnná b 3 (24 + (b * 3)) / (a – 2)
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í
Tvorba stromu výrazu –Builder + 1 2 1 + 2 1 2 +
Praktická ukázka (2/5) • Implementace tvorby stromu výrazu • rozhraní IExpressionBuilder • třída ExpressionParser • třída InfixExpressionBuilder
Praktická ukázka (3/5) • Implementace výpočtu výrazu • rozhraní IContext • metoda IExpression.Evaluate(IContext) • třída DictionaryContext
Praktická ukázka (4/5) • Implementace tvorby kontextu • rozhraní IContextBuilder • třída ContextParser • třída DictionaryContextBuilder
Praktická ukázka (5/5) • Implementace napojení na UI • rozhraní ICommand • třída CalculationCommand • deklarace atributu typu ICommand • vytvoření instance CalculationCommand
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?
Rok 2005: 10. výročí vzorů GoF Zdroj: http://laputan.org/
Občerstvení, názory, připomínky, otázky, odpovědi… Přestávka
2. část Návrhové vzory EAA
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
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) 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
Vzory EAA v praktické ukázce Repository – hlavní přístupový bod k mechanismu persistence výrazů a hodnot proměnných DependencyInjection – 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ů
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
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 Repository • rozhraní IRepositoryProvider • třída SimpleRepositoryProvider • Změna konkrétní implementace funkčnosti z jednoho místa v kódu • třída ServiceLocator
Zdroje http://sourcemaking.com/ http://martinfowler.com/articles/injection.html