Budapest University of Technology and Economics Fault-tolerant Systems Research Group Nyílt Fejlesztőrendszerek Plugin fejlesztés – tervezési minták
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 2 Eclipse platform Sok fejlesztő Hatalmas API Sok komponens Rengeteg extension point Rengeteg funkció Hogyan lehet kézben tartani a fejlesztést? −Szabályok! −Tervezési minták!
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 3 Patternek Szoftver újrafelhasználás −Fejlesztési célok ●Gyorsaság ●Minőség ●Elfogadható ár −Újrafelhasználhatóság céljai és lehetőségei ●Gyorsítja a fejlesztést ●Biztonságosabb megoldásokat kínál ●Megkönnyíti a fejlesztők dolgát
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 4 Újrafelhasználás - alapkoncepció
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 5 Újrafelhasználás - evolúció 0. „mindent a kályhától” 1. Copy-paste 2. Függvény könyvtárak 3. Objektumok 4. Osztály könyvtárak (class libraries) 5. Tervezési minták, minta nyelvek 6. Komponens technológiák 7. Keretrendszerek (frameworks), vállalati sablonok
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 6 Minták - alapfogalom Általános minták: −Olyan, sokak által ismert formátumban dokumentált megoldásváz, amelynek alkalmazhatósága könnyen eldönthető egy adott probléma esetén, a végleges megoldás útmutató segítségével könnyen létrehozható. SW minták: −Egymással kapcsolatban álló osztályok és objektumok, amelyek együtt egy adott objektum-orientált tervezési feladat vagy probléma megoldását szolgálják.
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 7 Tervezési minta - adatok 1.Azonosítás 1.Név 2.Kategorizálás 3.Kulcsszavak 4.Ismert alkalmazások 5.Kapcsolódó minták 2.Probléma 1.Motiváció 2.Cél 3.Megoldás 1.Struktúra 2.Résztvevők 3.Együttműködésük 4.Implementáció 5.Kód minták 4.Következmények 1.Előnyök 2.Hátrányok 3.Alkalmazhatóság
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 8 Tervezési minta megadás -példa
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 9 Tervezési minta felhasználás Implementálás fázisai: −Keresés ●Név ●Felhasználási terület ●Kulcsszavak −Kiválasztás ●Előnyök, hátrányok ●Alkalmazhatóság −Készítés – jól bevált ötletek −Felhasználás - implementálás
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 10 Tervezési minták leírása Hagyományos −Szövegszerkesztő + rajzolóprogram −Szabad kéz a kötelező és opcionális elemek terén Törekvések −Egységes formátum, tool támogatás, katalogizálás és visszakereshetőség segítése Nyelvek −PCML (Pattern & Component Markup Lang.) −RAS (Reusable Asset Specification)
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 11 Alapvető tervezési minták
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 12 Factory method Egy objektum létrehozásakor egy interfészt definiálunk, de a leszármazott osztályok eldönthetik, hogy milyen oszályt példányosítanak valójában
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 13 Factory method Cél: −Komplex objektum létrehozása −Egy specifikus implementációból −Azonos konstruktor különböző implementációkhoz Megoldott esetek: −Ha egy t kell példányosítania −Ha egy osztály a gyerekeire akarja hagyni a példányosítandó osztály meghatározását
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 14 Factory method Megoldás: elkerülhető a specifikus osztályok bedrótozása a kódba
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 15 Tervezési minták Még sok, jól bevált van −Általános minták −Vállalati minták −… Ajánlott irodalom: −Gamma et. Al.: Design Patterns
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 16 Tervezési minták - Eclipse A legfontosabb részek mintákat kínálnak És mintákat használnak A kiterjesztések megvalósításához
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 17 Core runtime - IAdaptable Alapprobléma −Az Eclipse kiterjeszthető platform ●Új funkciók, új komponensek jönnek létre −Az új elemek feldolgozásához meg kellene változtatni az API-t? ●Nem lenne elég stabil az interfész −A már meglevő részek működését is befolyásolni kell – hogyan? ●Az alap Java nem segít
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 18 Core runtime - IAdaptable Példa −Az Eclipse elválasztja a megjelenítést a működéstől −Pl. IFile, IFolder, IProject – a fájlrendszer elemeinek absztrakciói – nincs megjelenítés −Lehetne: IUIFile, … ●Nem jó, mert minden új elemhez új UI interfész is kellene (overhead) −Hogyan jelenítsük meg az elemeket?
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 19 Core runtime - IAdaptable Megoldás - IPropertySource −Egy interfész, melyen keresztül lekérdezhetők az elem megjelenítés-specifikus tulajdonságai −Hogyan implementáljuk? ●Közvetlenül… -> nem jó!
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 20 Core runtime - IAdaptable Közvetlen implementáció −Túl sok örökölt interfészhez vezethet, nem jó −Az interfész átvételével változik az API, ami nem jó −Ha pl. az IFile tudna a Properties viewról, akkor beépítettünk egy nem kívánatos GUI – Core linket…
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 21 Core runtime - IAdaptable Konklúzió −Szükség van egy megoldásra, mely lehetővé teszi: ●Egy interfész hozzáadását egy típushoz, anélkül hogy a típust belőle örököltetnénk ●Új viselkedést adjunk meglevő típusokhoz (pl. IFile) Megoldás: Extension Object pattern
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 22 Core runtime - IAdaptable Extension Object pattern −Cél: különböző interfészek támogatása anélkül, hogy a típusunknak örökölnie kellene őket −A kliens egy típuskód alapján kérheti le a megfelelő interfészt −Dinamikusan nőhet az interfészek száma −Futásidejű kötés lehetséges az extension- öknél
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 23 Core runtime - IAdaptable Extension Object pattern −Kérdések ●Objektum vagy osztály szintű extension kezelés -> az Eclipse osztályt szintűt definiál Új viselkedés megadható, de új tulajdonságok nem! ●Hogy adjuk meg a lehetséges extension-öket? -> 2 megoldás A kiterjeszthető osztály maga adja meg (programozott) Külső kiterjesztés esetén a Platform osztály segíségével regisztrálunk egy Adapter Factory-t az osztályhoz.
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 24 Core runtime - IAdaptable Példa – bedrótozott kiterjesztés
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 25 Core runtime - IAdaptable Példa – bedrótozott kiterjesztés Interfészt ad meg a kliens
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 26 Core runtime - IAdaptable Példa – bedrótozott kiterjesztés Az implementáló osztályt példányosítjuk
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 27 Core runtime - IAdaptable Példa – utólagos kiegészítés Az utólag elkészült extension osztály
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 28 Core runtime - IAdaptable Példa – utólagos kiegészítés Az adapter factory, mely tartalmaz egy listát az extension-ökről
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 29 Core runtime - IAdaptable Példa – utólagos kiegészítés Az adapter factory getAdapter metódusa. Az adott objektumhoz és adapterhez tartozó extension példányt kell visszaadni.
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 30 Core runtime - IAdaptable Példa – utólagos kiegészítés Regisztrálni kell az AdapterFactory- t. Ezt a plugin start metódusában vagy statikus inicializáló blokkjában érdemes megtenni.
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 31 Core runtime - IAdaptable Példa – utólagos kiegészítés – összefoglaló modell
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 32 Core runtime - IAdaptable Elemek −IAdaptable – a kiegészítendő osztálynak implementálni kell −AdapterFactory – utólagos bővétményeket tárol és példányosít
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 33 Erőforrások Erőforrások −Az Eclipse erősen fájlrendszer alapú ●Nincs köztes repository ●A fájlt vagy közvetlenül (kívülről) vagy az Eclipse- ből módosíthatjuk −Erőforrások ●Létrejönnek/módosulnak/törlődnek ●Nem akarjuk az állapotot több helyen tárolni Állapotmentes referencia kell Eclipse: csak Handle-t kap a kliens
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 34 Erőforrások Handle −Két minta összekötése: Proxy és Bridge −Proxy: helyettes létrehozása egy objektum számára, hogy kontrolláljuk a hozzáférést ●Hozzáférés kezelés -> érvénytelen állapot kialakulásának elkerülése −Bridge: leválasztja az interfészt és az implementációt, hogy függetlenül módosulhassanak ●Az interfész és implementáció erős elválasztása
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 35 Erőforrások Alkalmazás a fájlrendszerre: −Egy handle, ami kulcs a fájlhoz −Egy info objektum, mely a fájl állapotát tárolja. Csak egy info implementáció van minden handle-hez. −Handle: IFile, IFolder, IProject, IWorkspaceRoot ●Nem implementálandóak!
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 36 Erőforrások Példa: IFile Csak az elérési utat és a workspace-t ismeri
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 37 Erőforrások Handle −Érték típusok, az egyenlőséget qz equals() metódussal vizsgáljuk ●Hash-elhetőek ●Több handle mutathat ugyanarra az erőforrásra −Definiálhatják az erőforrás viselkedését, de az állapotát nem tárolhatják −Egy handle mutathat nem létező erőforrásra −Néhány művelet csak a handle-ben levő információkra alapoz, ezek nem létező erőforrás esetén is sikeresek
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 38 Erőforrások Handle −Ha egy műveletnek szüksége van az erőforrásra, CoreException-t dob, ha az nem létezik −Létezés tesztelése: exists() −A handle egy szülő handle-ből keletkezik −A handle használható az erőforrás létrehozására is
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 39 Erőforrások Handle −Mivel a handle állapot nélküli, biztosan nem tárol érvénytelen állapotot a kliensben.
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 40 Erőforrások ResourceInfo −Az elemek állapotát tárolja −Leszármazott osztályok (pl. ProjectInfo) a speciális állapot tárolására −Fa struktúrában tárolódik a teljes workspace információja a memóriában −->”element tree” −Az info visszaadása a fa bejárásával történik a handle-ben levő path segítségével ●Lemezművelet nélkül megtalálhatjuk a keresett elemet
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 41 Workspace – composite pattern Az erőforrás fa a composite mintát követi −A composite minta lényege: Fastruktúrába szervezni az elemeket, a köztük levő rész/egész viszony felhasználásával. A fa gyökere: IWorkspaceRoot −ResourcePlugin.getWorkspace()
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 42 Workspace – composite pattern Az IResource közös ős A getParent() művelet csak a handle-kre alapozva teszi lehetővé a navigációt
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 43 Workspace – composite pattern Közös ős az összetett objektumok számára A gyerekek bejárhatóak a members() hívással De van jobb megoldás…
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 44 Erőforrás bejárás - Visitor A kódolás elkerülésére alkalmazzuk Visitor: Egy műveletet valósít meg, melyet egy objektum struktúrán akarunk megvalósítani. A fa bejárást nem kell megvalósítani, csak egyszer
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 45 Erőforrás bejárás - Visitor Struktúra Az accept() metódus valósítja meg a bejárást, és visszahívja a visitor-t minden elemre Ha a visit() true-val tér vissza, akkor az elem gyerekeit is be kell járni
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 46 Erőforrásváltozások követése - Observer Az erőforrások változhatnak −Az Eclipse-en belüli változtatások miatt −A fájlrendszerhez való újraszinkronizálás miatt Az állapotváltozásokat követni kell −A klienseknek a hatékony állapot-frissítések miatt szükségük lehet rá −A Workspace-ben kel regisztrálni
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 47 Erőforrásváltozások követése - Observer Tárolja a Listenereket
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 48 Erőforrásváltozások követése - Observer A listener megkapja az értesítést
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 49 Erőforrásváltozások követése - Observer Kétféle módosítási minta −Push – a listener részletes információkat kap a változásokról −Pull – a listenernek kell lekérdezni az új állapotot −Eclipse: ResourceDelta ●Az erőforrás-fa állapot-változását írja le ●Önmaga is fa
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 50 Erőforrásváltozások követése - Observer A resourceDelta az egyszeres és többszörös változásokat ugyanazzal a struktúrával írja le Egyszerűen be lehet járni a delta tree-t Mivel az erőforrások csak handle-k, törölt elemekre is hivatkozhatnak
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 51 Batch változtatások Minden eseményvezérelt rendszerben veszélyes a túl sok esemény érkezése Lehetőség van atomi kompozit akciók létrehozására −IWorkspaceRunnable −Atomi futtatás −Csak egy értesítés keletkezik, a futás végén
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 52 Batch változtatások - példa Az „execute around method” minta alapján A run() metódus az execute-around metódus
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 53 Erőforrások->Java elemek - Adapter Az erőforrás-struktúra −Fájlok és mappák A Java-centrikus nézet −A Java modell struktúrája – osztályok, csomagok, … A Java nézetben más API-val akar dolgozni a felhasználó −Tipikus eset az adapter mintának
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 54 Erőforrások->Java elemek - Adapter IJavaElement.getCorrespondingResource() – a mögöttes erőforrás – nem mindig van! −Vannak Java elemek, melyek a workspace-en kívül vannak, nincs erőforrás megfelelőjük −Java elemek, melyek metódusokat reprezentálnak
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 55 Erőforrások->Java elemek - Adapter Az IJavaElement lehetővé teszi a mögöttes erőforrások elérését Szükség lehet a másik irányra is! −Facade: JavaCore – factory metódusok erőforrásokból Java elem létrehozására -> ezek csak handle-k
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 56 Java elemek – (Virtuális) proxy Hasonló struktúra, mint az erőforrások esetén
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 57 A Java modell bejárása Nincs olyan Visitor megoldás, mint az erőforrásoknál −A Java fa lusta módszerrel épül fel −Ezért egy teljes bejárás költséges lenne ●A fordítási egységeket értelmezni kell… −Inkább egyedi keresést alkalmazzunk
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 58 A Java modell – változás figyelés Nagyon hasonló az erőforrásoknál alkalmazotthoz
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 59 A Java modell – változás figyelés Az erőforrás deltákkal ellentétben nem mindig a gyökérből indul A delta csak az eseménykezelés alatt érvényes (erőforrás-felszabadítás) ExecuteAround: JavaCore.run()
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 60 A Java modell – változás figyelés A típushierarchia nem része a fának Ezért külön változás-figyelés van hozzá
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 61 Eredmények gyűjtése - Builder A Java Core több olyan elemet tartalmaz, melyek működése után egy eredménylista keletkezik −A search egy találati listát generál −A content assist a lehetséges folytatásokat adja vissza −A Java fordító hibaüzeneteket generál A lista generálásának és megjelenítésének elválasztását meg kell oldani.
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 62 Eredmények gyűjtése - Builder Builder: Válasszuk el egy komplex objektum létrehozását és ábrázolását, hogy ugyanaz a konstruktor más-más reprezentációhoz vezethessen. Hasonló a Factory-hoz. A Builder komponensek neve Requestor- ra vagy Collector-ra végződik (Eclipse konvenció)
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 63 Eredmények gyűjtése – Builder Példa: Search A SearchEngine végzi a keresést, és értesíti az IJavaSearchResultCollector-t
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 64 Eredmények gyűjtése – Builder Példa: Search Gyűjti a találatokat. Az aboutToStart() a kezdést jelzi, az accept az egyes találatokat.
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 65 Eredmények gyűjtése – Builder Példa: Content Assist Lehetséges folytatásokat keres
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 66 Eredmények gyűjtése – Builder Példa: Content Assist Az eredményeket típus szerint jelenti
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 67 UI Workbench – Lusta betöltés A workbench számos extension point-ot definiál Fontos a lazy load tulajdonság megteremtése, hogy ne kelljen minden extension-t betölteni Példa: akciók Csak a deklaráció töltődik be (plugin.xml) −Vrtuális proxy minta
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 68 Eredmények gyűjtése – Builder Példa: Content Assist Maga az Action a plugin.xml információi alapján készül. A run() kivételével mindent tud
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 69 Eredmények gyűjtése – Builder Példa: Content Assist Az implementáció csak a run() hívásakor töltődik be
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 70 UI Workbench – Állapotmegőrzés User continuity rule: „Preserve the user interface state across sessions.” Az állapot-tárolással kapcsolatos követelmények −Robosztus, könnyen bővíthető −Komplex struktúrákat is támogatnia kell −Tetszőleges objektumot el kell tudni menteni és visszatölteni
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 71 UI Workbench – Állapotmegőrzés Memento: Az integritás megsértése nélkül tegyük lehetővé az objektum állapotának kimentését, amiből később az állapot visszaállítható. Az Eclipse XML-alapú formátumot használ
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 72 UI Workbench – Editor és View visszaállítás Sok editor és view lehet aktív De csak kevés látszik egyszerre Visszaállításkor nem kell mindet betölteni −Mert ez sok plugin aktiválásához vezetne Proxy-kat kell használni Kooperációt igényel: Ha le akarjuk kérni az editorok listáját, csak a proxy-kat kérjük le.
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 73 UI Workbench – Editor és View visszaállítás
Budapest University of Technology and Economics Fault-tolerant Systems Research Group 74 Példa: ISafeRunnable for (Iterator all=getListeners().iterator();all.hasNext()) { IMyExstension ext = (IMyExtension)all.next(); ISafeRunnable runnable = new ISAfeRunnable() { public void handleException(Throwable exception){ all.remove(); } public void run() throws Exception { ext.execute(); //hívom az extensiont } }; Platform.run(runnable); } Végigmegyünk az extension-ökön