Ennek a tanulmánynak a célja, hogy definiáljon egy módszert, amivel leírható egy objektum-orientált technológiával készült objektum hierarchia. Maga a hierarchia az ún. domain-modellt implementálja, a megoldandó feladatot modellező objektumokból áll, és nem tartalmaz egyéb, a feladathoz nem tartozó részeket.
Az aspektus-orientált programozás jelentősége az, hogy a Domain-modell, és némi egyéb információ alapján generáljuk a programnak azon részeit, amik a programozás terén ismétlődő implementációs problémák, a lényegi feladathoz nem tartoznak, és általában meglehetősen gépies munkát igényel az implementálásuk. Ezeket a részeket ezentúl "aspektusoknak" nevezzük. Az aspektus-orientáltság előnyei között az áttekinthetőbb, könnyebben karbantartható, és tömörebb forráskódot emelném ki.
A továbbiakban a következő aspektusokkal foglalkozunk:
Ezeknek a részeknek (aspektusoknak) megírásához szükséges többletinformációt a modell leírásába beszúrva egy alkalmas eszközzel ezek automatikusan generálhatóak lesznek. Az automatikus generáláshoz használt technológia (a "transzformáció") ennek a leírásnak nem része.
A továbbiak az XML (Extensible Markup Language) 1.0-as és az UML (Universal Modeling Language) 1.3-as verziójú szabványok alapján íródnak. Az UML szabványnak csak az objektum-típusok leírására vonatkozó részét használom, mivel a modellen belül lezajló folyamatok (pl. üzenetterjedés) az aspektusok számára nem lényegesek.
Az alábbiakban a hierarchiát leíró nyelv aspektusok nélküli változata következik, a további fejezetekben ezt fogjuk kiegészíteni a szükséges többletinformációkkal. Ez a módszer azért szerencsés, mert mindegyik implementálandó aspektus követi az objektum-hierarchiát (elképzelhető lenne olyan aspektus is, ami nem követ semmilyen a domain modellre jellemző hierarchiát, példának a kivételkezelést lehetne említeni.)
Feltételezem az XML (vagy SGML) alapfokú ismeretét a továbbiakban. Álljon itt egy rövid összefoglalás az általunk használt XML struktúrákról:
| Szintaxis | <CLASS> ... </CLASS> |
|---|---|
| Attribútumok |
|
| Tartalom | Nulla. vagy több ATTRIBUTE vagy METHOD tag |
| Helye | Dokumentum törzs |
A CLASS elem definiál egy osztályt. A kötelező NAME mező tartalmazza az osztály nevét. Ha az osztálynak van őse, akkor azt az ANCESTOR attribútummal adható meg. Az ős megadása nem kötelező, ha az ősnek nincsenek számunkra lényeges változói vagy metódusai. Ha vannak, akkor az őst is definiálni kell egy CLASS elemmel. Ha a CLASS-nak vannak leszármazott típusai, azokat kötelező egy-egy CLASS tag-gel definiálni.
A COMMENT mező tartalmát az aspektusokat implementáló program nem használja, ezt csak a hierarchiát emberek számára megjelenítő program számára kellhet.
| Szintaxis | <METHOD> ... </METHOD> |
|---|---|
| Attribútumok |
|
| Tartalom | Nulla, vagy több PARAM; Nulla vagy egy RETURN |
| Helye | CLASS |
A METHOD elem definiálja egy osztály egy metódusát. Nem szükséges az osztály összes metódusát definiálni, de ha egy metódus valamelyik aspektusunk szempontjából lényeges (pl. távolról elérhetővé akarjuk tenni), akkor kell hozzá egy METHOD tag.
A metódus paramétereit és visszatérési értékét megfelelő tagekkel definiálni kell. A paramétereket a megfelelő sorrendben kell megadni. A RETURN tag bárhol lehet, de célszerű a legvégére tenni. Ha nincs RETURN tag, az azt jelenti, hogy a metódus visszatérési értéke void.
Amennyiben az osztálynak több metódusa van azonos névvel, mindet külön definiálni kell, azonos NAME tag-gel.
| Szintaxis | <PARAM/> |
|---|---|
| Attribútumok |
|
| Tartalom | Üres |
| Helye | METHOD |
A PARAM tag-ek egy metódus paramétereit határozzák meg. Minden paraméterhez kell egy ilyen tag. A tag-ek sorrendje lényeges!
| Szintaxis | <RETURN/> |
|---|---|
| Attribútumok |
|
| Tartalom | Üres |
| Helye | METHOD |
A metódus visszatérési értéke. Ha ez a tag hiányzik, az azt jelenti, hogy a metódus visszatérési értéke void.
| Szintaxis | <ATTRIBUTE/> |
|---|---|
| Attribútumok |
|
| Tartalom | Üres |
| Helye | CLASS |
Tekintsük az alábbi objektum hierarchiát:
| |||||||||||||
| |||||||||||||
|
entries ![]() account
|
|
transaction ![]() 2 from,to
|
|
Ennek a hierarchiának az Account osztályának a transzformált változata a következőképpen néz ki:
<CLASS NAME="Account" COMMENT="Egy számla, bejegyzésekkel">
<ATTRIBUTE NAME="accountNumber" TYPE="int"/>
<ATTRIBUTE NAME="balance" TYPE="int"/>
<ATTRIBUTE NAME="entries" TYPE="Entry[]"/>
<METHOD NAME="balance">
<RETURN TYPE="int"/>
</METHOD>
<METHOD NAME="numberOfEntries">
<RETURN TYPE="int"/>
</METHOD>
<METHOD NAME="getEntryByIndex">
<PARAM TYPE="int"/>
<RETURN TYPE="Entry"/>
</METHOD>
</CLASS>
Mint látható, az átalakítás meglehetősen egyszerű, az osztályt leíró doboz tartalmának minden eleme megfeleltethető egy tag-nek.
Az elosztottság lehetővé teszi távoli objektumok használatát, eljárásainak hívását, paraméterek átadását. Ehhez szükség lehet az objektumok teljes vagy részleges másolására, vagy referencia szerinti átadására.
Az aspektus leírásához szükséges információk a következők:
A nyelvünk ezen igények kielégítésére a következő tagekkel bővül:
| CLASS |
|
|---|---|
| METHOD |
|
| PARAM |
|
| RETURN |
|
Ezen többletinformációk elegendőek az Aspektus Weavernek az szerver és kliensoldali domain modell forrásán eszközölendő változtatások automatikus generálására. Különböző elosztottsági technológiát használó weaverek (pl. RMI alapú weaver, CORBA alapú weaver) eltérő lépéseket tesznek, és az általuk generált applikáció más lesz, azonban a forrás (a domain modell forrása, és az objektum modell leírása) azonos minden esetben. Ez lehetővé teszi az elosztott technológia lecserélését egyéb költséges változtatások nélkül.
A perzisztencia lényege az objektum hierarchia egy részének adatbázisba kimentése, illetve onnan visszatöltése az objektumok számára transzparens módon, vagyis az objektumok ne "vegyék észre", hogy őket kimentették, kiléptek a programból, kikapcsolták a gépet, és csak másnapi visszatöltés után folytatták a futtatásukat.
A flexibilitás megköveteli, hogy többféle modellhez kapcsolható legyen az aspektusunk. Az kétféle modell, amit megkülönböztetünk:
A két módszer kombinálható is. A mentés típusa is többféle lehet, az adatok tárolására szolgálhat adatbázis, vagy flat file, ez a használt weavertől függ.
A perzisztencia leírásához a következő tagekkel egészítjük ki a domain modell leírását:
| CLASS |
|
|---|---|
| ATTRIBUTE |
|
| METHOD |
|
A perzisztencia leírása meglehetősen egyszerű, kivitelezése viszont munkaigényes. Az összes objektum referenciát le kell cserélni egy objektum azonosítóra, ami perzisztenssé tehető. A perzisztens attribútumok megváltozását követni kell, hogy tudjuk, melyik objektum változott meg. Az objektum azonosítók feloldására szükséges egy objektum manager implementálása is.
A domain modell nem tartalmaz felhasználói felületet. A modell logikája nem feltétlenül egyeztethető össze egy jól tervezett felhasználói felület logikájával. Szükség van tehát egy transzformációra, ami a domain modell objektum hierarchiájából egy másikat csinál.
A transzformációra azért is szükség lehet, mert a teljes információs rendszert egy domain modell mellett több applikációs program szolgálja ki. Az applikációs programok tipikusan valamilyen grafikus felülettel rendelkező "thin clientek", hálózaton keresztül csatlakozva a szerverre, ahol a kiszolgáló program fut.
Ezt figyelembe véve kijelenthetjük, hogy a modern vállalati információs rendszer architektúrája a következőképpen néz ki;
| Szintaxis | <FACADE> ... </FACADE> |
|---|---|
| Attribútumok |
|
| Tartalom | Egy, vagy több PROPERTY tag |
| Helye | Dokumenum törzs |
A FACADE az objektum hierarchia egy részének transzformált képe. Az alapját mindig a hierarchia egy objektuma képezi, bár a működése kiterjedhet a többi objektumra is, amik ezzel valamilyen kapcsolatban állnak. A FACADE attribútumait (amik nem valódi változók) PROPERTY-nek nevezzük.
| Szintaxis | <PROPERTY> ... </PROPERTY> |
|---|---|
| Attribútumok |
|
| Tartalom | RETRIEVAL, LEGALVALUES, UPDATE, VALIDATION és DEFAULT tag. Ezek közül egyedül a RETRIEVAL kötelező. |
| Helye | FACADE tag |
A FACADE a felhasználói felület felé egy sor PROPERTY-t szolgáltat. A PROPERTY-k úgy viselkednek, mint a valódi változók, amennyiben a manipulációs funkcióik (kiolvasás, írás, stb,) megegyeznek a változóknál megszokottallak. A különbség az, hogy a FACADE-nek nincsenek valódi attribútumai, és minden PROPERTY olvasása, írása, stb. a domain modell manipulációjára képeződik le.
A PROPERTY belsejében egy kötelező RETRIEVAL tag van, ami az értékét kiolvassa. A többi íráshoz szükséges, és mind opcionális.
| Szintaxis | <RETRIEVAL> ... </RETRIEVAL> |
|---|---|
| Attribútumok | - |
| Tartalom | Java nyelvű programkód, ami lekérdezi az adott property értékét, és visszatér azzal. |
| Helye | PROPERTY tag |
A tag belsejében szereplő java kódrészlet felelős a property kiolvasásáért.
| Szintaxis | <UPDATE> ... </UPDATE> |
|---|---|
| Attribútumok | - |
| Tartalom | Java nyelvű programkód, ami elvégzi a domain objektumokon a property megváltozásának megfelelő változtatásokat. |
| Helye | PROPERTY tag |
A tag belsejében szereplő java kódrészlet felelős a property írásáért. Ellenőrzésre definiálható a VALIDATION tag.
| Szintaxis | <LEGALVALUES> ... </LEGALVALUES> |
|---|---|
| Attribútumok | - |
| Tartalom | Java nyelvű programkód, ami visszatér az adott property lehetséges értékeit tartalmazó halmazzal. |
| Helye | PROPERTY tag |
A tag belsejében levő java kódrészlet visszatér a property értékkészletét tartalmazó halmazzal.
| Szintaxis | <VALIDATION> ... </VALIDATION> |
|---|---|
| Attribútumok | - |
| Tartalom | Java nyelvű programkód, ellenőrzi, hogy az adott propertynek érvényes érték lett-e megadva. |
| Helye | PROPERTY tag |
Ellenőrzi, hogy egy adott érték elfogadható a property értékének.
| Szintaxis | <DEFAULT> ... </DEFAULT> |
|---|---|
| Attribútumok | - |
| Tartalom | Java nyelvű programkód, ami visszatér az adott propertynek egy alapértelmezett értéket ad, új FACADE objektum létrehozásakor. |
| Helye | PROPERTY tag |
Új objektum definiálásakor a property kezdeti értékét beállító kód.
Elképzelésem szerint a domain oldali applikációs homlokzat ilyen definiálása után egy thin client felhasználói interface implementálása a képernyők ergonómiai megtervezésében merül ki, mert a facade osztályok az információt pontosan olyan formában szolgáltatják, ahogy az a UI elemeinek kell.
| Szintaxis | <CLASS> ... </CLASS> |
|---|---|
| Attribútumok |
|
| Tartalom | Nulla. vagy több ATTRIBUTE vagy METHOD tag. REMOTE metódus esetén opcionális REMOTENAME és REMOTEPORT. PERSISTENCE esetén opcionális DBNAME tag |
| Helye | Dokumentum törzs |
| Szintaxis | <METHOD> ... </METHOD> |
|---|---|
| Attribútumok |
|
| Tartalom | Nulla, vagy több PARAM; Nulla vagy egy RETURN |
| Helye | CLASS |
| Szintaxis | <PARAM/> |
|---|---|
| Attribútumok |
|
| Tartalom | Üres |
| Helye | METHOD |
| Szintaxis | <RETURN/> |
|---|---|
| Attribútumok |
|
| Tartalom | Üres |
| Helye | METHOD |
| Szintaxis | <ATTRIBUTE/> |
|---|---|
| Attribútumok |
|
| Tartalom | Üres |
| Helye | CLASS |
| Szintaxis | <REMOTENAME> ... </REMOTENAME> |
|---|---|
| Attribútumok | - |
| Tartalom | Java kód |
| Helye | CLASS |
| Szintaxis | <REMOTEPORT> ... </REMOTEPORT> |
|---|---|
| Attribútumok | - |
| Tartalom | Java kód |
| Helye | CLASS |
| Szintaxis | <DBNAME> ... </DBNAME> |
|---|---|
| Attribútumok | - |
| Tartalom | Java kód |
| Helye | CLASS |
| Szintaxis | <FACADE> ... </FACADE> |
|---|---|
| Attribútumok |
|
| Tartalom | Egy, vagy több PROPERTY tag |
| Helye | Dokumenum törzs |
| Szintaxis | <PROPERTY> ... </PROPERTY> |
|---|---|
| Attribútumok |
|
| Tartalom | RETRIEVAL, LEGALVALUES, UPDATE, VALIDATION és DEFAULT tag. Ezek közül egyedül a RETRIEVAL kötelező. |
| Helye | FACADE tag |
| Szintaxis | <RETRIEVAL> ... </RETRIEVAL> |
|---|---|
| Attribútumok | - |
| Tartalom | Java kód |
| Helye | PROPERTY tag |
| Szintaxis | <UPDATE> ... </UPDATE> |
|---|---|
| Attribútumok | - |
| Tartalom | Java kód |
| Helye | PROPERTY tag |
| Szintaxis | <LEGALVALUES> ... </LEGALVALUES> |
|---|---|
| Attribútumok | - |
| Tartalom | Java kód |
| Helye | PROPERTY tag |
| Szintaxis | <VALIDATION> ... </VALIDATION> |
|---|---|
| Attribútumok | - |
| Tartalom | Java kód |
| Helye | PROPERTY tag |
| Szintaxis | <DEFAULT> ... </DEFAULT> |
|---|---|
| Attribútumok | - |
| Tartalom | Java kód |
| Helye | PROPERTY tag |
Az aspektus-orientált programozás a szoftverfejlesztés új paradigmája. Mint elmélet és technológia ott tart, ahol az objektum-orientáltság húsz évvel ezelőtt: Lehet látni, hogy van értelme, vannak alkalmazási példák, de az ipar még nem vette át az elvet, és még nincsenek kereskedelemi aspektus-orientált keretrendszerek.
A jövőben valószínűleg a jelenleg kapható objektum-orientált class librarykhoz hasonló aspektus-orientált keretrendszerek lesznek, amelyek a programfejlesztést segítik úgy, hogy a "favágást" leveszik a programfejlesztők válláról. Így a programfejlesztőknek a teljes szoftverből elegendő a domainre (conceptal schema) koncentrálni, és egy viszonylag egyszerűen használható eszközzel ehhez hozzáillesztik a teljes, háromszintű, aspektusokkal kiegészített szoftvert az aspektus-orientált keretrendszer állítja elő.
Eme önálló labor célja egy ilyen keretrendszer prototípusának a megtervezése. A 6. fejezetben látható ábrán látható architektúrát generáljuk a domain modell, és a 2-6. fejezetekben definiált leíró nyelv alapján. A következő félév feladata lesz a weaver elkészítése. A weaver részei lesznek: