Petr Puš Software Architect Unicorn a.s. Microsoft C# MVP.

Slides:



Advertisements
Podobné prezentace
(instance konkrétní třídy)
Advertisements

Seminář C++ 5. cvičení Dědičnost Ing. Jan Mikulka.
Proxy. Definice  zástupce nebo náhradník za dotyčný objekt  proxy i zastoupený objekt dědí od stejného interfacu  proxy kontroluje přístup k objektu.
Přednáška č. 5 Proces návrhu databáze
Workflow Foundation Základy a architektura
Modelování procesů pomocí workflow
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Uživatelská rozhraní Uživatelská rozhraní 9. cvičení.
PJV151 Vnořené a vnitřní členy mohou být členy tříd a interfejsů. Je-li X obalem Y a Y je obalem Z, pak Z získá jméno X$Y$Z - kompilací vzniknou classy.
Singleton 1 1.
Použití návrhových vzorů v prostředí jazyka C# .NET
Vektorový animátor Diplomová práce
Čtvrté cvičení Objektové programování Objektový model v Javě
J a v a Začínáme programovat Lucie Žoltá metody, objekty, konstruktor.
Chain of responsibility Martin Malý prezentace na předmět Návrhové vzory (PRG024) na MFF UK
State. State – kontext a problém Kontext  chování objektu má záviset na jeho stavu, který se typicky mění za běhu Neflexibilní řešení  metody obsahují.
Páté cvičení Dědičnost Interface Abstarktní třídy a metody
Kapitoly z metodologie pedagogického výzkumu Prostředí pro výuku algoritmů Vojtěch Ouška.
Ing. Josef Veselý Označení šablony a vzdělávací sady viz.rozpis.
Adapter. Adapter – pojem Součástka navržená k propojení dvou „nekompatibilních“ zařízení Definice slova podle Cambridge Advanced Learner's Dictionary:
Objektové programování
Rozšíření jednouživatelské verze IS na víceuživatelskou Prezentace Diplomové práce Autor : Libor Tomášek Spoluautoři : Pobucký M., Drábek L. Vedoucí :
Návrhové vzory Filip Zavoral
08/04/20151 Delegáty (1) Delegát (delegate) je datový typ, který definuje signaturu metody Delegáty bývají rovněž označovány jako typo- vě bezpečné ukazatele.
PRÁCE S VLÁKNY A APLIKAČNÍ DOMÉNY V.NET FRAMEWORK APLIKACÍCH Architektura technologie.NET Jan Martinovič, FEI - Katedra Informatiky.
Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public.
Composite [kompozit, ne kompozajt]. Composite Výslovnost  kompozit, ne kompozajt Účel  Popisuje, jak postavit hierarchii tříd složenou ze dvou druhů.
6. cvičení Polymorfismus
Memento. Obnovení operačního systému ( Windows | Linux...) Všichni víme, co jsou transekce v databázi Memento – zálohování databáze.
Transparentní modelování a provádění procesů Michael Juřek Software Architect Microsoft s.r.o.
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
OSNOVA: a) Úvod do OOPb) Třídy bez metod c) Třídy s metodamid) Konstruktory a destruktory e) Metody constf) Knihovní třídy g) Třídy ve tříděh) Přetížení.
Algoritmizace a programování Objektově orientované programování - 16 Mgr. Josef Nožička IKT Algoritmizace a programování
Návrhový vzor Factory v JAVA API Martin Kot Katedra informatiky VŠB – Technická univerzita Ostrava
IB111 Programování a algoritmizace
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
Metodika objektového přístupu při tvorbě překladačů. Marek Běhálek Informatika a aplikovaná matematika FEI VŠB-TU Ostrava.
Principy OOP Objektově orientované programování vychá-zí ze třech základních principů (rysů): zapouzdření (encapsulation) dědičnost (inheritance) polymorfismus.
Decorator. Rozšiřuje objekty o dodatečné chování  rozšiřuje konkrétní objekty, ne třídy  rozšiřuje objekt dynamicky, tj. za běhu Upřednostňuje kompozici.
FEL Komunikátor. Memory Leak program konsumuje operační paměť, kterou neumožňuje uvolnit o uvolnění paměti stará Garbage Collector ▫plně v režii Java.
Service layer. Service layer – úvod Problém  Vytvoření API aplikace  Odstínění bussiness logiky a transakčního chování od zbytku aplikace  Kam s aplikační.
Observer Martin Dráb Návrhové vzory, Co to je?  Definuje závislost 1:N mezi objekty  Závislé objekty jsou informovány o změně stavu  Konzistentní.
Strategy. Motivace Různé algoritmy pro stejnou akci Hromada kódu v mnoha podmínkách Důsledky  Komplexnost  Špatná čitelnost  Těžká správa kódu  Těžka.
Proxy. Popis  Klient má přístup k nějakému objektu  Potřebujeme tento přístup ošetřit, aniž bychom přidělali klientovi práci Kontrola přístupu Vzdálený.
Iterator Iterator – Problém struct Item { int _value; Item * _next; Item( int value, Item * next ) : _value( value ), _next( next ) { } }; void Print(
Template Method. Motivační příklad – reálný svět Čaj 1) Uvař vodu 2) Dej do hrnku sáček čaje 3) Zalij hrnek 4) Přisyp cukr a vymačkej citrón Káva 1) Uvař.
Composite “ Spojuj a panuj ”. Zakladní vlastnosti Výslovnost  kompozit, ne kompozajt Účel  Popisuje, jak postavit strukturované hierarchie tříd, v níž.
Iterator. C historie int * rand_numbers(int n) { int *numbers = malloc(n * sizeof(int)); int *it = numbers; while (it < numbers + n) *it++ = rand(); //
Petr Puš SW Architekt Unicorn a.s. Microsoft C# MVP.
Proxy. Proxy poskytuje bariéru mezi klientem a reálnou implementací.
Strategy. Motivace Ze života - jak to taky může vypadat (R): source("../algorithms/HOCForLOCF.R") source("../algorithms/HOCForLOCFv2.R") source("../MILP/MILP.R")
Praha & EU: Investujeme do vaší budoucnosti Evropský sociální fond Gymnázium, Praha 10, Voděradská 2 Projekt OBZORY MVC vs MVP.
SOLID principy v OOP návrhu
Návrhové vzory Filip Zavoral
Jazyk C# a platforma .NET ZS 2016/2017
Mediator Několik slov o překladu slova do češtiny (prostředník, zprostředkovatel), vyzdvihnutí počeštěného slova mediátor. 1 1.
Návrhový vzor Flyweight
Abstract Factory.
Lazy load Použity informace z knihy Patterns of Enterprise Application Architecture od M. Fowlera Jan Sládek.
Strategy „Definujte rodinu algoritmů, zapouzdřuje je aby byly vzájemně zaměnitelné. Strategie umožňuje, aby se algoritmus nebyl závislý na klientech, kteří.
Bridge.
C# přehled vlastností.
Monitor Object 1.
Dfdfdf.
Mediator Několik slov o překladu slova do češtiny (prostředník, zprostředkovatel), vyzdvihnutí počeštěného slova mediátor. 1 1.
Proxy 1.
Adapter
Composite “Spojuj a panuj”.
Bridge.
Návrhový vzor Prototype.
Transkript prezentace:

Petr Puš Software Architect Unicorn a.s. Microsoft C# MVP

Co jsou design patterns a proč je používat? GoF design patterns Popis vybraných GoF design patterns

Design patterns = Návrhové vzory „Vzory“ pro návrh softwarových řešení Ověřená řešení opakujících se netriviálních problémů Tvorba objektů Granularita objektů Odpovědnost objektů Rozšiřitelnost řešení … Inspirovány vzory z tradiční architektury

K dispozici několik desítek vzorů Často technologicky nezávislé.NET nebo Java nebo C++ nebo.. Konkrétní implementace se mohou v závislosti na technologii lišit Někdy více možností implementace vzoru Závisí na možnostech technologie Řešení často kombinuje více návrhových vzorů najednou

Není potřeba znovu „vymýšlet kolo“..i když to vývojáři rádi dělávají ;-) Kvalitněji a rychleji navržená řešení Standardní implementace řešení Lepší pochopitelnost kódu Moderní platformy jsou plné design patterns Jednodušší komunikace Každý vzor – jedinečný název Ale pozor – nic se nemá přehánět.. Snaha použít vzory naprosto všude vede k negativním dopadům

