Keresés
Hírlevél
 
Kiemelt témák
»Hogy viszonyul ehhez a család?
»Legjobb metodika emberi relációk tárolására
»A programozó hibája, hogy törik a programját?
»Jogosultság kezelés mezőszinten
Állás/munka
»Wordpress szakértőt keresünk
»Kamu álláshirdetők listája
»Front-end fejlesztő / Sitebuilder
»DataStore Developer
»PHP programozó, webfejlesztő munkát keres
» több téma
Tudástár
?Input mezőből visszakapott adat probléma
?HTML-ben a Flash átméretezés torzul
Eredeti mezőnevek lekérdezése
Oldalon keresés 8x írja ki az eredményt
?XML-ből sok szövegmező
TinyMCE és az ékezetek
?Rengeteg hasonló kép betöltése gyorsan (PHP)
Ékezetes kar. nem minden táblában jól
?Shelltreeview gond
Grafikon rajzolás probléma
?Onclick= php függvény
?Egyenes megrajzolása
?Access-ből adott xml fájl kinyerése
Listázás időpont szerint
Exportálás változó könyvtárba
» több téma
Társalgó
»A programozásból jól meg lehet élni?
»MFC tanulás
»Könyvet adok-veszek
»Hogy viszonyul ehhez a család?
»Nintendo wii
»Letölthető az új Rad Studio XE és Delphi XE
»Weblap véleményezés
»Játékmotor elmélet
»Informatikai bulvárlap
»Delphi-ről C++-ra váltás
» több téma
Cikkek
»Bevezetés a genetikus algoritmusokba
»Bevezetés az adatkezelésbe
»Bevezetés a CSS alapjaiba
»GroupWise-kiegészítők készítése Python-ban
»Aspektus-orientált programozás
» több cikk
ASP  |  C#  |  C++  |  CSS  |  Delphi  |  Flash  |  HTML  |  Java  |  JavaScript  |  Pascal  |  Perl  |  PHP  |  Python  |  Visual Basic  |  Visual C++  |    »    

Cikkek

»

Egyéb

»

Programozás-elmélet

»

Aspektus-orientált programozás

szerző: boj, idő: 2005.03.10., értékelés: 4,5 (24 szavazat)
  Betűméret növelése Betűméret csökkentése Kapcsolódó fórum Felvétel kedvencekhez Küldés emailben Nyomtatható verzió
Az AOP elemei

Talán felvetődött az olvasóban - ha webes fejlesztéssel foglalkozik - hogy a feladatok előtti és utáni tevékenységek koordinálása igen hasonló ahhoz, amikor egy webszerverre csupán adatot meghatározott helye(ke)n keresztül lehet küldeni. Vagy például .NET esetén az objektumoknak saját kontextus adása után az odaérkező üzenetek elkapása is értelmezhető egyfajta aspektus-kezelésként. (Sajnos pointcut és inter-type declaration nélkül mégiscsak egyfajtaként...)

Valóban, az aspektus orientál programozás - sarkított - alapötlete az üzenetek elfogása még a célhoz érésük előtt. Hiszen ha tudom, éppen milyen aspektusban vagyok, akkor meg tudom mondani, ez az üzenet mit jelent számomra. S bár ennél jóval többről szól az AOP, de megértésének az alapja lehet ez.

A módszer néhány alapvető fogalmat használ. Tekintsük át ezeket a korábbi példa ismeretében. A könnyebb átláthatóság kedvéért ismét beszúrom a példaaspektust:

public aspect logAspect {

    pointcut greeting():
        execution(* FontosOsztaly.fontos*(..));

    before() : greeting() {
        System.out.println("[A fontos metodus elindul]");
    }

    after() : greeting() {
        System.out.println("[A fontos metodus lefutott]");
    }
   
}


Join point (belépési pont)

A join point az aspektus orientált programozás - AspectJ-s megközelítésének mindenképp - központi eleme. Join point kisebb megszorításokkal a program bármely azonosítható futási pontja lehet: egy metódus hívása, egy változó értékadása etc.

Például, ha meghívjuk a Fontos osztály fontosMetodus-át, akkor a kimenetre szöveget írunk. Általánosan fogalmazva: Ha valami történik, akkor valami lefut. Ennek különböző fajtáit foghatjuk meg a join pointokkal.

Természetesen nem minden ilyen pont érdekes, csupán kizárólag azok, melyeket valamilyen környezetbe - mint aspektusba - szeretnénk helyezni. Például egy inicializáló értékadás a konstruktorban érdektelen lehet, míg ha az egy fontos banki művelet része, akkor minden bizonnyal a tranzakció és a biztonság aspektusából máris érdekessé válik.


Pointcut

A pointcut-ok tartalmazzák és fogják egybe az alkalmazás join pointjait. őket definiáljuk, hiszen a join pointok implicite a valós osztályokban vannak.

A pointcut lényegében filterként működik: adott minta szerint szűri ki azokat a join pointokat, amelyekre igaz vagy hamis az állítás. (Ezt a igaz/hamis értéket az advice-oknál - a teendőknél - fogjuk használni.)

Például a

execution (void Fontos.setEgyenleg(..)) && this(Kliens)

pointcut minden olyan hívást el fog kapni, ami a Fontos osztály setEgyenleg metódusához intéződött egy Kliens osztályú objektumtól tetszőleges paraméterrel.

