Visitor 1 1.

Slides:



Advertisements
Podobné prezentace
Visitor. Visitor - motivace Existující struktura typů Unit Character Main Hero Monster Environment Wall Magic Wall Stone Tree Mnoho nezávislých operací.
Advertisements

Objektově orientované programování. Objektově orientovaný přístup k programování je zcela jiný způsob přemýšlení. Jedná se o moderní styl programování,
Elektromagnetická slučitelnost. Název projektu: Nové ICT rozvíjí matematické a odborné kompetence Číslo projektu: CZ.1.07/1.5.00/ Název školy:
Kuchařka na práci s mnohočleny Matematika pro ZŠ Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je David Salač. Dostupné z Metodického portálu.
Inf Používání a tvorba databází. Výukový materiál Číslo projektu: CZ.1.07/1.5.00/ Šablona: III/2 Inovace a zkvalitnění výuky prostřednictvím ICT.
Období vzniku: duben _inovace_FG.9.48 Autor : Vladimír TesaříkČlověk a svět práce, finanční gramotnost, nové auto.
Využití informačních technologií při řízení obchodního řetězce Interspar © Ing. Jan Weiser.
Inf Tabulkový procesor - funkce. Výukový materiál Číslo projektu: CZ.1.07/1.5.00/ Šablona: III/2 Inovace a zkvalitnění výuky prostřednictvím ICT.
Systém správy dokumentace akreditované zkušební laboratoře Bc. Jan Randl, 4912.
Formáty souborů (neboli typ souboru) obvykle určuje význam dat v elektronickém souboru. Existuje množství různých formátů, přizpůsobených pro ukládání.
Programování v jazyce C++ Dědičnost a polymorfismus.
Číslo projektu školy CZ.1.07/1.5.00/ Číslo a název šablony klíčové aktivity III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Číslo materiáluVY_32_INOVACE_OdP_S2_07.
Petr Kielar Seminář o stavebním spoření Část VI: Podmínka rovnováhy a SKLV.
ZAL – 5. cvičení Martin Tomášek Pole - opakování Základní datový typ. V poli držíme více elementů (jednoho typu) S elementy v poli můžeme manipulovat.
Principy Základních registrů Ing. Ondřej Felix, CSc.
STYL Ke stylu se užívá:Typické slovní prostředky: Věty: 1. HOVOROVÝ v běžných rozhovorech každodenního života slova a obraty hovorové, výrazy z obecné.
Senzory pro EZS. Název projektu: Nové ICT rozvíjí matematické a odborné kompetence Číslo projektu: CZ.1.07/1.5.00/ Název školy: Střední odborná.
Databáze © Mgr. Petr Loskot
Seminář o stavebním spoření
Účetnictví a výkaznictví
AUTOR: Mgr. Hana Vrtělková NÁZEV: VY_32_INOVACE_M_20_Rovinné útvary
STATISTIKA Starší bratr snědl svůj oběd i oběd mladšího bratra. Oba snědli v průměru jeden oběd.
Počítačová grafika Rozdělení počítačové grafiky, charakteristika jednotlivých druhů.
COM – Práce s objektovým modelem jiné aplikace
Lineární funkce - příklady
ČÍSLO PROJEKTU CZ.1.07/1.5.00/ ČÍSLO MATERIÁLU 1 – Množiny – teorie
State 1.
Algoritmizace - opakování
Algoritmizace - opakování
Programování v jazyce C++
Přístupový systém aneb kontrola vstupů
Financováno z ESF a státního rozpočtu ČR.
Monitory Monitor je základní výstupní elektronické zařízení sloužící k zobrazování textových a grafických informací.
Obvody a obsahy rovinných obrazců 3.
VY_32_INOVACE_
Kompetenční modely Mgr. Andrea Drdáková.
TÉMA: Počítačové systémy
Inf Ovládání operačního systému
ADT zásobník - příklad Prakticky aplikovatelný příklad využití ADT zásobník je vyhodnocování aritmetických výrazů v Postfixové notaci: Pro zápis aritmetických.
Základní jednorozměrné geometrické útvary
Configuration Patterns
Programovací jazyky Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Ing. Jitka Vlčková. Dostupné z Metodického portálu ISSN.
C# konzole – Program emoce
Číslo projektu Číslo materiálu název školy Autor Tématický celek
Abstract Factory.
Běžné reprezentace grafu
9. Heterogenní a homogenní skupiny
Překladače 6. Sémantická analýza
Střední odborná škola a Střední odborné učiliště, Hradec Králové, Vocelova 1338, příspěvková organizace Registrační číslo projektu: CZ.1.07/1.5.00/
Kvadratické nerovnice
Pseudosekce: P-T fázový diagram v jednoduchém systému Al2SiO5 s demonstrací postupu při tvorbě pseudosekce.
BIBS Informatika pro ekonomy přednáška 2
Přídavná zařízení.
Provozováno Výzkumným ústavem pedagogickým v Praze.
Materiál byl vytvořen v rámci projektu
Remote login.
Konstrukce trojúhelníku
Builder „Návrhový vzor oddělující konstrukci složitých objektů od jejich reprezentace. Čímž je možné použít stejný proces konstrukce pro rozdílné reprezentace.“
Název školy: Autor: Název: Číslo projektu: Název projektu:
Teorie chyb a vyrovnávací počet 1
Nádherné prezentace navrhnete a předvedete snadno a s jistotou.
Vázání dat Data Binding
Lineární funkce a její vlastnosti
Algoritmizace a datové struktury (14ASD)
Grafy kvadratických funkcí
Hromadné dokumenty opakující se pro kolekci osob
Adapter
Bridge.
Class Diagrams.
Konstrukce trojúhelníku
Transkript prezentace:

Visitor 1 1

Visitor - motivace Existující struktura typů Mnoho nezávislých operací PlainText BoldText Hyperlink ItalicText … Mnoho nezávislých operací toHTML toPlainText toXML toBinary ….. BoldText DocumentPart PlainText Hyperlink … Client jedna struktura typů se společným předkem máme operace nad těmito typy 2

Visitor - motivace Každá dvojice typ a operace má jiný kód BoldText, toHTML Hyperlink, toHTML BoldText, toPlainText ... Implementace operace v jednom modulu BoldTextHTML PlainTextHTML HyperlinkHTML Předpokládáme stabilní struktura typů (nejčastěji se společným předkem) přibývající operace každá dvojice má zpravidla jiný kód operace můžou být nezávislé a vůbec spolu nesouviset, proto chceme implementace pro jednotlive operace sdružovat u sebe chceme spíše přidávat další operace než přidávat prvky hierarchie 3

Visitor - motivace Možné řešení bez visitoru - operace v třídách Výhody jednoduché intuitivní kontrola za překladu Nevýhody pracné přidávání metod funkčnost rozházená po třídách ve třídách je velké množství kódu BoldText toHTML() toXML() toBinary() DocumentPart … PlainText Hyperlink Client UML diagram intuitivního řešení Toto řešení není příliš rozšiřitelné, při přidání nové akce nad strukturou objektů je nutné překompilovat kód jednotlivých tříd, proto toto řešení není vhodné při vytváření sdílené knihovny 4