Návrhové vzory (Design patterns) Vzory aplikovatelné ve fázi návrhu řešení Architektonické vzory (Architectural patterns) Vzory pro architektonického konceptu aplikace Integrační vzory (Integration patterns) Vzory řešící integraci (propojení) systémů Vzory nasazení (Deployment patterns) Vzory pro způsoby nasazení aplikací …

GoF = Gang of Four Čtveřice autorů nejpoužívanějších design patterns pro OOP Gamma, Helm, Johnson, Vlissides Kniha „Design Patterns: Elements of Reusable Object-Oriented Software“ Rozdělení vzorů do skupin Definice vzorů Základem pro další návrhové vzory

Využívají pokročilých postupů OOP Použití rozhraní (interface) Dědičnost Polymorfizmus Skladba objektů Delegování

Tvořivé vzory (Creational patterns) Zaobírají se procesem objektové tvorby Strukturální vzory (Structural patterns) Zabývají se skladbou tříd či objektů Vzory chování (Behavioral patterns) Řeší vzájemnou interakci tříd či objektů a jejich závislosti

Název Skupina Účel Jiné názvy Motivace Struktura Použití Účastníci Spolupráce účastníků Důsledky použití Známá použití Implementace Příbuzné vzory

Účel : Zajišťuje, aby třída měla v systému pouze jednu instanci Skupina : Tvořivé vzory Použití : Je potřeba zajistit, aby třída měla jednu instanci, která je pro ostatní objekty snadno přístupná Třída může zajistit, že nebude možné vytvořit žádnou jinou instanci

