Aspektusorientált programozás

A számítástechnikában az aspektusorientált programozás (AOP) egy olyan programozási paradigma, amelynek célja a modularitás növelése azáltal, hogy lehetővé teszi a kereszthivatkozások szeparálását (SoC). Ez úgy történik, hogy kiegészítő viselkedést ad a meglévő kódhoz (advice), önmagában a kód módosítása nélkül, ehelyett külön megjelöli, hogy melyik kódot módosítják egy „pointcut” specifikációval, például „naplózza az összes függvényhívást, amikor a függvény neve »set«-tel kezdődik”. Ez lehetővé teszi az üzleti logika szempontjából a nem központi viselkedés (például naplózás) hozzáadását a programhoz a funkcionalitás alapját képező kód túlzsúfolása nélkül. Az AOP alapja az aspektusorientált szoftverfejlesztésnek.

Az AOP programozási módszereket és eszközöket tartalmaz, amelyek támogatják a vonatkozások modulációját a forráskód szintjén, míg az "aspektusorientált szoftverfejlesztés" egy teljes mérnöki tudományágat jelent.

Az aspektusorientált programozás magában foglalja a program logikájának különálló részekre bontását (úgynevezett vonatkozások, koherens funkcionális területek). Szinte az összes programozási paradigma támogatja a vonatkozások bizonyos szintű csoportosítását és beágyazását különálló, független entitásokba absztrakciók (például függvények, eljárások, modulok, osztályok, metódusok) biztosításával, amelyek felhasználhatók ezeknek a vonatkozásoknak az implementálására, absztrakciójára és összeállítására. Néhány vonatkozás „átvág” számos absztrakción egy programon belül, és meghiúsítja a végrehajtás ezen formáit. Ezeket a vonatkozásokat cross-cutting (keresztülvágó) vagy horizontális vonatkozásoknak (vagy szimplán kereszthivatkozás) nevezik.

A naplózás egy kereszthivatkozási problémát szemléltet, mivel a naplózási stratégia szükségszerűen érinti a rendszer minden naplózott részét. A naplózás ezzel keresztezi az összes naplózott osztályt és metódust.

Minden AOP implementációnak vannak olyan átfogó kifejezései, amelyek mindegyik vonatkozást egységbe zárják. Az implementációk közötti különbség a biztosított konstrukciók erejében, biztonságában és használhatóságában rejlik. Például az olyan megszakítók, amelyek meghatározzák a keresztmetszet korlátozott formájának kifejezésére szolgáló metódusokat, a típusbiztonság vagy a hibakeresés támogatása nélkül. Az AspectJ-nek számos ilyen kifejezése van, melyeket beilleszthet egy speciális osztályba, egy aspektusba. Például egy aspektus megváltoztathatja az alapkód viselkedését (a program nem aspektusú részét), ha tanácsot (kiegészítő viselkedést) alkalmaz a különféle csatlakozási pontokban (a program pontjai), amelyeket egy mennyiségi meghatározás, vagy lekérdezés határoz meg, melyet pointcutnak nevezünk (amely észleli, hogy egy adott csatlakozási pont megegyezik-e). Egy aspektus binárisan kompatibilis szerkezeti változtatásokat is végrehajthat más osztályokban, például tagok vagy szülők hozzáadásával.

Története

Az AOP-nak számos közvetlen előzménye van, A1 és A2: reflexiós és metaobjektum protokollok, tárgyorientált programozás, Kompozíciós Szűrők és Adaptív Programozás.[1]

Gregor Kiczales és a Xerox PARC kollégái kifejlesztették az AOP kifejezett fogalmát, majd ezt követték az AspectJ AOP Java kiterjesztésével. Az IBM kutatócsoportja egy eszközi megközelítést alkalmazott a nyelvi tervezési megközelítés felett, és 2001-ben javaslatot tett a Hyper/J és a Concern Manipulation Environment környezetre, amelyek még nem voltak széles körben elterjedtek.

A cikk példái az AspectJ-t használják.

A Microsoft Transaction Server kiszolgálót tekintik az AOP első nagyobb alkalmazásának, amelyet az Enterprise JavaBeans követett.[2][3]

Motiváció és alapkoncepciók

Általában egy aspektus szét van szórva vagy összekeveredve, ami megnehezíti a kód kezelhetőségét és megértését. Ez abban valósul meg, hogy egy függvényt (például naplózás), több független függvény használhat, teljesen független rendszerekben, különböző forrásnyelvekben. Ez azt jelenti, hogy a naplózás megváltoztatásához szükség lehet az összes érintett modul módosítására. Ezek a szempontok nem csak azon a rendszereknek a fő funkciójában keveredhetnek össze, amelyekben kifejeződnek, hanem akár egymással is. Ezért, az egyik kereszthivatkozás megváltoztatása hatással lehet a többi funkcióra.

Például, vegyünk egy banki alkalmazást, egy nagyon egyszerű koncepcióval, ami az egyik számláról a másikra utal összeget:[4]

void transfer(Account fromAcc, Account toAcc, int amount) throws Exception {
  if (fromAcc.getBalance() < amount)
      throw new InsufficientFundsException();

  fromAcc.withdraw(amount);
  toAcc.deposit(amount);
}

Ez az átviteli módszer azonban figyelmen kívül hagyja azokat a bizonyos szempontokat, amelyeket egy telepített alkalmazás igényelne: hiányzik a biztonsági ellenőrzés, annak ellenőrzésére, hogy a jelenlegi felhasználó rendelkezik-e engedéllyel e művelet végrehajtásához; egy adatbázis-tranzakciónak be kell építenie a műveletet a véletlen adatvesztés elkerülése érdekében; a diagnosztika érdekében a műveletet be kell jegyezni a rendszernaplóba. A példa kedvéért egy verzió, amely ezeket az új vonatkozásokat implementálja így nézhet ki:

void transfer(Account fromAcc, Account toAcc, int amount, User user,
    Logger logger, Database database) throws Exception {
  logger.info("Transferring money...");
  
  if (!isUserAuthorised(user, fromAcc)) {
    logger.info("User has no permission.");
    throw new UnauthorisedUserException();
  }
  
  if (fromAcc.getBalance() < amount) {
    logger.info("Insufficient funds.");
    throw new InsufficientFundsException();
  }

  fromAcc.withdraw(amount);
  toAcc.deposit(amount);

  database.commitChanges();  // Atomic operation.

  logger.info("Transaction successful.");
}

Ebben a példában egyéb érdekek keveredtek össze az alapvető funkcionalitással (néha üzleti logikai vonatkozásnak nevezik). A tranzakciók, a biztonság és a naplózás mind a kereszthivatkozásokat szemléltetik.

Most fontoljuk meg, mi történik, ha hirtelen meg kell változtatnunk (például) az alkalmazás biztonsági szempontjait. A program aktuális verziójában a biztonsággal kapcsolatos műveletek több metóduson keresztül lettek létrehozva, egy ilyen változtatás komoly erőfeszítéseket igényelne.

Az AOP megpróbálja ezt a problémát megoldani azáltal, hogy lehetővé teszi a programozónak, hogy kifejezze ezeket a kereszthivatkozásokat önálló modulokban, úgynevezett aspektusokban (szempontokban). A szempontok tartalmazhatnak adviceokat (a program meghatározott pontjaihoz csatolt kódot) és típusközi deklarációkat (strukturális tagok hozzáadva más osztályokhoz). A biztonsági modul például tartalmazhat olyan adviceokat, amelyek biztonsági ellenőrzést hajtanak végre a bankszámla elérése előtt. A pointcut meghatározza azokat az időpontokat (csatlakozási pontok), amikor egy bankszámlához hozzáférhetünk, és az advice törzsében szereplő kód határozza meg a biztonsági ellenőrzés végrehajtásának implementációját. Így mind az ellenőrzés, mind a területek egy részen kezelhetők. Ezenkívül egy jó pointcut előrejelzi a program későbbi változásait, tehát ha egy másik fejlesztő új metódust hoz létre a bankszámla eléréséhez, az advice az új módszerre vonatkozik annak végrehajtásakor.

A fentebb említettek példájára egy naplózás megvalósítása egy aspektusban:

aspect Logger {
  void Bank.transfer(Account fromAcc, Account toAcc, int amount, User user, Logger logger)  {
    logger.info("Transferring money...");
  }

  void Bank.getMoneyBack(User user, int transactionId, Logger logger)  {
    logger.info("User requested money back.");
  }

  // Other crosscutting code.
}

Az AOP kapcsán gondolhatunk egy hibakeresési eszközre, vagy akár egy felhasználói szintű kellékre. Az advicet tartalékolhatjuk azokra az esetekre, amikor nem sikerül egy funkciót megváltoztatni (felhasználói szint),[5] vagy pedig nem akarjuk megváltoztatni a függvényt az élesen futó alkalmazásban (hibakezelés)

Csatlakozási pontok modellje

Az aspektusorientált nyelv tanáccsal kapcsolatos komponense meghatározza a csatlakozási pontot (JPM). A JPM három dolgot határoz meg:

  1. Mikor futhat az advice? Ezeket csatlakozási pontoknak nevezzük, mivel ezek egy futó program pontjai, ahol további viselkedés hasznos módon csatlakoztatható. A csatlakozási pontnak címezhetőnek és érthetőnek kell lennie egy átlagos programozó számára, hogy hasznos legyen. Valamint stabilnak kell, hogy maradjon a lényegtelen programváltozások között is, hogy egy aspektus is szintén stabil maradjon ilyen változások hatására. Számos AOP implementáció támogatja a metódus végrehajtását és a mező hivatkozásokat, referenciákat csatlakozási pontként.
  2. A csatlakozási pontok (pointcuts) meghatározásának (vagy számszerűsítésének) módja. A pointcut meghatározza, hogy egy adott csatlakozási pont megegyezik-e. A leghasznosabb pointcut nyelvek olyan szintaxist alkalmaznak, mint az alapnyelv ( például az AspectJ Java aláírásokat használ) és lehetővé teszik az újbóli felhasználást az elnevezés és a kombináció révén.
  3. A csatlakozási ponton futó kód megadásának eszköze. Az AspectJ meghívja ezt az advicet és futtathatja azt a csatlakozási pontok előtt, után és körül. Egyes implementációk támogatják egy metódus definiálását egy másik osztályban lévő aspektuson belül.

A csatlakozási pont modellek összehasonlíthatók meghatározásaik, valamint ezekben a pontokban engedélyezett műveleteik és a kifejezhető szerkezeti fejlesztéseik, és a kitett csatlakozási pontjaik alapján.