Pointcutokat számos más módon és más műveletre is meghatározhatunk. Ezen lehetőségekről érdemes tájékozódni az AspectJ dokumentációjából, mert komoly különbségek adódnak a látszatra akár hasonló megoldásokból is (call() versus execution()).


Advice (tanács, itt: teendő)

Az advice határozza meg, mi történjen az adott join pointnál (vagy join pointok csoportjánál, amit pointcuttal határozuk meg). Három módon avatkozhatunk a futásba:

  • A before advice a join-point elött,
  • Az after advice a join-point futása után,
  • Az around advice speciális advice pedig a futás közben fut, lényegében kiváltva a join pointot.

Az alábbi kódrészletben a before advice egy 'A fontos metódus elindult' üzenetet fog küldeni a metódus futása elött.

before() : greeting() {
    System.out.println("[A fontos metodus elindul]");
}


Inter-type declaration

Az osztályok életébe való statikus beavatkozás. Segítségével az aspektus által érintett osztályoknak új adattagokat és metódusokat vezethetünk be.

Az alábbi aspektusban két osztály számára deklarálunk tagokat illetve biztosítunk egy metódust azok összekapcsolására. (Példa: AOSD.NET)

class Foo { ... } // izék
class Bar { ... } // bigyók

aspect Linking { //kapcsolatot tart fent az izék
                   és a bigyók között


   private Set Foo.bars = new Hashset();
   private Set Bar.foos = new Hashset();

   static public link(Foo f, Bar b) {
     f.bars.add(b);
     b.foos.add(f);
   }
}


Aspect (aspektus, nézőpont)

Az aspektus az AspectJ-nek az, ami a Javanak az osztály - szintaktikájában és szerkezetében nagyban igazodik is hozzá. Szintén tartalmazhat adattagokat és metódusokat, lehet abstract - de egyben magába foglalj pointcutokat, adivceokat és.további elemeket.

Az AOP formális meghatározását ezen keretek között nem tartanám fontosnak (az Irodalom részben több hivatkozás is mutat rá), de felhívnám a figyelmet arra a közkeletű tévedésre, miszerint az üzenetek elkapása (interception) és az attribútumok együttes használata az aspektus orientált programozás. Ez így nem áll meg, mint az akár csak a fenti felsorolásból is látható. Hasonlóan, hogy attól sem lesz programunk objektum orienált, ha minden programblokkot a class szóval kezdünk.

Az alapvető összetevőket már ismerjük. Az elv ami mindezt összefogja, vázlatosan a következő:

  • Azonosítjuk a lényegi feladatokat (például egy átutalás)
  • Azonosítjuk azokat a feladatokat, amik ezeken a fő feladatokat 'átszelik', metszik. (Például az authentikáció több osztályban is szerepelhet)
  • Megvalósítjuk - osztályok segítségével - a feladatokat
  • Az aspektusokkal meghatározzuk, ezek milyen viszonyban vannak egymással.
  • A weaver összeállítja a teljes rendszert.

A folyamatot a következőképpen szemléltethetjük:


3. ábra

Érdemes meggondolni azt, hogy az utolsó lépés a hagyományos OO módszerekkel nem így nézne ki! Ekkor ugyanis a sötétkék négyzetet piros és sárga téglatestek szabdalnák a keveredő kódok, feladatok miatt.

Fontos tudni, hogy az AspectJ fordítás után tökéletesen szabályos Java kódot állít elő, ezért az bárhol futtatható, ahol JRE rendelkezésre áll.

Küldés emailben Küldés emailben Nyomtatható verzió Nyomtatható verzió
Belépés
E-mail cím:
Jelszó:

RSS források
-Hírek
-Cikkek
-Fórumok
-Állás/munka
Top pontgyűjtők
»Micu1.030
»Interlock280
»mezofi150
»Pitta_100
»Frostech0100
»szbzs.2100
»Hack100
»Riha60
»Akhiles50
»mrchandra50
Top wikieditorok
»Sting
»Doi
»FlamingClaw
»Argathron
»Csaboka2
»Vodka
»Joexy
»Ivn
»Balucinho
»Kelemzol
» ugrás a wikire
A nap kifejezései
»Algoritmus
»Hogyan kezdjem el
»Perl
» ugrás a wikire
Hírek
»Megérkezett a PostgreSQL 9.0 kiadásra jelölt változata
»Letölthető az új Rad Studio XE és Delphi XE
»Function-X digitális művészeti találkozó és demoscene party
»Webfejlesztőknek szóló közösségi oldalt indított a Microsoft
»Letölthető a hardvergyorsított Chrome 7 első fejlesztői kiadása
» több hír
PC Fórum hírek
»Itt az első kép az AMD nyolcmagos processzoráról
»"Szuperdizájnos" érintő-egeret mutatott be a Microsoft
»Szabadalmaztatta a számítógép kikapcsolását a Microsoft
»Vírusriadót váltott ki a webezőknél a Google
»Ingyen iWiW-ezhetnek mobiljaikról a T-Mobile-osok
»Automatikusan kiválogatja legfontosabb leveleink a Google
»OOo4Kids - ingyenes Office csomag gyerekeknek
»Új, gyorsabb Core i3 és Pentium processzorokat jelentett be az Intel
Tagi blogok
»PSP
»Első Programozó
»USB
»PHP, mint sablonmotor egyszerűen