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ó
Egy összetett példa

Tegyük fel, hogy van egy világunk, ahol többféle élőlény él: vannak növények és állatok, ezen belül pedig húsevők és növényevők. Konkrétan legyen némi zabunk, káposztánk, egy-egy zebránk, kecskénk és tigrisünk. Ezek az élőlények a szokásos módon táplálkoznak: a növényeket megeszik a növényevők, őket pedig a húsevők. Utóbbi esetet az áldozatok sikoltozása kíséri, illetve minden növényevő csak egyszer fogyasztható el.

Rendelkezésünkre állnak tehát az alábbi osztályok. Az öröklések egy fát határoznak meg természetes módon:

public abstract class Eloleny {

protected String nev;
private boolean halott = false;

public void setHalott(boolean halott) {
            this.halott = halott;
         }

public boolean getHalott() { return this.halott; }

public String toString() { return this.nev; }

}

public class Noveny extends Eloleny {

public Noveny(String nev) { this.nev = nev; }

}

public abstract class Allat extends Eloleny {

protected List kedveltEtelek = new ArrayList();

public void addMitEszik(Eloleny etel) {
kedveltEtelek.add(etel);
}

}

public class Vegetarianus extends Allat {

public Vegetarianus(String nev) { this.nev = nev; }

}

public class Husevo extends Allat {

public Husevo(String nev) { this.nev = nev; }

}

A világot az alábbi Java osztály reprezentálja. Terem némi zöldség, ezt lelegelik a növényevők, őket pedig egy húsevő. Tiszta sor.

public class Vilag {

    public static void main(String[] args) {
   
    //A vilag tagjai
    Noveny zab = new Noveny("Zab");
    Noveny kaposzta = new Noveny("Kaposzta");
   
    Vegetarianus zebra = new Vegetarianus("Zebra");
    Vegetarianus kecske = new Vegetarianus("Kecske");
   
    Husevo tigris = new Husevo("Tigris");
   
    //Ki kit eszik?
    zebra.addMitEszik(zab);
    kecske.addMitEszik(kaposzta);
   
    tigris.addMitEszik(zebra);
    tigris.addMitEszik(kecske);
   
    }

}

A világban való tevékenykedésüket az alábbi aspektus szabályozza:

public aspect SikolyAspektus {

private static Sikoly pechEffekt = new Sikoly();

pointcut husevoEszik(Husevo f, Vegetarianus e) : 
                          target(f) &&
                          args(e) &&
                          call(void addMitEszik(..));

after(Husevo fogyaszto, Vegetarianus etel):
               husevoEszik(fogyaszto, etel)
         {
  pechEffekt.sikoltozas(etel);
}

}

A világot futtatva a kimenet az alábbi lesz:

Nézzük először vázlatosan a program működését:

  • Létrehozzuk az objektumokat, mint a világ élőlényeit
  • Felvesszük a zebra és a kecske ételei közé a növényeket. Az adott aspektusban - mint sikoltozás - ennek nincsen eredménye, hiszen a növények nem sikoltoznak.
  • Felvesszük a zebrát és a kecskét a tigris étrendjébe.
  • Ők azonnal sikoltoznak, mert az aspektus meghatározta, hogy amennyiben egy húsevő objektum addMitEszik() metódusának paramétere Növényevő tipusú, akkor az az objektum - a paraméter - sikoltozzon.

A legérdekesebb a negyedik pont, tekintsük át ezt részletesen:

pointcut husevoEszik(Husevo f, Vegetarianus e) : 
                     target(f) &&
                     args(e) &&
                     call(void addMitEszik(..));

Első lépésként definiáljuk a pointcutot, mint join pointok halmazát. A pointcut neve husevoEszik, a két paraméter a műveletben szereplő két objektum (amin meghívjuk a metódust, és amit paraméterként kap). Ez áll a kettősponttól balra. A jobbra eső részben megadjuk, hogy a célobjektum egy Húsevő, a paraméter Vegetáriánus típusú, és a hívás tetszőleges paraméterekkel rendelkező. Minden hívás, amire ez illeszkedik, az alábbi advice kezeli:

after (Husevo fogyaszto, Vegetarianus etel):             
       husevoEszik(fogyaszto, etel)
{
      pechEffekt.sikoltozas(etel);
}

Az after advice - a listára való felkerülés utáni "tanács" - a kapott két paraméterrel (hogy azonosítható legyen) fent látható. A húsevő eszik, és az étlapra került állat objektumával a Sikoly osztály példányának sikoltozas() metódusa meghívásra kerül.

Az állatobjektumok és a viselkedés elkülönültek maradtak, nem keverednek a kódok, hanem egy, az osztályokat "fentről" szemlélő módszer - az aspektus - segítségével határoztuk meg a kapcsolatukat.

A példa forráskódjai - kommenttel ellátva - innen tölthetők le.

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