Struktura :

Implementace v C# : Využití statické vlastnosti pro poskytnutí jedinečné instance Využití privátního konstruktoru pro zamezení tvorby jiných instancí

Implementace v C# - Nejjednodušší varianta : public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton Instance { get { if (instance == null) { instance = new Singleton(); } return instance; } public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton Instance { get { if (instance == null) { instance = new Singleton(); } return instance; }

Implementace v C# - Thread safe, lazy : public class Singleton { private static readonly object locker = new object(); private static Singleton instance; private Singleton() { } public static Singleton Instance { get { lock (locker) { if (instance == null) instance = new Singleton(); return instance; } public class Singleton { private static readonly object locker = new object(); private static Singleton instance; private Singleton() { } public static Singleton Instance { get { lock (locker) { if (instance == null) instance = new Singleton(); return instance; }

Implementace v C# - Thread safe II public class Singleton { private static readonly Singleton instance; static Singleton() { instance = new Singleton(); } private Singleton() { } public Singleton Instance { get { return instance; } public class Singleton { private static readonly Singleton instance; static Singleton() { instance = new Singleton(); } private Singleton() { } public Singleton Instance { get { return instance; }

Účel : Definuje mezi-objektovou závislost, kde při změně stavu jednoho objektu jsou ostatní zainteresované objekty upozorněny Skupina : Vzory chování Použití : Změna jednoho objektu znamená změnu jiných objektů Objekt má upozorňovat jiné objekty bez toho, aby na mě měl silnou vazbu

Struktura :

Spolupráce :

Implementace v C# (Standardní OOP verze) Pro pozorovatele je definováno společné rozhraní, které definuje reakční metodu(y) Jednotliví pozorovatelé implementují reakční metodu a provedou konkrétní reakce Subjekt si uchovává reference na všechny pozorovatele Při provedení pozorované akce vyvolá subjekt reakční metodu na všech pozorovatelích

Implementace v C# (Standardní OOP verze) Rozhraní a implementace pozorovatele public interface IObserver { void Update(); } public interface IObserver { void Update(); } public class ConcreteObserver : IObserver { public void Update() { //reaction to the event } public class ConcreteObserver : IObserver { public void Update() { //reaction to the event }

Implementace v C# (Standardní OOP verze) Bázová třída pro sledované subjekty public abstract class Subject { private IList observers = new List (); public void Subscribe(IObserver observer) { observers.Add(observer); } public void Unsubscribe(IObserver observer) { observers.Remove(observer); } public void Notify() { foreach (IObserver observer in observers) { observer.Update(); } public abstract class Subject { private IList observers = new List (); public void Subscribe(IObserver observer) { observers.Add(observer); } public void Unsubscribe(IObserver observer) { observers.Remove(observer); } public void Notify() { foreach (IObserver observer in observers) { observer.Update(); }

