wikipedia.infostar.cz

Aspekt-orientované programování

Aspect-orientované programování je programovací vzor, který se zvětší modularity tím, že dovolí oddělení kříže-ostrá znepokojení, tvořit východisko pro Aspect-orientovaný vývoj software. Představený po objektově orientovaném programování, to je pošta-namítat-orientovaný programovací vzor.

Nepřehlédněte: Tato stránka obsahuje strojový překlad textu z anglické encyklopedie Wikipedia. Pokud budou některé pasáže špatně srozumitelné, zkuste se podívat i na text v originále, který najdete pod odkazem Aspect-oriented programming. Překlad byl vytvořen pomocí překladače Eurotran.

Přehled

Aspekt-orientované programování (AOP) je programovací vzor, který se zvětší modularity tím, že dovolí oddělení znepokojení. Toto znamená, že rozebere program do zřetelných částí (takzvaná znepokojení, soudržné oblasti funkčnosti). Všechny programovací vzory podporují nějakou úroveň seskupení a shrnutí znepokojení do oddělených, nezávislých entit tím, že poskytuje nové abstrakce (např. procedury, moduly, třídy, metody) to může být používáno reprezentovat tyto znepokojení. Ale některá znepokojení se vzpírají těmto formám shrnutí a jsou nazývána crosscutting znepokojeními, protože oni “projedou” rozmanité abstrakce v programu.

Zaznamenávat je typický příklad crosscutting znepokojení protože zaznamenávat strategii nutně ovlivní každou jednu nahranou část systému. Zaznamenávat proto překopy všichni nahrál třídy a metody.

Všechny AOP implementace mají některé výrazy crosscutting, které zestruční každé znepokojení na jednom místě. Rozdíl mezi lžemi implementací u moci, bezpečí a použitelnost pojmů poskytovali. Například, interceptors to specifikovat metody zachytit expres omezená forma crosscutting, bez hodně podpory pro typ-bezpečí nebo ladění. AspectJ má množství takových výrazů a zestručňuje je ve třídě speciality, aspekt. Například, aspekt může změnit chování kódu základu (non-aspektová část programu) tím, že aplikuje radu (další chování) u různých spojovacích bodů (důvody k programu) specifikovaly v počítání nebo dotaz volal pointcut (to zachytí zda daný spojovací bod odpovídá si). Aspekt může také dělat binární-slučitelné změny struktury k jiným třídám, jako když přidá členy nebo rodiče.

Historie

AOP jako takový má množství předchůdců, návštěvnický designový vzor, Gregor Kiczales a jeho tým u oxeroxovat PARC je AspectJ (možná nejvíce populární univerzální AOP balíček), a jiní. IBM výzkumná skupina zdůraznila návaznost praxe modularizing starostí o minulou programovací praxi, a nabídl silnější (ale méně použitelný) hyperaktivní/J a dotýkat se prostředí manipulace, který neviděli široké použití. EmacsLisp changelog přidal AOP příbuzný kód ve verzi 19.28. Příklady v tomto článku používají AspectJ, zatímco to je nejvíce široce známý.

Motivace a základní pojmy

Typicky, aspekty jsou rozptýlené nebo spletité jako kód, dělat to tvrdější rozumět a tvrdit. To je rozptýleno na základě funkce (např. zaznamenávat) bytí se rozšířilo přes množství nespojené funkce, která by mohla používat jeho funkci, možná ve zcela nespojených systémech, různé zdrojové jazyky, etc. To chce se měnit zaznamenávat moci potřebovat upravit všechny zasažené moduly. Aspekty jsou spletité ne jediný s hlavní funkcí systémů ve kterém oni jsou vyjadřováni ale také spolu navzájem. To znamená měnící se jedno znepokojení znamená, že rozumí všem spletitým znepokojením nebo má nějaký prostředek který účinek změn může být odvozen.

Například, považovat bankovnictví za aplikaci s pojmově velmi jednoduchá metoda na přenášení množství od jednoho účtu k jinému:

 převod nicoty (účet fromAccount, účet toAccount, int dosahují) {
    jestliže (fromAccount.getBalance () < množství) {
      vrhat nový InsufficientFundsException (); 
   }
 
   fromAccount.withdraw (množství); 
    toAccount.deposit (množství); 
 }

