René Stein. Senior Software Architect

Podobné dokumenty
Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

1. Programování proti rozhraní

Windows a real-time. Windows Embedded

Vyřešené teoretické otázky do OOP ( )

Design Patterns. Tomáš Herceg Microsoft MVP (ASP.NET)

Vývoj informačních systémů. Architektura, návrh Vzory: Doménová logika

Návrhové vzory OMO, LS 2014/2015

TÉMATICKÝ OKRUH Softwarové inženýrství

UJO Framework. revoluční architektura beans. verze

Generické programování

7.5 Diagram tříd pokročilé techniky

IoC/DI. Tomáš Herceg Microsoft MVP (ASP.NET)

CineStar Černý Most Praha

Komponenty v.net. Obsah přednášky

7 Jazyk UML (Unified Modeling Language)

Efektivní vývoj mobilních aplikací na více platforem současně. Mgr. David Gešvindr MCT MSP MCPD MCITP

Jazyk C# (seminář 6)

Služba ve Windows. Služba (service) je program

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

TÉMATICKÝ OKRUH Softwarové inženýrství

Řízení reálných projektů, agilní metodiky

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2009 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 25

7 Jazyk UML (Unified Modeling Language)

7.5 Diagram tříd pokročilé techniky

Třída. Atributy. Operace

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

RMI Remote Method Invocation

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2008 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 24