Az AspectJ csatlakozási pont modellje

  • Az AspectJ csatlakozási pontjai magukban foglalják a metódus vagy a konstruktor hívását, végrehajtását, az osztály vagy objektum inicializálását, a mező olvasási és írási hozzáférését, a kivételkezelőket stb. Nem tartalmaznak ciklusokat, ős (super) hívásokat, dobás (throw) kikötéseket, valamint több utasítást sem, stb.
  • A mutatókat primitív pointcut jelölők (PCD) kombinációi határozzák meg.

    A „kinded” PCD-k megfelelnek egyfajta csatlakozási pontnak (például metódus végrehajtás), és hajlamosak Java szignatúrák bevitelére. Az egyik ilyen pointcut így néz ki:

     execution(* set*(*))
    

    Ez megegyezik a metódus végrehajtási csatlakozási ponttal, ha a metódus neve „ "set" -tel kezdődik, és pontosan egy argumentumot vár.

    A „dynamic” (dinamikus) PCD-k ellenőrzik a futásidejű típusokat és kötött változókat. Például:

      this(Point)
    

    Ez a pointcut akkor egyezik meg, ha az éppen végrehajtó objektum a Point osztály példánya. Vegyük figyelembe, hogy az osztály meg nem határozott neve felhasználható a Java normál típusú keresésén keresztül.

    A „terület” (scope) PCD-k korlátozzák a csatlakozási pont lexikai hatókörét. Például:

     within(com.company.*)
    

    Ez a pointcut megegyezik a com.company csomag bármely típusú csatlakozási pontjával. A * a helyettesítő karakterek egyik formája, amely felhasználható ahhoz, hogy több dolgot egy aláírással egyeztessen.

    A mutatók összeállíthatók és megnevezhetők újrafelhasználás céljából. Például:

     pointcut set() : execution(* set*(*) ) && this(Point) && within(com.company.*);
    
    Ez a pointcut megegyezik a metódus végrehajtás csatlakozási pontjával, ha a metódus neve "set" -tel kezdődik, és ez a Point típusú objektum példánya a com.company csomagban. Erre utal a "set()" név használata.
  • Az advice azt határozza meg, hogy egy csatlakozási ponton (előtte, utána vagy körülötte) futtasson-e (pointcuttal megadva) egy bizonyos kódot (mint például egy metóduson belül lévő kód). Az AOP futásiideje automatikusan meghívja az advicet, ha a pointcut megegyezik a csatlakozási ponttal. Például: after() : set() { Display.update(); } Ez ténylegesen meghatározza: „Ha a set() pointcut megegyezik a csatlakozási ponttal, akkor futtassa a Display.update() kódot, miután a csatlakozási pont befejeződött”.

Egyéb potenciális csatlakozási pont modellek

Más típusú JPM is létezik. Az összes advice nyelv meghatározható a JPM alapján. Például az UML feltételezett nyelvén a következő JPM lehet:

  • A csatlakozási pontok mind a modell elemei.
  • A pointcutok olyan logikai kifejezésekre vonatkoznak, amelyek a modell elemeit egyesítik.
  • A befolyásolás eszköze ezeken a pontokon az összes illeszkedő csatlakozási pont megjelenítése.

Típusközi deklarációk

A típusközi deklarációk lehetőséget adnak a modulok felépítését érintő kereszthivatkozások kifejezésére. Ezek más néven nyílt osztályok és kiterjesztési metódusok, amelyek lehetővé teszik a programozók számára, hogy egy helyen deklarálják egy másik osztály tagjait vagy szüleit, általában azért, hogy egy problémára vonatkozó kód egészét egy aspektusben összevonják. Például, ha egy programozó a visitor felhasználásával valósította meg a megjelenítés-frissítést, egy visitor (látogató) mintát használó típusú típusközi deklaráció az AspectJ-ben így nézhet ki:

  aspect DisplayUpdate {
    void Point.acceptVisitor(Visitor v) {
      v.visit(this);
    }
    // other crosscutting code...
  }

Ez a kódrészlet hozzáadja az acceptVisitor metódust a Point osztályhoz.

Fontos követelmény, hogy minden strukturális kiegészítés kompatibilis legyen az eredeti osztállyal, hogy a meglévő osztály kliensei továbbra is működjenek, kivéve, ha az AOP megvalósítás azt várja el, hogy minden klienst folyamatosan ellenőrízzen.

Implementáció

Az AOP programok kétféleképpen befolyásolhatják a többi programot, az alapul szolgáló nyelvektől és a környezettől függően:

  1. Egy kombinált program készül, amely eredeti nyelven érvényes és megkülönbözhetetlen a hétköznapi programtól a végső interpreterig (fordító).
  2. A végső fordító vagy a környezet frissül az AOP funkciók megértéséhez és megvalósításához.

A környezetek megváltoztatásának nehézsége azt jelenti, hogy a legtöbb megvalósítás kompatibilis kombinációs programokat hoz létre „szövésnek” (weaving) nevezett folyamat révén – a program átalakításának különös esete. Egy aspektus szövő leolvassa az aspektusorientált kódot, és megfelelő objektumorientált kódot generál integrált szempontokkal belőle. Ugyanaz az AOP nyelv különféle szövésmódszerekkel implementálható, így a nyelv szemantikája soha meg nem érthető a szövés implementálásának szempontjából. Csak a megvalósítás sebességét és a telepítés könnyebbségét befolyásolja az, hogy milyen kombinációs módszert alkalmaznak.

A rendszerek forrásszintű szövést hajtanak végre olyan előprocesszorok segítségével (mivel a C++ eredetileg a CFront programban került megvalósításra), amelyek megkövetelik a hozzáférést a program forrásfájljaihoz. A Java jól definiált bináris formája azonban lehetővé teszi a bytekód szövők számára, hogy bármilyen Java programmal együtt működjenek .class fájl formátumban. A bytekód szövők telepíthetők (deploy) az építés (build) során, vagy ha a szövési modell osztályonkénti, akkor az osztálybetöltés során. Az AspectJ 2001-ben forrásszintű szövést kezdett kialakítani, majd 2002-ben egy osztályonkénti bytekód szövőt hozott létre, és fejlett terhelési idő támogatást nyújtott az AspectWerkz 2005-ös integrációja után.

Bármely megoldásnak, amely egyesíti a programokat futásidő alatt, olyan aspektusokat kell tartalmaznia, amelyek megfelelően elkülönítik őket, hogy fenntartsák a programozó szegregált modelljét. A Java bytekód támogatása több forrásfájlnál lehetővé teszi a hibakeresők számára, hogy egy megfelelően szőtt .class fájlon átlépjenek a forrásszerkesztőben. Néhány harmadik féltől származó kódvisszafejtő program (decompiler) nem tudja feldolgozni a szőtt kódot, mert Javac által előállított kódot várnak, az összes támogatott bytekód forma helyett.

