Aspektově orientované programování: Porovnání verzí

m
Robot: přidáno {{Autoritní data}}; kosmetické úpravy
m (→‎Historie: ++odkazy)
m (Robot: přidáno {{Autoritní data}}; kosmetické úpravy)
'''Aspektově orientované programování''' (zkracováno na '''AOP''', z anglického '''Aspect Oriented Programming''') je [[programovací paradigma]], které má za cíl zvýšit modularitu programu. Pokouší se rozdělit program na jasné části, které se mezi sebou co nejméně překrývají svou funkcionalitou.
AOP se začalo hojně používat zejména v roce 2004.
== Úvod ==
Většina programovacích paradigmat podporuje určitou úroveň seskupení a zapouzdření dat do samostatných, nezávislých subjektů. Některé však vzdorují této formě implementace a jsou nazývány ''průřezové problémy ([[cross-cutting concerns|crosscutting concerns]])'', protože se nachází ve více částech programu.
AOP má za cíl nahradit v kódu opakující se činnosti, vzorovým příkladem průřezového problému je
[[Log|logovánílog]]ování, protože se týká každé jednotlivé logované části programu. Logování tedy ''prořezává'' všechny logované třídy, metody i procedury.
Všechny implementace AOP mají nějaké průřezové výrazy, které zapouzdří danou činnost na konkrétním místě. Rozdíl mezi implementacemi spočívá v náročnosti, bezpečnosti a použitelnosti poskytnutých konstrukcí. [[AspectJ]] má řadu těchto výrazů a zapouzdřuje je ve speciální třídě, zvané [[Aspekt (programování)|aspekt]]. Aspekt může upravit chování základního kódu (neaspektové části programu) použitím ''advice'' (dodatečné chování) v různých ''joinpoints'' (body ve struktuře programu), zvaný ''pointcut'' (soubor joinpointů, pro které je spouštěna stejná advice). Aspekt také může dělat binárně kompatibilní strukturální změny jiných tříd, což je například přidání členů nebo rodičů.
 
[[Microsoft Transaction Server]] je považován za první hlavní použití AOP následovaný [[Enterprise Java Beans]].
 
== Typy aspektově orientovaného programování ==
AOP se dá rozdělit na statické a dynamické. Statické AOP poskytuje například [[AspectJ]] a dynamické [[Spring Framework]].
 
=== Statické AOP ===
Statické AOP je rychlejší než dynamické, jelikož [[aspect weaver|weaving]] (proces vkládání aspektů do aplikace) probíhá již při buildu aplikace, přibývá zde další krok, avšak kód AOP již při běhu aplikace nelze měnit. Potřebujeme-li tedy udělat jakoukoli změnu za běhu aplikace, jsme nuceni k opětovné kompilaci celé aplikace. Statické AOP se používá například v již zmiňovaném AspectJ.
=== Dynamické AOP ===
Dynamické AOP je sice, oproti statickému, pomalejší, ale můžeme měnit kód zcela nezávisle na aplikaci. Změny v AOP tedy neznamenají nutnou opětovnou kompilaci celé aplikace. Je to způsobené tím, že u dynamických AOP probíhá weaving až při běhu aplikace. U různých implementací je toho dosaženo za pomoci různých technik, nejčastěji je však používáno proxy pro každý objekt, který využívá aspekty.
 
== Motivace a základní koncepty ==
Aspekt je typicky rozptýlen jako kód, takže není zcela lehké ho pochopit a udržovat. Aspekt je rozptýlen na základě funkce (například logování) a je rozložen do několika nesouvisejících funkcí, které by mohly používat jeho funkce, případně ve zcela nesouvisejících systémech, různých zdrojových jazycích atd. To znamená, že ke změně logování může vyžadovat modifikaci všech dotyčných modulů. Aspekty nejsou “zamotané” pouze s hlavními funkcemi systému, ve kterém jsou vyjádřené, ale i mezi sebou navzájem.
Například si představme bankovní aplikaci s koncepčně velmi jednoduchou metodou na převod částky z jednoho účtu na druhý:<ref>Poznámka: Pro ukázky v tomto článku je použita syntaxe jazyka [[Java (programovací jazyk) | Java]].</ref>
 
<source lang="java">
</source>
 
== Join point modely (JPM) ==
Způsob spolupráce aspektu s programem je definován v ''join point modelu'' (z anglického join point model). JPM definuje tři věci:
Join points - místa, do kterých je možné do kódu vložit logiku pomocí AOP
Advice - kód, který se spouští v ''join'' pointu, může se spouštět před (''before'') i za (''after'') ''join pointem''
Pointcut - je soubor ''join pointů'', ve kterých je spuštěna stejná ''advice''
== Srovnání s jinými programovacími paradigmaty ==
Aspekty vycházejí z [[Objektově orientované programování|objektově orientovaného programování]] (OOP). AOP jazyky nabízí podobné funkce jako [[metaobject]] protokoly. Aspekty úzce souvisí s programovacími koncepty jako [[Subjekty (programování)|subjekty]], [[mixin]]y a [[Delegace (programování)|delegace]]. Již od roku 1970 vývojáři používali formy odposlechu (interception) a záplatování (dispatch-patching), které se podobají některým ze způsobů implementace pro AOP, ale nikdy nebyly označovány jako ''cross cutting'' specifikace a sepsány na jednom místě. Návrháři zvažovali i jiné způsoby, jak dosáhnout odděleného kódu, jako jsou například dílčí typy (partial types) v C#, těmto přístupům však chybí kvantifikační mechanismus, který umožňuje propojení několika ''join pointů'' s jednou deklarací.
 
== Reference ==
<references />
{{Autoritní data}}
 
[[Kategorie:Paradigmata programování]]
1 430 051

editací