1 / 53

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

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 v praxi

yitta
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  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. 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 GoFa 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

  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ů 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

  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

  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) • 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 PatternLanguage, 1977 • Kent Beck, WardCunningham: Using Pattern Languages for Object-Oriented Programs, OOPSLA, 1987 • GoF: Design Patterns, OOPSLA, 1994

  32. GoF: Gang ofFour Ralph Johnson, Erich Gamma,Richard Helm, John Vlissides

  33. Rok 2005: 10. výročí vzorů GoF Zdroj: http://laputan.org/

  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 • skládá funkčnostobjektů • zachovává rozhraní • Proxy • upravujefunkčnostobjektu • zachovávározhraní

  38. Mediator vs. Observer • Mediator • fixní vztahy(většinou) • Observer • variabilnívztahy(většinou) Otázka: Najdete v těchto diagramech syntaktickou chybu?

  39. Visitor vs. Interpreter • Visitor • visitor se připrůchodu mění • Interpreter • kontext se připrů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) { if (instance == null) instance = new Singleton(); } } return instance; } } private Singleton() { ... } }

  46. O vzorech EAA • hlavním autorem Martin Fowler • http://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í

  47. 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/

  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

More Related