Az üzembe helyezési időszövés (deploy-time weaving) egy másik megközelítést kínál.[6] Ez alapvetően utófeldolgozást von maga után, de a létrehozott kód javítása helyett ez a szövés megközelítés alosztályozza a meglévő osztályokat úgy, hogy a módosításokat metódus felülírással (method overriding) vezeti be. A meglévő osztályok változatlanok maradnak, még futásidejűleg is, és az összes létező eszköz (hibakeresők, profilkészítők stb.) felhasználható a fejlesztés során. Hasonló megközelítés már bebizonyosodott számos Java EE alkalmazáskiszolgáló – például az IBM WebSphere – implementálásában.

Terminológia

Az aspektusorientált programozásban használt alap terminológia a következőket foglalja magában:

Kereszthivatkozás (Cross-cutting concern)
Annak ellenére, hogy az OO modell legtöbb osztálya egyetlen, specifikus funkciót fog ellátni, gyakran közös, másodlagos követelményeket osztanak meg más osztályok felé. Előfordulhat például, hogy naplózást szeretnénk hozzáadni az adat-hozzáférési réteg osztályaihoz és a UI réteg osztályaihoz is, amikor egy szál belép vagy kilép egy metódusból. További aggályok kapcsolódhatnak a biztonsághoz például hozzáférési jogosultságok vezérlés,[7] vagy az információáramlás-vezérlés.[8] Annak ellenére, hogy az osztályok nagyon eltérő elsődleges funkcióval rendelkeznek, a másodlagos funkciók végrehajtásához szükséges kód gyakran azonos.
Advice
Ez a kiegészítő kód, amelyet alkalmazni szeretnénk a meglévő modellre. Példánkban ez az a naplózási kód, amelyet alkalmazni akarunk, amikor a szál belép a metódusba, vagy kilép a metódusból.
Pointcut
Ez a kifejezés az alkalmazás azon végrehajtási pontjához adódik, amelyen kereszthivatkozást alkalmazunk. Példánkban egy pointcutot érünk el, amikor a szál belép a metódusba, és szintén egy pointcutot érünk el akkor, amikor a szál kilép a metódusból.
Aspektus
A pointcut és az advice kombinációját aspektusnak nevezzük. A fenti példában hozzáadunk egy naplózási aspektust alkalmazásunkhoz, egy pointcut definiálásával, és egy helyes advice-val.

Összehasonlítás más programozási paradigmákkal

A aspektusok az objektumorientált programozás és a számítási reflexiók során merültek fel. Az AOP nyelvek funkciója hasonló, de korlátozóbb, mint a metaobjektum protokollok. Az aspektusok szorosan kapcsolódnak a programozási koncepciókhoz, például az objektumokhoz, a mixinekhez és a delegáláshoz (delegation). Az aspektusorientált programozási paradigmák felhasználásának további módjai a Kompozíciószűrő és a hyperslice megközelítés. Már az 1970-es évek óta a fejlesztők olyan lehallgatási és küldési javításokat használnak, amelyek hasonlítanak az AOP megvalósítás metódusaira, ám ezeknek a szemantikáknak soha nem volt olyan része, amelyeket a keresztmetszeti (crosscutting) leírások biztosítanak.

A tervezők fontolóra vették a kód szeparálásának alternatív lehetőségeit, például a C# részleges típusait, de az ilyen megközelítésekben nincs olyan számszerűsítő mechanizmus, amely lehetővé teszi a kód több csatlakozási pontjának elérését egyetlen deklaratív kijelentéssel (statement).

Bár úgy tűnhet, hogy független, a tesztelés során a mock vagy metódus részlet (method stub) használata AOP technikák alkalmazását igényli, például az advice környékén és így tovább. Az együttmûködõ objektumok itt a teszt céljából  kereszthivatkozássá válnak. Így a különféle mock objektum keretrendszerek biztosítják ezeket a funkciókat. Például egy folyamat meghív egy szolgáltatást, hogy megkapja az egyenlegösszeget. A folyamat tesztelésekor, az összeg származása, nem fontos, csak az, hogy a folyamat a követelményeknek megfelelően használja az egyenleget.

Az örökléssel kapcsolatos kérdések

A programozóknak el kell tudniuk olvasni a kódot, és meg kell érteniük, hogy mi történik a hibák elkerülése érdekében.[9] Még megfelelő oktatás mellett is nehézkes lehet a kereszthivatkozások megértése a program statikus felépítésének és dinamikus folyamatának vizualizálásával kapcsoltban nyújtott megfelelő támogatás nélkül.[10] 2002-től kezdve az AspectJ IDE-bővítményeket kezdett biztosítani a kereszthivatkozások vizualizálásának támogatására. Ezek a szolgáltatások, valamint az aspektus kód segéd és a refaktorálás manapság elterjedtek.

Tekintettel az AOP erejére, ha egy programozó logikai hibát követ el a kereszthivatkozás kifejezésében, az széles körű programhibához vezethet. Ezzel szemben egy másik programozó megváltoztathatja a program csatlakozási pontjait – például átnevezéssel vagy metódusok áthelyezésével – oly módon, amit az aspektus író nem várt előre. A kereszthivatkozás modularizálásának egyik előnye, hogy lehetővé teszi egy programozó számára azt, hogy könnyen befolyásolja az egész rendszert; Ennek eredményeként az ilyen problémák konfliktusként jelennek meg két vagy több fejlesztő közötti felelősségként egy adott hiba miatt. E problémák megoldása azonban sokkal könnyebb lehet AOP jelenlétében, mivel csak az aspektust kell megváltoztatni, míg a problémák AOP nélkül sokkal elterjedőbbek lehetnek a programon belül.