Nicméně, tato metoda převodu přehlédne jistá uvažování, která by byla nutná pro dislokovanou aplikaci. To vyžaduje bezpečnostní kontroly ověřit, že aktuální uživatel má oprávnění vykonávat tuto operaci. Operace by měla být v transakci databáze aby předešel accidental ztráta dat. Pro diagnostiku, operace by měla být zaznamenávána k žurnálu systému. A tak dále. Zjednodušená verze se všemi těmi novými znepokojeními by se dívala poněkud jako toto:

 převod nicoty (účet fromAccount, účet toAccount, int dosahují) hodí Exception {
    jestliže (! getCurrentUser (). canPerform (operace _ převod )) {
      vrhat nový SecurityException (); 
   }
 
   jestliže (množství < 0) {
      vrhat nový NegativeTransferException (); 
   }
 
   Transakce tx = database.newTransaction (); 
    zkouška {
 
      jestliže (fromAccount.getBalance () < množství) {
         vrhat nový InsufficientFundsException (); 
      } 
       fromAccount.withdraw (množství); 
       toAccount.deposit (množství);
 
      tx.commit (); 
       systemLog.logOperation (operace _ převod, fromAccount, toAccount, množství); 
   } 
    chyt (Exception e) {
       tx.rollback (); 
       vrhat e; 
   } 
 }

V předchozím příkladě jiné zájmy staly se spletité se základní funkčností (někdy nazýval obchod logickým znepokojením). Transakce, bezpečnost, a zaznamenávat všechny ilustrovat kříž-ostrá znepokojení.

Také zvažovat, že co se stane jestliže my najednou potřebujeme měnit se (například) bezpečnostní okolnosti pro aplikaci. V programové aktuální verzi, bezpečnost-příbuzné operace vypadají rozptýlené přes četné metody, a takový změna by vyžadovala hlavní snahu.

Proto, my najdeme to kříž-ostrá znepokojení nejsou vhodně zestručněna v jejich vlastních modulech. Toto zvětšuje složitost systému a dělá evoluci značně těžší.

AOP pokouší se vyřešit tento problém tím, že dovolí programátorovi kříž expresu-ostrá znepokojení ve státě-osamocený moduly volaly aspekty. Aspekty mohou obsahovat radu (kód spojený k specifikovaným důvodům k programu) a pohřbít-napsat deklaracím (konstrukční prvky přidané k jiným třídám). Například, modul bezpečnosti může zahrnovat radu, která vykonává bezpečnostní kontrolu dříve zpřístupňovat bankovní účet. Pointcut definuje časy (se připojit k bodům) to bankovní účet může být zpřístupňován a kód v poradním těle vymezí jak bezpečnostní kontrola je realizována. Ta cesta, jak kontrola tak místa mohou být udržovaní na jednom místě. Další, dobrý pointcut může předvídat pozdnější programové změny, tak jestliže další vývojář vytvoří novou metodu přístupu bankovní účet, rada bude platit o nové metodě, když to vykoná.

AOP může být myšlenka jako nástroj ladění nebo jako uživatelský úrovňový nástroj. Rada by měla být rezervována pro případy kde vy nemůžete dostat funkce měnila (úroveň uživatele) (od Emacs dokumentace) nebo nechtějí měnit funkci ve výrobě kód (ladění).

Spojovací bodové modely

Rada-příbuzná součást aspektu-orientovaný jazyk definuje bod spoje modelovat (JPM). JPM definuje tři věci:

  • Když rada může běžet. Tito jsou voláni body spoje protože oni jsou důvody k odladěnému programu kde další chování může být užitečně spojené. Bod spoje potřebuje být adresovatelný a pochopitelný obyčejným programátorem být užitečný. To by mělo také být stabilní přes nedůležité programové změny v objednávce aspektu být stáj přes takové změny. Mnoho AOP implementací podporuje provádění metody a odkazy pole jako body spoje.
  • Způsob, jak specifikovat (nebo počítat) se připojit k bodům, nazvaný pointcuts. Pointcuts určuje zda daný spoj poukážou zápasy. Nejužitečnější pointcut jazyky používají syntax jako jazyk základu (např., jávské podpisy jsou používány pro AspectJ) a dovolit opětovné použití přes jmenovat a kombinace.
  • Prostředky ke kódu specifikování k běhu u spoje poukážou. V AspectJ, toto je voláno rada, a může běh dříve, po, a kolem spoj poukáže. Některé implementace také podporují věci jako když definuje metodu aspektu na další třídě.