Visitor - motivace Možné řešení bez visitoru - špagetový kód Výhody kód na jednom místě Nevýhody nepřehledný, opakující se kód mnoho switch / if-else-if bloků přicházíme o kontrolu za překladu void toHTML(List<DocumentPart> page){ foreach (DocumentPart part in page) { if (pt is Plaintext) { //... } else if (pt is BoldText) { else if (e is Hyperlink) { kód na jednom místě, ale nepřehledný používá se runtimová informace o typu, což může k vést k chybám, na které nás překladač zpravidla neupozorní 5

Každý uzel v metodě accept zavolá metodu Visitora Visitor - motivace BaseVisitor visitPlainText(PlainText o) visitBoldText(BoldText o) visitHyperlink(Hyperlink o) HTMLVisitor BinaryVisitor Řešení s použitím Visitoru Potomci Visitora jednoduše přidávají další operace bez nutnosti změny v implementaci struktury typů. Každý uzel v metodě accept zavolá metodu Visitora určenou pro jeho typ DocumentPart accept(BaseVisitor v) PlainText BoldText Hyperlink v.visitBoldText(this); v.visitHyperlink(this); Object structure (Traverser) v.visitPlainText(this); -řešení motivačního příkladu objekty hierarchie mají metodu accept, které je předán visitor. Metoda accept zavolá správnou metodu na visitoru, která vykoná správnou akci pro daný prvek hierarchie metody operace se pro všechny třídy hierarchie nachází v jedné třídě 6 6

Visitor Visitor obecně 7 7 - dvě různé typové hierarchie visitA(ElementA) visitB(ElementB) Visitor1 Visitor2 AbstractElement accept(Visitor) ElementA ElementB v.visitA(this); v.visitB(this); Object structure (Traverser) Client - dvě různé typové hierarchie - traverser volá funkci accept na konkrétním elementu a předává mu konkrétní visitor, traverser toto udělá se všemi prvky v datové struktury - za povšimnutí stojí, že dílčí operace traverseru je vlastně double-dispatch technika, elementy a visitory zpravidla uchováme pomocí ukazatelů na bázovou třídu 7 7

Visitor - účastníci Přehled účastníků AbstractElement interface (nebo abstraktní třída) pro typy, které mohou být navštíveny Visitorem definuje abstraktní metodu accept ElementA, ElementB konkrétní elementy odvozené od AbstractElement implementují metodu accept (volá visit určenou pro svůj typ) Object structure (traverser) umí procházet strukturu elementů na každém elementu zavolá metodu accept Visitor interface (nebo abstraktní třída), který je implementován konkrétními Visitory definuje metody visit pro všechny typy elementů může využívat i overloading funkcí: Visit( ElementA ); Visit( ElementB ); Visitor1, Visitor2 konkrétní Visitory (implementují rozhraní Visitor) přidávají novou funkcionalitu do existující struktury 8 8

Visitor - procházení struktury Jakým způsobem lze procházet strukturu objektů visitorem? Kde bude kód řídící průchod umístěn: klient více práce pro klienta klient má možnost plně řídit, koho Visitor navštíví struktura rekurzivní volání metody accept na potomky při použití vzoru Composite Iterator nelze použít, pokud objekty nemají společného předka kód na procházení je na jediném místě Visitor elementy struktury nemusí mít společného předka komplexnější algoritmy průchodu strukturou duplikace kódu na procházení v každém Visitoru 9 9

Visitor Visitor visitA(ElementA) visitB(ElementB) Visitor1 Visitor2 AbstractElement accept(Visitor) ElementA ElementB v.visitA(this); v.visitB(this); Object structure (Traverser) Client

Visitor Visitor visitA(ElementA) visitB(ElementB) Visitor1 Visitor2 AbstractElement accept(Visitor) ElementA ElementB v.visitA(this); v.visitB(this); Object structure (Traverser) Client

Visitor Visitor visitA(ElementA) visitB(ElementB) Visitor1 Visitor2 AbstractElement accept(Visitor) ElementA ElementB v.visitA(this); v.visitB(this); Object structure (Traverser) Client

Visitor – implementace 13

Visitor – použití 14

Visitor – implementace s generiky 15

Visitor - vlastnosti Výhody snadno přidám novou operaci na třídě stačí napsat nového Visitora není třeba měnit objekty hierarchie Visitory mohou být implementovány jako zásuvné moduly zapouzdření souvisejících operací Visitor skrývá specifika algoritmu udržování kontextu při průchodu strukturou objektů uvnitř Visitoru Visitor může mít vnitřní stav (data) nemusí se předávat parametrem, nebo v globálních hodnotách vnitřní stav může ovlivnit prováděné operace 16 16

Visitor - vlastnosti Nevýhody přidání nového typu objektu většinou znamená úpravu všech Visitorů nasazení při častěji měnící se struktuře je nevhodné porušení zapouzdření objektů, nad nimiž se operuje Visitor může potřebovat pracovat s interním stavem obtížné zavedení do hotového kódu složitější kód 17 17

Visitor - Shrnutí Používáme když máme stabilní strukturu typů chceme přidávat nezávislé funkce nad typy struktury Není vhodné pokud struktura typů není stabilní přidání nového typu je pracné Výhody kontrola za překladu přehledný kód rozšiřitelnost funkcí nad typy zapouzdření kontextu dané funkce Visitor lze použít k náhradě nativně nepodporovaného Dynamic Double Dispatch v jazycích jako jsou C++, Java

Visitor - použití v praxi Příklady XML parsery (např. SAX) parser.parse(file, handler) startElement() endElement() character() Stromové struktury visitNode visitLeaf Překladače operace nad syntaktickým stromem Java Tree Builder a JJTree – tree builders for JavaCC Generic Modeling Environment ANTLR Python compiler package Ogre3D – pro práci s Renderable 19 19

Visitor – Dispatch Static Dispatch Dispatch Single Dispatch Dynamic Dispatch Double Dispatch Multiple Dispatch

Visitor – Dispatch Static Dispatch Dynamic Dispatch Funkce vybrána pří překladu Možné přetížení funkce -“name mangling” Počet parametrů a jejich statické typy zakódovány do jména Dynamic Dispatch Funkce vybrána až za běhu, podle runtime typu argumentů Single Dispatch C++, C#, Java, Python Funkce vybrána podle jména + runtime typu prvního argumentu První argument často syntakticky odlišen Podpora v jazyce pomocí virtuálních funkcí Double Dispatch Multiple Dispatch Funkce vybrána podle runtime typu většího počtu argumentů C# 4.0 (dynamic) technika Single dispatch spočívá ve výběru volané funkce pomocí jejího jména a typu objektu Single, Double a MultipleDispatch reflektuje počet typů na kterých rozhodnutí závisí (jeden, dva, více) Single Dispatch je v běžných jazycích implementována pomocí virtuálních funkcí Některé jazyky mají dokonce Double-dispatch, v běžných jazycích musí použít speciálních technik Příklad: chceme spočítat obsah průniku dvou obrazců, které držíme za ukazatel na jejich předka. Chceme aby se zavolala správna funkce Intersection, která bere dva parametry typů čtverec a kruh. 21

Visitor – Double dispatch CLOS, Haskell, Dylan, C# 4.0 (dynamic) Jméno funkce + runtime typ prvního argumentu + runtime typ druhého argumentu Příklad použití: výpočet obsahu průniku dvou geometrických obrazců Možná implementace: hrubou silou Type_info + std::map pomocí vzoru Visitor Dvojnásobné využití single dispatch První při volání metody element.accept(Visitor) Podle typu element Druhé při volání visitor.visitElementType(this) uvnitř element.accept(Visitor) Podle typu visitor 2222 22

Visitor – Double dispatch Příklad využití double dispatch mějme grafický editor objekty jsou odvozené od abstraktní třídy Shape chceme, aby se průniky objektů kreslily jinou barvou některé průniky se počítají hůře, některé lépe (obdélník-obdélník, polygon- kružnice) potřebujeme se rozhodnout podle dvou objektů (symetrie) CLOS, Perl, R, - podporují přímo C# - dynamic 2323 23