Kritika

Az AOP hatásának legalapvetőbb kritikája az, hogy az irányítás áramlás (control flow) el van takarva, és hogy ez nem csak rosszabb, mint a sok rosszindulatú GOTO, hanem valójában szorosan analóg a COME FROM kijelentés viccével.[10] Az alkalmazás elhanyagoltsága, amely alapvető fontosságú az AOP sok meghatározása szempontjából (a kérdéses kódnak nincs utalása arra, hogy egy advicet alkalmazni fognak, ehelyett a pointcutban pontosítanak), azt jelenti, hogy az advice nem látható, ellentétben egy explicit metódus hívással.[10][11] Például hasonlítsa össze a COME FROM programot:[10]

 5 INPUT X
10 PRINT 'Result is :'
15 PRINT X
20 COME FROM 10
25      X = X * X
30 RETURN

Analóg szemantikai AOP töredékkel (fragment):

main() {
    input x
    print(result(x))
}
input result(int x) { return x }
around(int x): call(result(int)) && args(x) {
    int temp = proceed(x)
    return temp * temp
}

Valójában a pointcut függhet a futásidejű körülményektől, és így nem lehet statikusan determinisztikus. Ezt enyhíteni lehet, de nem lehet megoldani statikus elemzéssel és IDE támogatással, amely megmutatja, hogy mely tanácsok egyeznek meg potenciálisan.

Általános kritika az, hogy az AOP célja "mind a modularitás, mind a kód szerkezetének" javítása, ám néhányan azt állítják, hogy ehelyett aláássák ezeket a célokat, és akadályozzák a "programok független fejlesztését és érthetőségét".[12] Pontosabban, a pointcut általi számszerűsítés megszakítja a modularitást: "általában egy teljes program ismeretével kell rendelkezni egy aspektus orientált program dinamikus végrehajtásának megvitatására."[13] Továbbá, bár céljait (a kereszthivatkozások modularizálását) jól értik, a tényleges definíciója nem egyértelmű, és nem különböztethető  meg egyértelműen a többi jól bevált technikától.[12] A kereszthivatkozások potenciálisan keresztül vágják egymást, és valamilyen felbontási mechanizmust igényelnek, mint például az elrendezés.[12] Valójában az aspektusok magukra is alkalmazhatók, és olyan problémákhoz vezethetnek, mint például a hazug paradoxona.[14]

A technikai kritika magában foglalja azt, hogy a pointcutok mennyiségi meghatározása (amely meghatározza az adviceok végrehajtásának helyét) "rendkívül érzékeny a program változásaira", amelyet törékeny pointcut problémaként ismernek.[12] A pointcuttal kapcsolatos problémák megoldhatatlanok: ha a pointcutok számszerűsítését explicit kommentárokkal helyettesítjük, akkor inkább egy attribútumorientált programozást kapunk, amely egyszerűen egy explicit szubrutin hívás, és ugyanolyan szétszórási problémától szenved, amely megoldására az AOP-t tervezték.[12]

Implementációk

A következő programozási nyelvek valósították meg az AOP-t, a nyelven belül vagy külső könyvtárként.

További linkek