Spojovací bodové modely mohou být srovnávány založený na spoji body exponovaly, jak body spoje jsou specifikovány, operace dovolily u bodů spoje a strukturální povznesení, která mohou jsou vyjádřena.

AspectJ je spojovací bodový model

  • Spojovací důvody k AspectJ zahrnují metodu nebo constructor hovor nebo poprava, inicializace třídy nebo namítat, pole číst a psát přístup, obsluhovači výjimek, etc. Oni nezahrnují smyčky, výborné hovory, hodí klauzule, rozmanitá sdělení, etc.
  • Pointcuts je specifikován kombinacemi primitivních pointcut označovatelů (PCDs).
 poprava (* soubor * (* ))

“Dynamický” PCDs kontroluje běhové typy a váže proměnné. Například

  toto (bod)

“Rozsah” PCDs omezí lexikální možnosti bodu spoje. Například

 uvnitř (com.company. *)

Pointcuts může být složený a pojmenovaný pro opětovné použití. Například

pointcut soubor (): poprava (* soubor * (*)) a a toto (bod) a a uvnitř (com.company. *);
  • Rada specifikuje k běhu (dříve, po, nebo kolem) u bodu spoje (specifikovaného s pointcut) jistý kód (specifikovaný jako kód v metodě). Rada je použil automaticky AOP provozní když pointcut odpovídá bodu spoje. Tady je příklad tohoto
  • :
po (): soubor () {
    Display.update (); 
}

Jiné potenciální spojovací bodové modely

Tam jsou jiné druhy JPMs. Všechny jazyky rady mohou být definovány v podmínkách jejich JPM. Například hypotetický aspektový jazyk pro UML může mít pokračování JPM:

  • Body spoje jsou všechny elementy modelu
  • .
  • Pointcuts je nějaký booleovský výraz kombinovat elementy modelu
  • .
  • Prostředky ovlivnit u těchto body jsou vizualizace celého vyrovnaného spoje poukáže
  • .

Pohřbít-deklarace typu

Pohřbít-deklarace typu poskytují způsob, jak vyjádřit crosscutting znepokojení ovlivňovat strukturu modulů. Také známý jako otevřené třídy, toto umožní programátorům vyjádřit se v jedněch členech místa nebo rodičích další třídy, typicky aby spojil celý kód příbuzný znepokojení v jednom aspektu. Například, jestliže crosscutting ukážou-aktualizační znepokojení bylo místo toho realizoval návštěvníky používání, pohřbít-psát deklarační používání vzor návštěvníka vypadá jako toto v AspectJ:

  aspekt DisplayUpdate {
     neplatný Point.acceptVisitor (návštěvník v) {
       v.visit (toto); 
    } 
     / / jiný kód crosscutting... 
  }

To je požadavek, že nějaká strukturální sčítání jsou slučitelná s třídou originálu, tak to klienti existující třídy pokračují operovat, ledaže AOP implementace může čekat, že řídí všechny klienty vždy.

Implementace

Jsou tam dva různé způsoby AOP programy mohou ovlivnit jiné programy, se spoléhat na základové jazyky a prostředí: (1) spojený program je produkován, platný v jazyce originálu a nerozeznatelný od obyčejného programu ke konečnému interpretovi; a (2) konečný interpret nebo prostředí je aktualizováno rozumět a realizovat AOP rysy. Obtíž prostředků změnění prostředí většina implementací produkuje slučitelné kombinační programy přes proces, který přišel být známý jako tkaní. Stejný AOP jazyk může být realizován přes paletu technik tkaní, tak sémantika jazyka by měla nikdy být dohodnutá v podmínkách realizace tkaní. Jen rychlost implementace a jeho snadnost rozmístění jsou postižení kterým metoda kombinace je používána.

