Keresés
Hírlevél
 
Kiemelt témák
»Hogyan védjem meg a portálomat?
»Google wave
»Assembly :: röviden
Állás/munka
»Profi PHP szakit sörért felbérelnék :)
»C kódhiba
»IPhone App elkészítése
»GWT -ben tapasztalt webfejlesztőt keresek
»Profi sitebuildert keresünk projekt alapon
» több téma
Tudástár
?Szinpadon elhelyezett Symbol kezelése AS3-ban
?Önvédelmi mód
*Oldal title tagjába változó írása
*Utolsó 10 keresett kifejezés kiírása
*Rajzolás egy ablak fölé
Php sql update hiba input text-el
?Modrewrite ne legyen kötelező a parameter
?1 program többszöri elinditása automatikusan
?Sql ba user mentés majd rá 10 napra töröl
Perl könyvtárvizsgálat
VB 2005 + MySQL
*Webcam mozgás és szín érzékelés
C# Különbözű típusu osztályos származtatása
*Aktív beviteli mező és label hátterének kiemelése
?Input mezők megjelenítése
» több téma
Társalgó
»2f iskoláról vélemények
»Melyik főiskola vagy egyetem?
»Linux és a C#, .NET
»PHP fejlesztés felsőfokon eladó !
»Reklám kamu klikkelés kivédése
»Mik a legalapvetőbb tervezési minták C#-ban?
»Adatvédelmi nyilvántartás
»Hogyan védjem meg a portálomat?
»Trial megvalositasa
»Eclipse 3.5.2 és Visual Editor 1.4
» 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 (23 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
Top pontgyűjtők
»Micu1.940
»Árnyék940
»vinie540
»Frostech0530
»djjjozsi470
»pelz420
»Riha420
»klorand370
»stl340
»Sztatty270
Hírek
»Cassandra-ra tér át a MySQL-ről a Digg is
»Letölthető a Mozilla Jetpack SDK első kiadása
»Saját alkalmazásboltot nyitott a Google
»Súlyos sebezhetőség minden Apache kiszolgálóban
»Natív 3D-s támogatás a legújabb Android fejlesztőkészletben
» több hír
PC Fórum hírek
»Lopta a Firefox Jetpack terveit a Mozilla ?
»Minden weboldalra beköltözne a Facebook
»Nem boldogul az legújabb merevlemezekkel az XP és a Linux
»Átírják a Firefox licencszerződését
»Több tízezer nebuló a Microsuliban
»Sebezhető az Internet Explorer és az Opera is
»Még márciusban megjelenik az Intel nyolcmagos szerverlapkája
»Hamis Core i7 processzorokat árultak a neten
Tagi blogok
»USB
»PHP, mint sablonmotor egyszerűen
»Én és linux
»Coming out