Megjegyzések és hivatkozások

  1. "Adaptive Object Oriented Programming: The Demeter Approach with Propagation Patterns" Karl Liebherr 1996 ISBN 0-534-94602-X presents a well-worked version of essentially the same thing (Lieberherr subsequently recognized this and reframed his approach).
  2. Don Box. Essential.NET: The common language runtime. Addison-Wesley Professional, 206. o. (2002. november 4.). ISBN 978-0-201-73411-9. Hozzáférés ideje: 2011. október 4. 
  3. Roman, Ed. Mastering Enterprise JavaBeans. John Wiley and Sons, 285. o. (2005. január 1.). ISBN 978-0-7645-8492-3. Hozzáférés ideje: 2011. október 4. 
  4. Note: The examples in this article appear in a syntax that resembles that of the Java language.
  5. gnu.org. www.gnu.org . [2017. december 24-i dátummal az eredetiből archiválva]. (Hozzáférés: 2018. május 5.)
  6. Archived copy. [2005. október 8-i dátummal az eredetiből archiválva]. (Hozzáférés: 2005. június 19.)
  7. B. De Win, B. Vanhaute and B. De Decker. "Security through aspect-oriented programming". In Advances in Network and Distributed Systems Security (2002).
  8. T. Pasquier, J. Bacon and B. Shand. "FlowR: Aspect Oriented Programming for Information Flow Control in Ruby". In ACM Proceedings of the 13th international conference on Modularity (Aspect Oriented Software Development) (2014).
  9. Edsger Dijkstra, Notes on Structured Programming Archiválva 2006. október 12-i dátummal a Wayback Machine-ben., pg. 1-2
  10. a b c d (2004. szeptember 1.) „AOP Considered Harmful”. European Interactive Workshop on Aspects in Software (EIWAS). [2016. március 23-i dátummal az eredetiből archiválva]. Hozzáférés: 2018. május 5. 
  11. C2:ComeFrom
  12. a b c d e Steimann (2006). „The paradoxical success of aspect-oriented programming”. ACM SIGPLAN Notices 41 (10), 481. o. DOI:10.1145/1167515.1167514. , (slides Archiválva 2016. március 4-i dátummal a Wayback Machine-ben.,slides 2 Archiválva 2015. szeptember 23-i dátummal a Wayback Machine-ben., abstract Archiválva 2015. szeptember 24-i dátummal a Wayback Machine-ben.), Friedrich Steimann, Gary T. Leavens, OOPSLA 2006
  13. Numerous: Afterthought Archiválva 2016. március 15-i dátummal a Wayback Machine-ben., LOOM.NET Archiválva 2008. augusztus 27-i dátummal a Wayback Machine-ben., Enterprise Library 3.0 Policy Injection Application Block Archiválva 2007. január 19-i dátummal a Wayback Machine-ben., AspectDNG Archiválva 2004. szeptember 29-i dátummal a Wayback Machine-ben., DynamicProxy Archiválva 2015. december 5-i dátummal a Wayback Machine-ben., Compose* Archiválva 2005. augusztus 21-i dátummal at Wikiwix, PostSharp Archiválva 2016. május 3-i dátummal a Wayback Machine-ben., Seasar.NET Archiválva 2006. július 25-i dátummal a Wayback Machine-ben., DotSpect (.SPECT) Archiválva 2006. március 31-i dátummal a Wayback Machine-ben., Spring.NET Archiválva 2006. április 2-i dátummal a Wayback Machine-ben. (as part of its functionality), Wicca and Phx.Morph Archiválva 2006. december 7-i dátummal a Wayback Machine-ben., SetPoint Archiválva 2008. október 7-i dátummal a Wayback Machine-ben.
  14. a b Welcome to as3-commons-bytecode. as3commons.org. [2014. október 3-i dátummal az eredetiből archiválva]. (Hozzáférés: 2018. május 5.)
  15. Numerous: Afterthought Archiválva 2016. március 15-i dátummal a Wayback Machine-ben., LOOM.NET Archiválva 2008. augusztus 27-i dátummal a Wayback Machine-ben., Enterprise Library 3.0 Policy Injection Application Block Archiválva 2007. január 19-i dátummal a Wayback Machine-ben., AspectDNG Archiválva 2004. szeptember 29-i dátummal a Wayback Machine-ben., DynamicProxy Archiválva 2015. december 5-i dátummal a Wayback Machine-ben., Compose* Archiválva 2005. augusztus 21-i dátummal at Wikiwix, PostSharp Archiválva 2016. május 3-i dátummal a Wayback Machine-ben., Seasar.NET Archiválva 2006. július 25-i dátummal a Wayback Machine-ben., DotSpect (.SPECT) Archiválva 2006. március 31-i dátummal a Wayback Machine-ben., Spring.NET Archiválva 2006. április 2-i dátummal a Wayback Machine-ben. (as part of its functionality), Wicca and Phx.Morph Archiválva 2006. december 7-i dátummal a Wayback Machine-ben., SetPoint Archiválva 2008. október 7-i dátummal a Wayback Machine-ben.
  16. Ada2012 Rationale. adacore.com. [2016. április 18-i dátummal az eredetiből archiválva]. (Hozzáférés: 2018. május 5.)
  17. Function Hooks. autohotkey.com. [2013. január 17-i dátummal az eredetiből archiválva]. (Hozzáférés: 2018. május 5.)
  18. Cobble. vub.ac.be. (Hozzáférés: 2018. május 5.)[halott link]
  19. AspectCocoa. neu.edu. [2007. október 26-i dátummal az eredetiből archiválva]. (Hozzáférés: 2018. május 5.)
  20. ColdSpring Framework: Welcome, 2005. november 5. [2005. november 5-i dátummal az eredetiből archiválva]. (Hozzáférés: 2018. május 5.)
  21. Closer Project: AspectL.. [2011. február 23-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. augusztus 11.)
  22. infra - Frameworks Integrados para Delphi - Google Project Hosting. [2015. szeptember 9-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. augusztus 11.)
  23. meaop - MeSDK: MeObjects, MeRTTI, MeAOP - Delphi AOP(Aspect Oriented Programming), MeRemote, MeService... - Google Project Hosting. [2015. szeptember 10-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. augusztus 11.)
  24. Google Project Hosting. [2014. december 25-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. augusztus 11.)
  25. RemObjects Cirrus. codegear.com. [2012. január 23-i dátummal az eredetiből archiválva]. (Hozzáférés: 2018. május 5.)
  26. Emacs Advice Functions. gnu.org. [2011. október 24-i dátummal az eredetiből archiválva]. (Hozzáférés: 2018. május 5.)
  27. AspectLua. [2015. július 17-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. augusztus 11.)
  28. MAKAO, re(verse)-engineering build systems. [2012. július 24-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. augusztus 11.)
  29. McLab. [2015. szeptember 24-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. augusztus 11.)
  30. AspectML - Aspect-oriented Functional Programming Language Research. [2010. december 5-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. augusztus 11.)
  31. Adam Kennedy: Aspect - Aspect-Oriented Programming (AOP) for Perl - metacpan.org. [2013. augusztus 31-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. augusztus 11.)
  32. Several: PHP-AOP (AOP.io) Archiválva 2014. augusztus 18-i dátummal at Wikiwix, Go! AOP framework Archiválva 2013. március 1-ji dátummal a Wayback Machine-ben., PHPaspect Archiválva 2016. augusztus 22-i dátummal a Wayback Machine-ben., Seasar.PHP Archiválva 2005. december 26-i dátummal a Wayback Machine-ben., PHP-AOP, Flow Archiválva 2018. január 4-i dátummal a Wayback Machine-ben., AOP PECL Extension Archiválva 2017. április 11-i dátummal a Wayback Machine-ben.
  33. bigzaphod.org is coming soon. www.bigzaphod.org. [2016. április 20-i dátummal az eredetiből archiválva]. (Hozzáférés: 2018. május 5.)
  34. Several: PEAK Archiválva 2005. április 9-i dátummal a Wayback Machine-ben., Aspyct AOP, Lightweight Python AOP Archiválva 2004. október 9-i dátummal a Wayback Machine-ben., Logilab's aspect module Archiválva 2005. március 9-i dátummal a Wayback Machine-ben., Pythius Archiválva 2005. április 8-i dátummal a Wayback Machine-ben., Spring Python's AOP module Archiválva 2016. március 4-i dátummal a Wayback Machine-ben., Pytilities' AOP module Archiválva 2011. augusztus 25-i dátummal a Wayback Machine-ben., aspectlib Archiválva 2014. november 5-i dátummal a Wayback Machine-ben.
  35. PLaneT Package Repository : PLaneT > dutchyn > aspectscheme.plt. [2015. szeptember 5-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. augusztus 11.)
  36. AspectR - Simple aspect-oriented programming in Ruby. [2015. augusztus 12-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. augusztus 11.)
  37. Dean Wampler: Home. [2007. október 26-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. augusztus 11.)
  38. gcao/aspector. GitHub. [2015. január 4-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. augusztus 11.)
  39. AspectS. tu-ilmenau.de. [2006. január 6-i dátummal az eredetiből archiválva]. (Hozzáférés: 2018. május 5.)
  40. MetaclassTalk: Reflection and Meta-Programming in Smalltalk. [2015. július 29-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. augusztus 11.)
  41. WEAVR. iit.edu. [2008. december 12-i dátummal az eredetiből archiválva]. (Hozzáférés: 2018. május 5.)
  42. aspectxml - An Aspect-Oriented XML Weaving Engine (AXLE) - Google Project Hosting. [2015. szeptember 12-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. augusztus 11.)