Zdroj-tkaní úrovně může být uskutečněno používat preprocesory (jak C + + byl uskutečněn původně v CFront) to vyžadovat přístup k programovým zdrojovým souborům. Nicméně, Java je přesně stanovená binární forma umožní bytecode tkadlce k práci s nějakým jávským programem in.class-file forma. Bytecode tkadlcové mohou být nasazeni během stavět proces nebo, jestliže tkát model je na-prvotřídní, během nakládání třídy. AspectJ začínal zdrojem-tkaní úrovně v roce 2001, doručoval na-třída bytecode tkadlce v roce 2002 a nabídnutý pokročilý náklad-podpora času po začleněnní AspectWerkz v roce 2005.

Nějaké řešení, které kombinuje programy u provozní musí poskytovat pohledy, které oddělí je vhodně udržovat programátora je oddělený model. Jávské bytecode podpora pro vícenásobné zdrojové soubory umožní nějaký ladící program ke kroku přes vhodně woven.class soubor v editoru zdroje. Nicméně, některé odjinud pocházející dekompilátory jsou neschopné procesového tkaného kódu, protože oni čekají kód produkoval Javac spíše než všichni podporovali bytecode formy (vidět také “problémy”, dole).

Další alternativa je dislokovat-měřit tkaní. Toto v podstatě implikuje poštu-zpracování, ale spíše než zalátat vytvořený kód, tento přístup tkaní existování podtříd řadí tak že modifikace jsou představeny metodou-prvořadý. Existující třídy zůstanou nedotčené, dokonce u provozní, a všechny existující nástroje (debuggery, profilery, etc.) moci být používán během vývoje. Podobný přístup už se osvědčil v realizaci mnoha jávské EE aplikace servery, takový jak IBM je WebSphere.

Terminologie

Pokračování jsou někteří standardní terminologie používaná v Aspect-orientované programování:

  • Kříž-ostrá znepokojení: Dokonce ačkoli většina tříd v OO modelu bude zastávat jednu, přesnou funkci, oni často sdílejí obyčejné, druhotné požadavky s jinými třídami. Například, my můžeme chtít sčítat zaznamenávat ke třídám uvnitř dat-přístupová vrstva a také ke třídám v UI vrstvě kdykoli nit vstoupí nebo vystoupí z metody. Dokonce ačkoli primární funkčnost každé třídy je velmi odlišná, kód potřeboval vykonávat druhotnou funkčnost je často totožný.
  • Rada: Toto je další kód že vy chcete platit o vašem existujícím modelu. V našem příkladě, toto je zaznamenávat kód to my chceme platit vždy, když nit vstoupí nebo vystoupí z metody.
  • Pointcut: Toto je termín daný bodu popravy v aplikaci u kterého kříže-ostrý znepokojení potřebuje být aplikován. V našem příkladě, pointcut je podáván když nit zadá metodu a další pointcut je podáván když nit vystoupí z metody.
  • Aspekt: Kombinace pointcut a rady je nazývaná aspekt. V příkladě dole, my sčítáme zaznamenávat aspekt k naší aplikaci tím, že definuje pointcut a dává správnou radu.

Přirovnání k jiným programovacím vzorům

Aspekty objevily se ven objektově orientovaného programování a výpočetní odraz. AOP jazyky mají funkčnost podobný k, ale omezenější než metaobject protokoly. Aspekty souvisejí blízko k programovacím pojetím jako předměty, mixins a delegace. Jiné způsoby, jak používat aspekt-orientované programovací vzory zahrnují Composition filtry a přístup hyperslices. Protože přinejmenším sedmdesátá léta, vývojáři používali formy zastavení a odeslání-zalátat to být podobný některým těm technikám implementace pro AOP, ale tito nikdy měli sémantiku že crosscutting specifikace byly psány na jednom místě.