Implementace v C# (Standardní OOP verze) Konkrétní sledovaný subjekt Použití subjektu a registrace pozorovatelů public class ConcreteSubject : Subject { public void ConcreteMethod() { UpdateState(); //observers notification Notify(); }... } public class ConcreteSubject : Subject { public void ConcreteMethod() { UpdateState(); //observers notification Notify(); }... } ConcreteSubject subject = new ConcreteSubject(); subject.Subscribe(new ConcreteObserver(„X“)); subject.Subscribe(new ConcreteObserver(„Z“)); subject.ConcreteMethod(); ConcreteSubject subject = new ConcreteSubject(); subject.Subscribe(new ConcreteObserver(„X“)); subject.Subscribe(new ConcreteObserver(„Z“)); subject.ConcreteMethod();

Implementace v C# Podpora pro vzor Observer je v C# na úrovni jazyku – Events Konkrétní jazykové konstrukce pro implementaci Použití delegátů jako rozhraní reakčních metod (EventHandler) Pro případné dodatečné informace k události slouží typy odvozené od EventArgs

Implementace v C# (Events) public abstract class Subject { public event EventHandler StateChanged; protected void RaiseStateChanged() { if (StateChanged != null) { StateChanged(this, EventArgs.Empty); } public class ConcreteSubject : Subject { public void ConcreteMethod() { UpdateState(); //observers notification RaiseStateChanged(); } … } public abstract class Subject { public event EventHandler StateChanged; protected void RaiseStateChanged() { if (StateChanged != null) { StateChanged(this, EventArgs.Empty); } public class ConcreteSubject : Subject { public void ConcreteMethod() { UpdateState(); //observers notification RaiseStateChanged(); } … }

Implementace v C# (Events) ConcreteSubject subject = new ConcreteSubject(); ConcreteObserver observer = new ConcreteObserver(); subject.StateChanged += ObserverMethod; subject.StateChanged += observer.Update; subject.ConcreteMethod(); … static void ObserverMethod(object sender, EventArgs e) { //reaction } ConcreteSubject subject = new ConcreteSubject(); ConcreteObserver observer = new ConcreteObserver(); subject.StateChanged += ObserverMethod; subject.StateChanged += observer.Update; subject.ConcreteMethod(); … static void ObserverMethod(object sender, EventArgs e) { //reaction } public class ConcreteObserver { public void Update(object sender, EventArgs args) { //reaction } public class ConcreteObserver { public void Update(object sender, EventArgs args) { //reaction }

Známá použití v.NET Reakce na UI akce (ASP.NET, WinForms, WPF) Sledování změn souborů (FileSystemWatcher) Validace XML (ValidationEventHandler) …

Účel : Poskytuje zástupce za jiný objekt za účelem řízení přístupu k objektu Skupina : Strukturální vzory Použití : Je potřeba řídit přístup k jinému objektu Je potřeba obohatit operace cílového objektu

Struktura :

Spolupráce :

Použití : Remote proxy Přístup ke vzdálenému objektu (WS, Remoting,..) Protective proxy Kontrola přístupu k objektu, například na základě oprávnění Smart proxy Zajištění dodatečných operací před/po volání metody objektu Virtual proxy „Lazy“ tvorba zastupovaného objektu Cache proxy Cachování výsledků metod objektu

Implementace v C# : Proxy třída implementuje rozhraní zastupovaného objektu Do klientských referencí jsou namísto skutečných objektů obsazováni zástupci Vhodné objekty vytvářet pomocí továrny Klient „neví“ o použití proxy

Implementace v C# : public interface ISubject { int Method(string arg); } public interface ISubject { int Method(string arg); } public class RealSubject : ISubject { public int Method(string arg) { //implementation.. } } public class RealSubject : ISubject { public int Method(string arg) { //implementation.. } } public class CacheProxy : ISubject { private ISubject proxiedSubject; private IDictionary cache; public int Method(string arg) { if (cache.ContainsKey(arg)) { return cache[arg]; } else { int result = proxiedSubject.Method(arg); cache[arg] = result; return result; } public class CacheProxy : ISubject { private ISubject proxiedSubject; private IDictionary cache; public int Method(string arg) { if (cache.ContainsKey(arg)) { return cache[arg]; } else { int result = proxiedSubject.Method(arg); cache[arg] = result; return result; }