Observer. Klasifikace. Alias. Smysl. Potřeba sledování změn objektu a notifikace. Obdoba systému událostí (C#, Java) vlastními prostředky

Návrhový vzor Factory v JAVA API

Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics

Architektury informačních systémů

Architektury informačních systémů

Principy OOP při tvorbě aplikací v JEE. Michal Čejchan

Michal Podzimek

UML a jeho použití v procesu vývoje. Jaroslav Žáček jaroslav.zacek@osu.cz

Abstract Factory úvod

PB161 Programování v jazyce C++ Přednáška 7

Infrastruktura UML. Modelování struktury v UML. Superstruktura UML. Notace objektů. Diagramy objektů

PHP framework Nette. Kapitola Úvod. 1.2 Architektura Nette

2015 GEOVAP, spol. s r. o. Všechna práva vyhrazena.

PB161 Programování v jazyce C++ Přednáška 7

OSGi. Aplikační programování v Javě (BI-APJ) - 6 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Vývoj informačních systémů. Přehled témat a úkolů

knihovna programátora

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové technologie

Základy datových vazeb Silverlightu. Funkce Silverlightu 2. Podpora jazyků a technologie.net Framework

Analýza a Návrh. Analýza

Jak na IoC/DI kontejnery

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Integrace OpenOffice.org a Javy. CZJUG, , Robert Vojta

Vývoj informačních systémů. Přehled témat a úkolů

VZOROVÝ STIPENDIJNÍ TEST Z INFORMAČNÍCH TECHNOLOGIÍ

Teoretické minimum z PJV

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Tvorba informačních systémů

Vytváření a použití knihoven tříd

Obsah. Kapitola 1. Předmluva 11 O této knize 13 Konvence...13

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo

Semináˇr Java X J2EE Semináˇr Java X p.1/23

Komponentový návrh SW

Jazyk C# (seminář 3)

Základy analýzy. autor. Jan Novotný února 2007

6 Objektově-orientovaný vývoj programového vybavení

Java a XML. 10/26/09 1/7 Java a XML

Budování architektury pomocí IAA

1 Nejkratší cesta grafem

Zpracoval:

Seznámení s prostředím dot.net Framework

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

UML: Unified Modeling Language

Kód, který se nebude často měnit

Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové aplikace

Projekt JetConf REST API pro vzdálenou správu

Výčtový typ strana 67

Java/QE Akademie - Osnova

Základy objektové orientace I. Únor 2010

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

Programátorská příručka

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Úvod Seznámení s předmětem Co je.net Vlastnosti.NET Konec. Programování v C# Úvodní slovo 1 / 25

Programování v jazyku C# II. 9.kapitola

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Problém, jehož různé instance je třeba často řešit Tyto instance lze vyjádřit větami v jednoduchém jazyce

Dalším příkladem může být například výstup dat na různá zařízení, souborů, grafických rozhraní, sítě atd.

IRAE 07/08 Přednáška č. 1

Serverové systémy Microsoft Windows

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

11 Návrh programového vybavení

Pokročilé Webové služby a Caché security. Š. Havlíček

1. Dědičnost a polymorfismus

Transkript:

René Stein Senior Software Architect rene@renestein.net

Návrhové vzory úvod Component configurator Thread specific storage (PseudoSingleton) Extension Interface Special Case Object Interceptor Volná diskuze.

Návrhové vzory nejsou kupodivu jen Singletony - ani pouze GoF vzory. Od mnoha vývojářů jsem slyšel větu na co vzory, když už mám všechno ve frameworku a teď se naučím jen další xml jazyk pro konfiguraci knihovny. Podle mě je nebezpečné vyvíjet aplikace založené na skládání vygooglovaných slepenců, které nějak zatím fungují. U speciálních vlastních řešení nemusím použít 5% funkcí z nějaké megalomanské knihovny, ale napíšu si odlehčenou a pro mé účely lépe přizpůsobenou knihovnu.

Návrhový vzor je mnohem abstraktnější a univerzálnější než Framework Návrhový vzor je menší stavební jednotkou designu než Framework Frameworky se specializují na určité oblasti (Business aplikace J2EE,.NET Framework) Frameworky jsou ale většinou sestavené z návrhových vzorů => při znalosti vzorů vývojářem je učení se snazší. Návrhový vzor i Framework usilují o totéž o znovupoužití znalostí, případně kódu.

Vzor pro separaci administračních úloh (zastavení, spuštění, rekonfigurace) a vlastní činnosti komponent. Různé části aplikace jsou primadony vyžadující speciální zacházení, nebo raději šedé průměrné předvídatelné myšky reagující na správné povely? Zavedením Component configuratoru můžeme z jednoho místa spravovat seznam aktivních komponent a za běhu aplikace komponenty měnit (např. výměna komponenty pro odesílání SMS, aniž bychom museli aplikaci rekompilovat a restartovat)

<<.NET Framework Type>> IDisposable Dispose () IComponent ComponentRepository Information string <<Singleton>> Instance ComponentRepository AddComponent (string key, IComponent component) RemoveComponent (string key) GetComponent (string key) IComponent 1 0..* Suspend () Resume () Init (initvalues Hashtable) Start () Stop () ComponentBase Information string <<Implement>> <<Implement>> <<Implement>> <<Implement>> <<Implement>> <<Implement>> Suspend () Resume () Init (int Hashtable) Start () Stop () Dispose () ComponentConfigurator <<Singleton>> Instance ComponentConfigurator Interpret (string script) ConcreteComponent2 ConcreteComponent1 <<Override>> <<Override>> <<Override>> <<Override>> <<Override>> Suspend () Resume () Init (int Hashtable) Start () Stop () <<Override>> <<Override>> <<Override>> <<Override>> <<Override>> Suspend () Resume () Init (int Hashtable) Start () Stop ()

Známý příklad představují Windows služby Applety v Javě jsou variací myšlenky Component Configuratoru (init, getappletinfo). Kromě repozitáře-prostého skladiště můžeme pro všechny komponenty nabídnout speciální služby Možnost skládat - řetězit komponenty (návrhový vzor Composite). Speciální služba pro komponenty čeká na tcp připojení klienta a poté požadavek přepošle komponentě, která má o komunikaci na daném portu zájem. (Vzory Reactor Proactor).

V multithreadovém si nevystačíme s jedním globálním přístupovým bodem k nějaké instanci. U Singletonů (UnitOfWork, DB komponenta) chceme, aby každý thread přistupoval k jedinému logickému přístupovému bodu, který ale pro každý thread udržuje právě jednu specifickou instanci. Ukázka jednoduché implementace (nevýkonné)

ThreadLocal Metody initialvalue, get, set V každém jazyce bývá speciální podpora. Visual C - declspec(thread) int number;.net Framework - atribut ThreadStatic

Úložiště pro všechny threadově specifické objekty v jedné kolekci => minimum kritických sekcí. Kdy odstraníme objekt v threadově specifickém úložisti? Hook metody. Použití návrhového vzoru proxy Výhodné je, že se nemění API a klienti třídy si ani nemusí být vědomi, že instance dané třídy už není v systému jen jedna, ale že jsou instance vytvářeny pro všechny přistupující thready. Ale někdy jde jen o další matoucí obskurnost...

Rozhraní (v obojím významu) by mělo být stabilní. Rozhraní je ale potřeba často měnit Přidání metody = nekompatibilita se stávajícími klienty Změna signatury metody = nekompatibilita se stávajícími klienty Problém s komponentami, jejichž rozhraní připomíná univerzální božský nástroj s ovládacími prvky pro řízení všech rozmanitostí světa. Pohanský a kacířský nástroj. Ruská ruleta

Jak identifikovat rozhraní? Int, Guid, deskriptor typu class, Type? Zavedení rozhraní pro každou roli třídy Jak signalizovat klientovi, že požadované rozhraní není dostupné? Použití abstraktní továrny k vytvoření instance

Vhodné je opět použití generických metod Implementace rozhraní v různých třídách Komplikované a neintuitivní API? Je jediným kritériem pro zavedení samostatného rozhraní množství metod v rozhraní? Kvantita se nemění samovolně v kvalitu, kupodivu ani redukce počtu metod nevede vždy ke kvalitnímu rozhraní. Učebnicovým příkladem může být (programátory často nenáviděný ) COM

Nebaví Vás testy objektů na null? Mě ani trochu Jestliže pracujeme s atypickým výskytem objektu (null objekt, neznámý produkt atd), můžeme vytvořit samostatnou třídu reprezentující speciální případ zpřehlednění kódu. Naše aplikace odesílá notifikace přes SMS, Email atd. => máme zákazníka, který o notifikace nemá zájem Jedinou prací null náhrady je dolce far niente

SomeObject GetValue () int SpecialCaseObject <<Override>> GetValue () int P epsan metoda vr t -1 (dle konvence aplikace nedefinov no)

Varianta Exceptional Value objekt Jediná instance (Singleton) reprezentující všechny null výskyty instancí z dané třídy. Typicky imutabilní Bezstavové

Tendence prorůstat celým systémem => zavádění null náhrad i u dalších (asociovaných, odvozených) tříd. Chyby se dají zavléct i do triviálního kódu null objektu. Smyslupná reprezentace null objektu? Konstanty, prázdné řetězce? Special Case NENÍ A NESMÍ BÝTnáhradou za povinné asociace (agregace, kompozice)

Interceptor řeší situaci, kdy chceme nabídnout aplikaci, kterou mohou třetí strany rozšiřovat o další služby, ale my si chceme ponechat úplnou kontrolu nad klíčovými aspekty všech procesů (např. nad autentizací uživatelů) Z naší aplikace publikujeme klíčové události, které zachytí dispatcher a přepošle je zaregistrovaným interceptorům (pořadí vyvolání interceptorů se může řídit např. jejich prioritou) Aplikace zohlední změny požadované interceptory.

IInterceptor Application Priority int HandleSendMessage (SendMessageEventArgs e) # OnSendMessage (SendMessageEventArgs e) 1 0..1 ConcreteApplicationInterceptor Dispatcher 0..* <<Implement>> HandleSendMessage (SendMessageEventArgs e) 0..* 1. 2. 3. 4. Dispatcher si p ihl s ud lost OnSendMessage objektu Application K dispatcheru se registruj intercepto i Po p ijet ud losti dispatcher vyvol v dispatecher interceptory dle jejich priority Objekt application zohledni zm ny od interceptor p edan v argumentu SendMessageEventArgs

Návrh rozhraní interceptora? Jednoúčelové metody? Univerzální metody? Evoluce rozhraní interceptora Sledování probíhajících procesů v aplikaci Nezatěžujeme vývojáře interceptorů zbytečnou znalostí vnitřností aplikace. Některé rysy interceptoru můžeme najít u vzorů Template methods a Chain Of Responsibility Open-Closed princip.

René Stein Senior Software Architect.Net Development, Mobile Development managed(business applications)/native (drivers, services/navigation software) rene@renestein.net http//blog.renestein.net