További irodalom

Fordítás

Ez a szócikk részben vagy egészben az Aspect-oriented programming című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

Külső linkek

Read other articles:

Sebuah hairpin loop dari sebuah pra-mRNA. Yang di-highlight adalah nukleobasa (hijau) dan tulang punggung ribosa-fosfat (biru). Catatan bahwa ini adalah satu untai RNA yang melipat kembali ke dirinya sendiri. No Bagian dari seriGenetika   Komponen penting Kromosom DNA RNA Genom Pewarisan Mutasi Nukleotida Variasi Garis besar Indeks Sejarah dan topik Pengantar Sejarah Evolusi (molekuler) Genetika populasi Hukum Pewarisan Mendel Genetika kuantitatif Genetika molekuler Penelitan Pengurutan ...

 

 

RobotSampul edisi regulerLagu oleh CNBLUEdari album What Turns You On?Sisi-BRingStarlit NightDirilis19 Desember 2012(see release history)FormatCD singel, unduhan digitalDirekam2012GenreRockDurasi3:19LabelWarner Music JapanPenciptaJung Yong-hwa, Kosuke ObaProduserJung Yong-hwa, Kosuke Oba Robot adalah lagu dari band rock asal Korea Selatan CNBLUE, ditulis dan diproduseri oleh Jung Yong-hwa dan Kosuke Oba. Singel ini dirilis pada tanggal 19 Desember 2012 dalam tiga edisi yang berbeda sebagai si...

 

 

本條目存在以下問題,請協助改善本條目或在討論頁針對議題發表看法。 此條目需要补充更多来源。 (2018年3月17日)请协助補充多方面可靠来源以改善这篇条目,无法查证的内容可能會因為异议提出而被移除。致使用者:请搜索一下条目的标题(来源搜索:羅生門 (電影) — 网页、新闻、书籍、学术、图像),以检查网络上是否存在该主题的更多可靠来源(判定指引)。 �...

Часть серии статей о Холокосте Идеология и политика Расовая гигиена · Расовый антисемитизм · Нацистская расовая политика · Нюрнбергские расовые законы Шоа Лагеря смерти Белжец · Дахау · Майданек · Малый Тростенец · Маутхаузен ·&...

 

 

2016 single by Shawn MendesMercySingle by Shawn Mendesfrom the album Illuminate ReleasedOctober 18, 2016 (2016-10-18)Recorded2016Length3:28Label Island Universal Songwriter(s) Shawn Mendes Teddy Geiger Danny Parker Ilsey Juber Producer(s) Jake Gosling Teddy Geiger Shawn Mendes singles chronology Treat You Better (2016) Mercy (2016) There's Nothing Holdin' Me Back (2017) Music videoMercy on YouTube Mercy is a song by Canadian singer-songwriter Shawn Mendes. It was co-written by ...

 

 

Greek poet This article is an orphan, as no other articles link to it. Please introduce links to this page from related articles; try the Find link tool for suggestions. (April 2022) Antheas Lindius (Ancient Greek: Ἄνθεας) was a Greek poet, of Lindus in Rhodes, who flourished about 596 BC. Antheas was one of the earliest known eminent composers of phallic songs, which he himself sung at the head of his phallophori (that is, phallus-bearers).[1] Hence he is ranked by Athenaeus a...

Untuk ragam Persia Tat yang dituturkan oleh masyarakat Yahudi Kaukasus, lihat bahasa Persia Tat Yahudi. Cari artikel bahasa  Cari berdasarkan kode ISO 639 (Uji coba)  Kolom pencarian ini hanya didukung oleh beberapa antarmuka Halaman bahasa acak Bahasa Persia Yahudi یهودی / Yehud Dituturkan diIsraelIranAfganistanTiongkokUzbekistanTajikistanAzerbaijanRusiaWilayahAsia Tengah dan SyamPenutur(60.000 jiwa di Israel per 1995)[1] Rumpun bahasaIndo-Eropa Indo-IranIranIran ...

 

 

Russian football club Football clubFC Spartak Yoshkar-OlaFull nameFootball Club Spartak Yoshkar-OlaFounded1962ChairmanGennadi BelousovManagerAleksandr NenashkinLeagueRussian Amateur Football League2014–15PFL, Zone Ural-Povolzhye, 11th (relegated) FC Spartak Yoshkar-Ola (Russian: ФК «Спартак» Йошкар‑Ола) is a Russian football team from Yoshkar-Ola. It played professionally from 1962 to 1998, from 2000 to 2003 and again from 2012/13 season to 2014/15. It played at the se...

 

 