Známá použití v.NET Web services.NET Remoting WCF Enterprise Library Validation Block

Dynamická tvorba proxy tříd za běhu Proxy třída vytvořena na základě typu zastupované třídy Vhodné když : Je mnoho tříd, které je potřeba zastoupit Je potřeba zastupovat klientem vytvořené třídy

Implementace dynamic proxy v.NET Služby.NET Remoting ContextBoundObject a ProxyAttribute Nelehká implementace Výhodou vyšší výkon Castle Dynamic Proxy Open-source projekt pro tvorbu dyn. proxies Typ ProxyGenerator – tvorba proxy Rozhraní IInterceptor – implementace proxy operací MS Enteprise Library MS Open-source projekt Typ ObjectBuilder – tvorba proxy

Implementace pomocí Caste DynamicProxy class LoggingInterceptor : IInterceptor { public object Intercept(IInvocation invocation, params object[] args) { //log before method.. return invocation.Proceed(args); //log after method.. } class LoggingInterceptor : IInterceptor { public object Intercept(IInvocation invocation, params object[] args) { //log before method.. return invocation.Proceed(args); //log after method.. } ISubject realSubject = new RealSubject(); ProxyGenerator generator = new ProxyGenerator(); ISubject proxy = (ISubject) generator.CreateProxy( typeof(ISubject), new LoggingInterceptor(), realSubject); int result = proxy.Method("Hello"); ISubject realSubject = new RealSubject(); ProxyGenerator generator = new ProxyGenerator(); ISubject proxy = (ISubject) generator.CreateProxy( typeof(ISubject), new LoggingInterceptor(), realSubject); int result = proxy.Method("Hello");

Účel : Umožňuje měnit algoritmus provedení úlohy bez ovlivnění klienta, který ji používá Skupina : Vzory chování Použití : Je potřeba různých variant algoritmu Variantu algoritmu je potřeba měnit za běhu Třída definuje mnoho druhů chování

Struktura:

Spolupráce:

Implementace v C#: Pro algoritmus je definováno společné rozhraní Jednotlivé implementace algoritmu implementují rozhraní algoritmu Jiný objekt pracuje pouze s referenční proměnnou typu rozhraní algoritmu Objektu je možné nastavit implementační typ algoritmu (parametr konstruktoru, set vlastnost)

Implementace v C#: public abstract class DataReader { public abstract object GetData(int id); } public abstract class DataReader { public abstract object GetData(int id); } public class XmlDataReader : DataReader { public override object GetData(int id) { //implementation of XML reading.. } public class XmlDataReader : DataReader { public override object GetData(int id) { //implementation of XML reading.. } public class DataBaseDataReader : DataReader { public override object GetData(int id) { //implementation of DB access.. } public class DataBaseDataReader : DataReader { public override object GetData(int id) { //implementation of DB access.. } public class DataFacade { public DataReader Reader { get; set; } public DataFacade(DataReader reader) { this.Reader = reader; } public object LoadData(int id) { return Reader.GetData(id); } public class DataFacade { public DataReader Reader { get; set; } public DataFacade(DataReader reader) { this.Reader = reader; } public object LoadData(int id) { return Reader.GetData(id); } public class Client { public static void UseDataFacade() { DataFacade facade = new DataFacade(new XmlDataReader()); object data = facade.LoadData(1); facade.Reader = new DataBaseDataReader(); data = facade.LoadData(1); } public class Client { public static void UseDataFacade() { DataFacade facade = new DataFacade(new XmlDataReader()); object data = facade.LoadData(1); facade.Reader = new DataBaseDataReader(); data = facade.LoadData(1); }

Známá použití v.NET: Provider pattern ADO.NET data providers Ukládání session state Membership Role management API … Ukládání ViewState (PageStatePersister)

Creational patterns Factory method Abstract factory Singleton Builder Structural patterns Adapter Decorator Facade Bridge FlyWeight Composite Proxy Behavioral patterns Interpret Template method Iterator Visitor Memento Observer Mediator Command Chain of responsibility State Strategy

Kniha „Design Patterns: Elements of Reusable Object-Oriented Software“ Ukázky implementace design patterns v C# Enteprise Solution Patterns Using Microsoft.NET us/library/ms aspx