Návrháři zvažovali alternativní způsoby, jak dosáhnout oddělení kódu, takový jak C # ' s částečné typy ale takové přístupy postrádají mechanismus počítání, který dovolí dosáhnout několika spojovacích bodů kódu s jedním declarative sdělení.

Rizika přijetí

Jak se všemi nezralými technologiemi, rozšířené přijetí AOP je komplikováno nedostatkem podpory nástroje a rozšířeného vzdělání. Někteří argumentují, že zpomalení kroku je vhodné kvůli AOP neodmyslitelné schopnosti vytvořit nepředvídatelné a rozšířené chyby v systému. Záležitosti realizace některých AOP jazyků znamenají to něco jak jednoduchý jak přejmenovávat funkci může vedení k aspektu už ne být aplikovaný vést k účinkům negativní stránky.

Programátoři potřebují být schopný číst kód a rozumět, že co se stane v rozkazu předejít chybám. Zatímco oni stali se zvyklí na zamítnutí detaily odeslání metody nebo nádoby-dodával chování, mnoho být nepříjemný ohledně názoru, že aspekt může být napíchnut později přidávat chování k jejich kódu. Tam být také platný bezpečnost se ptá toho kódu plést vzestupy.

Někteří programátoři proto namítají proti všem formám bytecode tkaní. AOP implementace jsou zvláštní starost o je protože jeho převládání. Jedna odezva v Javě má podpisovat a těsnit the.jar soubory a předejít prostředím od dislokovat tkající třídní zavaděče ovlivňovat jejich kód, ale v některých případech prostředí rozmístění není pod jejich kontrolou.

Dokonce s pořádným vzděláním, rozumějící crosscutting znepokojení mohou být těžká bez pořádné podpory pro představovat si jak statickou strukturu tak dynamický proud programu. Si představovat crosscutting znepokojení jen začne být podporován v IDEs, jak je podpora pro kód aspektu pomáhat a refactoring.

Daný síla AOP, jestliže programátor udělá logickou chybu v vyjadřovat crosscutting, to může vést k rozšířené programové poruše. Naopak, další programátor může měnit spojovací důvody k programu – např., tím, že přejmenuje nebo přesune metody – v cestách, které nebyly předvídané spisovatelem aspektu, s neúmyslnými následky. Jedna výhoda modularizing crosscutting znepokojení umožní jednomu programátorovi postihnout celý systém snadno; jako výsledek, takový dar problémů jak konflikt nad zodpovědností mezi dva nebo více vývojářů pro danou poruchu. Otevřené otázky právní povinnosti v takových případech mohou také ovlivňovat některé odmítnout bytecode tkaní dohromady. Nicméně, řešení pro tyto problémy může být hodně snadnější v přítomnosti AOP, protože jediný potřeba aspektu být měněn, zatímco korespondenční problémy bez AOP mohou jít docela těžko stanovit.

Bytecode decompilation a tkaní rostlo jako implementační metoda na mnoho přístupů včetně modelu-umístěný programovací. Brzy realizace té technologie mohou adresovat jen podmnožina jávského bytecode produkovala Javac, kompilátor standardu, a tak propadnout když se setká s platnými bytecode produkovanými tkadlci, kteří by nikdy byli vytvoření Javac. Tyto problémy mohou trvat nějakou dobu vytřídit od té doby, co tam je nemnoho vývojářů obeznámených s bytecode internals. Mezitím, programovací týmy by mohly muset si vybrat mezi dvěma neslučitelnými rozvojovými technologiemi.

Použití vedlejších metodologií takový jako test-řízený vývoj nebo automatizace testu mohou omezit některá ty rizika spojená s upotřebením AOP. Ujištění, že aspekt dělá ne záporně ovlivnit originál záměr autora může být ověřen přes zkoušky za jízdy. Zaměstnávat AOP bez takový záchranná síť je děsivá k mnoha programátorům, obzvláště ti kdo být neobeznámený s metodologiemi zaměstnanými zodpovědnými praktiky AOP.

Implementace

  • Pro Koala:
    • AspectKoala
  • Pro podrobnější informace (skutečné implementace):

Viz též

Publikace

Externí odkazy