2022 WAFF U-23 Championshipبطولة غرب آسيا لكرة القدم تحت 23 عاماTournament detailsHost countrySaudi ArabiaCityJeddahDates3–15 NovemberTeams6 (from 1 confederation) (from 1 sub-confederation)Venue(s)3 (in 1 host city)Final positionsChampions Saudi Arabia (1st title)Runners-up QatarThird place SyriaFourth place OmanTournament statisticsMatches played11Goals scored26 (2.36 per match)Top scorer(s) Al Faraj Al Kiyumi Nasser...

Crayon Shin-chan: Mononoke Ninja ChinpūdenPoster rilis teatrikalNama lainNama JepangKanji クレヨンしんちゃん もののけニンジャ珍風伝 TranskripsiRevised HepburnKureyon Shinchan: Mononoke Ninja Chinpūden SutradaraMasakazu HashimotoSkenarioMasakazu HashimotoKimiko UenoBerdasarkanCrayon Shin-chanoleh Yoshito UsuiPemeran Yumiko Kobayashi Miki Narahashi Toshiyuki Morikawa Satomi Kōrogi Mari Mashiba Penata musikToshiyuki ArakawaShinji MiyazakiPerusahaanproduksiShin-...

 

 

World Paragliding Championships is the main competitive paragliding championships in the World, organized by the Fédération Aéronautique Internationale. Cross Country Paragliding 2017 World Paragliding Championships in Feltre (task Rubbio), Italy. Year City Country Date Venue No. ofAthletes No. ofNations 1st 1989 Kössen  Austria 2nd 1991 Digne-les-Bains  France 3rd 1993 Verbier   Switzerland 4th 1995 Kitakyushu  Japan 5th 1997 Castejón de Sos  Spain 6th 1999...

 

 

Rail yard for cleaning, repairing and maintaining locomotives This article includes a list of general references, but it lacks sufficient corresponding inline citations. Please help to improve this article by introducing more precise citations. (April 2024) (Learn how and when to remove this message) This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources:&...

この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方)出典検索?: コルク – ニュース · 書籍 · スカラー · CiNii · J-STAGE · NDL · dlib.jp · ジャパンサーチ · TWL(2017年4月) コルクを打ち抜いて作った瓶の栓 コルク(木栓、�...

 

 

L'acoziborole (SCYX-7158) est un médicament antiprotozoaire (en) conçu par Anacor Pharmaceuticals en 2009[1], et actuellement en cours de développement par Sanofi et l'initiative Médicaments contre les maladies négligées (DNDi) pour le traitement de la trypanosomiase africaine (maladie du sommeil)[2]. Molécule d'acoziborole. Il s'agit d'un nouveau médicament, dérivé du benzoxaborole et administré par voie orale à prise unique. Les essais cliniques de phase I se sont achevés ...

 

 

South Korean financial holding company An editor has performed a search and found that sufficient sources exist to establish the subject's notability. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: BNK Financial Group – news · newspapers · books · scholar · JSTOR (April 2023) (Learn how and when to remove this message) The topic of this article may not meet Wikipe...

Neighborhood of Philadelphia in Pennsylvania, United StatesChinatownNeighborhood of PhiladelphiaA Chinese Friendship Arch at 10th and Arch streets in PhiladelphiaChinatownCoordinates: 39°57′13″N 75°09′23″W / 39.9535°N 75.1563°W / 39.9535; -75.1563Country United StatesStatePennsylvaniaCountyPhiladelphiaCityPhiladelphiaZIP Code19107Area code(s)215, 267, and 445 Philadelphia Chinatown is a predominantly Asian American neighborhood in Center City, Philadel...

 

 

Altamahaw-Ossipeeex census-designated placeLocalizzazioneStato Stati Uniti Stato federato Carolina del Nord ConteaAlamance TerritorioCoordinate36°10′45.93″N 79°30′04.36″W36°10′45.93″N, 79°30′04.36″W (Altamahaw-Ossipee) Superficie6,0 km² Abitanti996 (2000) Densità166 ab./km² Altre informazioniFuso orarioUTC-5 CartografiaAltamahaw-Ossipee Altamahaw-Ossipee – Mappa Modifica dati su Wikidata · Manuale Altamahaw-Ossipee è stato un census-designated p...

 

 

Town hall in Fremantle, Western Australia Fremantle Town HallThe building remains almost unchanged since constructionGeneral informationTypeTown hallLocationFremantle, Western AustraliaCoordinates32°03′15″S 115°44′52″E / 32.054293°S 115.7479°E / -32.054293; 115.7479 (Fremantle Town Hall) Western Australia Heritage RegisterTypeState Registered PlaceDesignated9 November 1993Reference no.1015 Fremantle Town Hall is a town hall located in the ports...

باكاري غاساما   معلومات شخصية الاسم الكامل باكاري بابا غاساما الميلاد 10 فبراير 1979 (العمر 45 سنة)بانجول، غامبيا الطول 184.21 سنتيمتر  الجنسية  غامبيا الحياة العملية الاتحاد الرياضي الاتحاد الأفريقي لكرة القدم أبرز المباريات كأس أفريقيا 2015كأس السوبر الأفريقي 2013 المهنة ...

 

 

Partial or complete triplication of chromosome 16 Chromosome 16 Trisomy 16 is a chromosomal abnormality in which there are 3 copies of chromosome 16 rather than two.[1] It is the most common trisomy leading to miscarriage and the second most common chromosomal cause of it, closely following X-chromosome monosomy.[2] About 6% of miscarriages have trisomy 16.[3] Those mostly occur between 8 and 15 weeks after the last menstrual period.[3] It is not possible for a...