CINXE.COM

Aspektorientierte Programmierung – Wikipedia

<!DOCTYPE html> <html class="client-nojs" lang="de" dir="ltr"> <head> <meta charset="UTF-8"> <title>Aspektorientierte Programmierung – Wikipedia</title> <script>(function(){var className="client-js";var cookie=document.cookie.match(/(?:^|; )dewikimwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":[",\t.",".\t,"],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"wgRequestId":"5639e757-c3f7-4fcb-8a4e-54e033e7c9d2","wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"Aspektorientierte_Programmierung","wgTitle":"Aspektorientierte Programmierung","wgCurRevisionId":244861570,"wgRevisionId":244861570,"wgArticleId":75816,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null, "wgUserGroups":["*"],"wgCategories":["Programmierparadigma"],"wgPageViewLanguage":"de","wgPageContentLanguage":"de","wgPageContentModel":"wikitext","wgRelevantPageName":"Aspektorientierte_Programmierung","wgRelevantArticleId":75816,"wgIsProbablyEditable":true,"wgRelevantPageIsProbablyEditable":true,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgNoticeProject":"wikipedia","wgCiteReferencePreviewsActive":true,"wgFlaggedRevsParams":{"tags":{"accuracy":{"levels":1}}},"wgStableRevisionId":244861570,"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault":true,"wgPopupsFlags":0,"wgVisualEditor":{"pageLanguageCode":"de","pageLanguageDir":"ltr","pageVariantFallbacks":"de"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":true,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":30000,"wgRelatedArticlesCompat":[],"wgCentralAuthMobileDomain":false,"wgEditSubmitButtonLabelPublish":true,"wgULSPosition":"interlanguage", "wgULSisCompactLinksEnabled":true,"wgVector2022LanguageInHeader":false,"wgULSisLanguageSelectorEmpty":false,"wgWikibaseItemId":"Q30267","wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"],"GEHomepageSuggestedEditsEnableTopics":true,"wgGETopicsMatchModeEnabled":false,"wgGEStructuredTaskRejectionReasonTextInputEnabled":false,"wgGELevelingUpEnabledForUser":false};RLSTATE={"ext.gadget.citeRef":"ready","ext.gadget.defaultPlainlinks":"ready","ext.gadget.dewikiCommonHide":"ready","ext.gadget.dewikiCommonLayout":"ready","ext.gadget.dewikiCommonStyle":"ready","ext.gadget.NavFrame":"ready","ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.pygments":"ready","ext.cite.styles":"ready","skins.vector.styles.legacy":"ready","ext.flaggedRevs.basic":"ready","mediawiki.codex.messagebox.styles":"ready", "ext.visualEditor.desktopArticleTarget.noscript":"ready","codex-search-styles":"ready","ext.uls.interlanguage":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["ext.pygments.view","ext.cite.ux-enhancements","site","mediawiki.page.ready","mediawiki.toc","skins.vector.legacy.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.flaggedRevs.advanced","ext.gadget.createNewSection","ext.gadget.WikiMiniAtlas","ext.gadget.OpenStreetMap","ext.gadget.CommonsDirekt","ext.gadget.donateLink","ext.urlShortener.toolbar","ext.centralauth.centralautologin","mmv.bootstrap","ext.popups","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.compactlinks","ext.uls.interface","ext.cx.eventlogging.campaigns","ext.checkUser.clientHints","ext.growthExperiments.SuggestedEditSession","wikibase.sidebar.tracking"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=de&amp;modules=codex-search-styles%7Cext.cite.styles%7Cext.flaggedRevs.basic%7Cext.pygments%2CwikimediaBadges%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cmediawiki.codex.messagebox.styles%7Cskins.vector.styles.legacy%7Cwikibase.client.init&amp;only=styles&amp;skin=vector"> <script async="" src="/w/load.php?lang=de&amp;modules=startup&amp;only=scripts&amp;raw=1&amp;skin=vector"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=de&amp;modules=ext.gadget.NavFrame%2CciteRef%2CdefaultPlainlinks%2CdewikiCommonHide%2CdewikiCommonLayout%2CdewikiCommonStyle&amp;only=styles&amp;skin=vector"> <link rel="stylesheet" href="/w/load.php?lang=de&amp;modules=site.styles&amp;only=styles&amp;skin=vector"> <meta name="generator" content="MediaWiki 1.44.0-wmf.4"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="noindex,nofollow,max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:title" content="Aspektorientierte Programmierung – Wikipedia"> <meta property="og:type" content="website"> <link rel="preconnect" href="//upload.wikimedia.org"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//de.m.wikipedia.org/wiki/Aspektorientierte_Programmierung"> <link rel="alternate" type="application/x-wiki" title="Seite bearbeiten" href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit"> <link rel="apple-touch-icon" href="/static/apple-touch/wikipedia.png"> <link rel="icon" href="/static/favicon/wikipedia.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="Wikipedia (de)"> <link rel="EditURI" type="application/rsd+xml" href="//de.wikipedia.org/w/api.php?action=rsd"> <link rel="canonical" href="https://de.wikipedia.org/wiki/Aspektorientierte_Programmierung"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de"> <link rel="alternate" type="application/atom+xml" title="Atom-Feed für „Wikipedia“" href="/w/index.php?title=Spezial:Letzte_%C3%84nderungen&amp;feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="skin-vector-legacy mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject mw-editable page-Aspektorientierte_Programmierung rootpage-Aspektorientierte_Programmierung skin-vector action-view"><div id="mw-page-base" class="noprint"></div> <div id="mw-head-base" class="noprint"></div> <div id="content" class="mw-body" role="main"> <a id="top"></a> <div id="siteNotice"><!-- CentralNotice --></div> <div class="mw-indicators"> </div> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Aspektorientierte Programmierung</span></h1> <div id="bodyContent" class="vector-body"> <div id="siteSub" class="noprint">aus Wikipedia, der freien Enzyklopädie</div> <div id="contentSub"><div id="mw-content-subtitle"></div></div> <div id="contentSub2"></div> <div id="jump-to-nav"></div> <a class="mw-jump-link" href="#mw-head">Zur Navigation springen</a> <a class="mw-jump-link" href="#searchInput">Zur Suche springen</a> <div id="mw-content-text" class="mw-body-content"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p><b>Aspektorientierte Programmierung</b> (<b>AOP</b>) ist ein <a href="/wiki/Programmierparadigma" title="Programmierparadigma">Programmierparadigma</a> für die <a href="/wiki/Objektorientierte_Programmierung" title="Objektorientierte Programmierung">objektorientierte Programmierung</a>, um generische Funktionalitäten über mehrere Klassen hinweg zu verwenden (<a href="/wiki/Cross-Cutting_Concern" title="Cross-Cutting Concern">Cross-Cutting Concern</a>). Logische <i>Aspekte</i> eines <a href="/wiki/Anwendungsprogramm" class="mw-redirect" title="Anwendungsprogramm">Anwendungsprogramms</a> werden dabei von der eigentlichen Geschäftslogik getrennt. Typische Anwendungsbeispiele sind <a href="/wiki/Transaktion_(Informatik)" title="Transaktion (Informatik)">Transaktionsverwaltung</a>, <a href="/wiki/Audit" title="Audit">Auditfähigkeit</a> und <a href="/wiki/Logging" title="Logging">Loggingverhalten</a>. </p><p>Das Konzept von AOP wurde von Gregor Kiczales und seinem Team am <a href="/wiki/Xerox_PARC" title="Xerox PARC">Xerox PARC</a> entwickelt. Im Jahr 2001 wurde dort auch die erste AOP-Sprache <a href="/wiki/AspectJ" title="AspectJ">AspectJ</a> vorgestellt. </p> <div id="toc" class="toc" role="navigation" aria-labelledby="mw-toc-heading"><input type="checkbox" role="button" id="toctogglecheckbox" class="toctogglecheckbox" style="display:none" /><div class="toctitle" lang="de" dir="ltr"><h2 id="mw-toc-heading">Inhaltsverzeichnis</h2><span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div> <ul> <li class="toclevel-1 tocsection-1"><a href="#Motivation"><span class="tocnumber">1</span> <span class="toctext">Motivation</span></a></li> <li class="toclevel-1 tocsection-2"><a href="#Hintergrund"><span class="tocnumber">2</span> <span class="toctext">Hintergrund</span></a></li> <li class="toclevel-1 tocsection-3"><a href="#Ableitung_aus_früheren_Paradigmen"><span class="tocnumber">3</span> <span class="toctext">Ableitung aus früheren Paradigmen</span></a> <ul> <li class="toclevel-2 tocsection-4"><a href="#Vergleiche"><span class="tocnumber">3.1</span> <span class="toctext">Vergleiche</span></a></li> <li class="toclevel-2 tocsection-5"><a href="#Analogie"><span class="tocnumber">3.2</span> <span class="toctext">Analogie</span></a></li> <li class="toclevel-2 tocsection-6"><a href="#Technische_Betrachtung"><span class="tocnumber">3.3</span> <span class="toctext">Technische Betrachtung</span></a></li> </ul> </li> <li class="toclevel-1 tocsection-7"><a href="#Einsatzgebiete"><span class="tocnumber">4</span> <span class="toctext">Einsatzgebiete</span></a></li> <li class="toclevel-1 tocsection-8"><a href="#Joinpoint_vs._Joinpoint_shadow"><span class="tocnumber">5</span> <span class="toctext">Joinpoint vs. Joinpoint shadow</span></a></li> <li class="toclevel-1 tocsection-9"><a href="#Beispiel"><span class="tocnumber">6</span> <span class="toctext">Beispiel</span></a> <ul> <li class="toclevel-2 tocsection-10"><a href="#Einführendes_Beispiel"><span class="tocnumber">6.1</span> <span class="toctext">Einführendes Beispiel</span></a></li> <li class="toclevel-2 tocsection-11"><a href="#Weiterführendes_Beispiel"><span class="tocnumber">6.2</span> <span class="toctext">Weiterführendes Beispiel</span></a></li> <li class="toclevel-2 tocsection-12"><a href="#Begriffe"><span class="tocnumber">6.3</span> <span class="toctext">Begriffe</span></a></li> </ul> </li> <li class="toclevel-1 tocsection-13"><a href="#Typische_Aufgaben"><span class="tocnumber">7</span> <span class="toctext">Typische Aufgaben</span></a></li> <li class="toclevel-1 tocsection-14"><a href="#Ähnliche_Lösungsansätze"><span class="tocnumber">8</span> <span class="toctext">Ähnliche Lösungsansätze</span></a></li> <li class="toclevel-1 tocsection-15"><a href="#Anmerkungen"><span class="tocnumber">9</span> <span class="toctext">Anmerkungen</span></a></li> <li class="toclevel-1 tocsection-16"><a href="#Siehe_auch"><span class="tocnumber">10</span> <span class="toctext">Siehe auch</span></a></li> <li class="toclevel-1 tocsection-17"><a href="#Literatur"><span class="tocnumber">11</span> <span class="toctext">Literatur</span></a></li> <li class="toclevel-1 tocsection-18"><a href="#Weblinks"><span class="tocnumber">12</span> <span class="toctext">Weblinks</span></a></li> <li class="toclevel-1 tocsection-19"><a href="#Einzelnachweise"><span class="tocnumber">13</span> <span class="toctext">Einzelnachweise</span></a></li> </ul> </div> <div class="mw-heading mw-heading2"><h2 id="Motivation">Motivation</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=1" title="Abschnitt bearbeiten: Motivation" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=1" title="Quellcode des Abschnitts bearbeiten: Motivation"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Software hat grundsätzlich bestimmte Aufgaben/Anforderungen zu erfüllen. Diese Anforderungen kann man grob in zwei Bereiche gliedern: </p> <ol><li>Die sogenannten <i>Core-Level-Concerns</i> (betreffen den logischen „Kern“ der Anwendung) oder funktionale Anforderungen. Dies sind Anforderungen an die Software, die man meist gut in einzelnen Funktionen kapseln kann. Ein Beispiel wäre die Berechnung eines Wertes.</li> <li>Die <i>System-Level-Concerns</i> (betreffen das gesamte System) oder technische Randbedingungen. Diese Anforderungen können nicht einfach gekapselt werden, da sie an vielen Stellen implementiert werden müssen. Ein Paradebeispiel dafür ist das <i>Logging</i>, die Protokollierung des Programmablaufs in Logdateien. Der Aufruf des Loggers ist für die eigentliche Funktionalität nicht notwendig, muss aber trotzdem in den Quelltext integriert werden. Ein weiteres Beispiel wäre die Transaktionierung von Zugriffen auf eine Ressource wie z.&#160;B. eine Datenbank.</li></ol> <p>Diese beiden Teile sind miteinander verwoben. Die Core-Level-Concerns kann man als Komponenten bezeichnen, und die System-Level-Concerns sind die Aspekte. Core-Level-Concerns werden üblicherweise als <a href="/wiki/Modul_(Software)" title="Modul (Software)">Module</a> oder <a href="/wiki/Objekt_(Programmierung)" title="Objekt (Programmierung)">Objekte</a> implementiert. Für die Aspekte gab es vor der aspektorientierten Programmierung keine elegante Lösung. </p><p>Das Problem der miteinander verwobenen Anforderungen wird auch als <a href="/wiki/Cross-Cutting_Concern" title="Cross-Cutting Concern">Cross-Cutting Concerns</a> bezeichnet, denn sie „schneiden“ quer durch alle logischen Schichten des Systems. AOP ist das Werkzeug, um die logisch unabhängigen Belange auch physisch voneinander zu trennen. Dabei wird angestrebt, Code zu erzeugen, der besser <a href="/wiki/Wartung" title="Wartung">wartbar</a> und <a href="/wiki/Wiederverwendung" title="Wiederverwendung">wiederverwendbar</a> ist. </p><p>In diesem Zusammenhang sind <i>System-Level-Concerns</i> aber nicht gleichzusetzen mit rein technischen Belangen. Auch fachliche Belange wie z.&#160;B. die Umsetzung eines eigenen, fachlichen Berechtigungssystems für Benutzer können durchaus Aspektcharakter haben. </p> <div class="mw-heading mw-heading2"><h2 id="Hintergrund">Hintergrund</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=2" title="Abschnitt bearbeiten: Hintergrund" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=2" title="Quellcode des Abschnitts bearbeiten: Hintergrund"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>In der Geschichte der Entwicklung der <a href="/wiki/Programmiersprache" title="Programmiersprache">Programmiersprachen</a> wurden immer wieder neue Konzepte der Programmierung und diese implementierende Hochsprachen entwickelt, angefangen bei der Programmierung in <a href="/wiki/Assemblersprache" title="Assemblersprache">Assembler</a>, welche das direkte Programmieren in <a href="/wiki/Bin%C3%A4rcode" title="Binärcode">Binärcode</a> ablöste, über prozedurales und funktionales Programmieren, bis hin zu den heute aktuellen objektorientierten Sprachen. Der Zweck ist, den Entwicklern die Arbeit zu erleichtern und somit eine bessere Effizienz in der Entwicklung der Software zu erzielen. Eines der zugrundeliegenden Prinzipien, das bei allen neuen Programmierkonzepten angewendet wurde, war das der Kapselung von Funktionalität. </p> <ul><li><a href="/wiki/Assemblersprache" title="Assemblersprache">Assemblersprachen</a> kapseln hardwareabhängige Binärbefehle für <a href="/wiki/Arbeitsspeicher" title="Arbeitsspeicher">Arbeitsspeicher</a> und <a href="/wiki/Register_(Computer)" class="mw-redirect" title="Register (Computer)">Registerzugriffe</a> in kurzen, generalisierten <a href="/wiki/Zeichenkette" title="Zeichenkette">Zeichenketten</a>, und befreien den Softwareentwickler damit von der Notwendigkeit, sich mit dem detaillierten Aufbau der gesamten <a href="/wiki/Hardware" title="Hardware">Rechnerhardware</a> zu beschäftigen.</li> <li><a href="/wiki/Prozedurale_Programmiersprache" class="mw-redirect" title="Prozedurale Programmiersprache">Prozedurale Sprachen</a> erlauben die Kapselung einfacher Funktionen, wie das Sortieren einer Namensliste, innerhalb einer <a href="/wiki/Prozedur_(Programmierung)" title="Prozedur (Programmierung)">Prozedur</a>. Damit entfällt die Notwendigkeit von Zeilennummern und daran gebundenen Sprungbefehlen sowie das mehrfache Entwickeln derselben <a href="/wiki/Funktion_(Programmierung)" title="Funktion (Programmierung)">Funktion</a> an verschiedenen Stellen des Programmcodes.</li> <li><a href="/wiki/Objektorientierte_Programmiersprache" class="mw-redirect" title="Objektorientierte Programmiersprache">Objektorientierte Programmiersprachen</a> erlauben die Kapselung konzeptionell zusammengehöriger Funktionen und Variablen in unabhängigen Modulen (Klassen) mit klar definierten Schnittstellen, wodurch die <a href="/wiki/Wiederverwendbarkeit" title="Wiederverwendbarkeit">Wiederverwendbarkeit</a> der einzelnen Module erhöht wird und der Softwareentwickler davon befreit ist, sich mit der internen Implementierung der von ihm verwendeten Klassen auseinanderzusetzen.</li></ul> <p>Eine erweiterte Funktionalität zu ermöglichen, ist nicht Ziel dieser Entwicklung, weil jede Hochsprache nach der Kompilierung auf Maschinencode abgebildet wird. </p><p>Insbesondere erleichtert die Kapselung von Funktionalität die Entwicklung von Software, indem Wartbarkeit und Wiederverwendbarkeit existierenden Programmcodes erhöht werden. Da <a href="/wiki/Software" title="Software">Software</a> im Laufe der Zeit immer komplexer und umfangreicher wird, und damit die Entwicklung zeitaufwendiger und teurer, gewannen diese beiden Ziele immer mehr an Bedeutung und sind heute zentrale Elemente bei der Entwicklung neuer Programmierkonzepte und -sprachen. </p><p>Bei AOP (aspect-oriented programming bzw. aspektorientierte Programmierung) handelt es sich um ein Programmierkonzept, welches das Problem der sogenannten <a href="/wiki/Cross-Cutting_Concern" title="Cross-Cutting Concern">Cross-Cutting Concerns</a> behandelt. </p><p>Die kostengünstige und termingerechte Entwicklung und Wartung qualitativ hochwertiger <a href="/wiki/Software" title="Software">Software</a> ist das Primärziel des <a href="/wiki/Software_Engineering" class="mw-redirect" title="Software Engineering">Software Engineering</a>. Um dieses Ziel zu erreichen, ist eine möglichst <a href="/wiki/Modul_(Software)" title="Modul (Software)">modularisierte Software</a> mit einer möglichst geringen <a href="/wiki/Komplexit%C3%A4t" title="Komplexität">Komplexität</a> der Module notwendig. </p><p>In einem konventionellen System, wobei hier auch die objektorientierten Ansätze hinzugehören, können Kernfunktionalitäten, englisch <i>core concerns</i>, für sich allein betrachtet nach den Regeln der Kunst sauber in Module getrennt werden. Es gibt jedoch <i>concerns</i> (Anliegen, Belange, Anforderungen) wie Fehlerbehandlung, <a href="/wiki/Rechenleistung" title="Rechenleistung">Performance</a> und Sicherheit in jedem System, die die Kernfunktionalitäten quer schneiden (eng. <i>cross cut</i>) und sich deshalb nicht eindeutig einem Software-Modul zuordnen lassen. Dies führt dazu, dass Fragmente solcher <i>cross cutting concerns</i> (quer schneidende Kernfunktionalitäten <i>(übergreifende Anforderungen)</i> – fehlende <a href="/wiki/Koh%C3%A4sion_(Informatik)" title="Kohäsion (Informatik)">Kohäsion</a>) nicht zugeordnet und ungekapselt im ganzen Code verstreut sind. Diese quer schneidenden Kernfunktionalitäten verhindern in konventionellen Softwaresystemen eine saubere Modularisierung und beeinträchtigen Pflege, Verständlichkeit, Wiederverwendbarkeit und (Rück-)Verfolgbarkeit. Verantwortlich hierfür ist bei konventionellen <a href="/wiki/Programmiersprache" title="Programmiersprache">Programmiersprachen</a> die <a href="/w/index.php?title=Systemdekomposition&amp;action=edit&amp;redlink=1" class="new" title="Systemdekomposition (Seite nicht vorhanden)">Systemdekomposition</a>, die nur eine Dimension zulässt – die Liste von Funktionen. Dieses Phänomen nennt man auch <i>dominante Dekomposition</i>. Mit anderen Worten: ein natürlicherweise mehrdimensionales Problem muss eindimensional gelöst werden. </p> <div class="mw-heading mw-heading2"><h2 id="Ableitung_aus_früheren_Paradigmen"><span id="Ableitung_aus_fr.C3.BCheren_Paradigmen"></span>Ableitung aus früheren Paradigmen</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=3" title="Abschnitt bearbeiten: Ableitung aus früheren Paradigmen" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=3" title="Quellcode des Abschnitts bearbeiten: Ableitung aus früheren Paradigmen"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>In der prozeduralen Programmierung ist die Ausführung von Code vergleichsweise linear. Durch Verfolgung der Symbole ist jeder einzelne Programmschritt auch bei der Betrachtung eines Teilsystems direkt nachvollziehbar. Beispiel in <i>C</i>: </p> <div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">function</span><span class="w"> </span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">c</span><span class="p">)</span> <span class="p">{</span> <span class="w"> </span><span class="n">Component_repaint</span><span class="p">(</span><span class="n">c</span><span class="p">);</span> <span class="p">}</span> </pre></div> <p>Die Funktion <code>Component_repaint()</code> ist eindeutig. Unabhängig davon, ob der Zeiger <code>c</code> den dynamischen Typ <code>Component</code> oder einen abgeleiteten Typ hat, wird immer dieselbe Funktion <code>Component_repaint(Component*)</code> aufgerufen (<a href="/wiki/Statische_Typisierung" title="Statische Typisierung">statische Typisierung</a>). </p><p>In der objektorientierten Programmierung wird die Nachvollziehbarkeit durch die <a href="/wiki/Polymorphie_(Programmierung)" title="Polymorphie (Programmierung)">Polymorphie</a> reduziert. Beispiel in <i>Java</i>: </p> <div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">function</span><span class="w"> </span><span class="p">(</span><span class="n">Component</span><span class="w"> </span><span class="n">c</span><span class="p">)</span> <span class="p">{</span> <span class="w"> </span><span class="n">c</span><span class="p">.</span><span class="na">repaint</span><span class="p">();</span> <span class="p">}</span> </pre></div> <p>Es ist nicht eindeutig nachvollziehbar, welche <code>repaint()</code>-Methode ausgeführt wird, das hängt vom tatsächlichen Typ des Objekts ab, das von <code>c</code> referenziert wird. Ein von <code>Component</code> abgeleiteter Typ könnte seine eigene <code>repaint()</code>-Methode definieren, indem er die von <code>Component</code> <a href="/wiki/Vererbung_(Programmierung)" title="Vererbung (Programmierung)">geerbte</a> Methode <code>repaint()</code> überschreibt. </p><p>In der aspektorientierten Programmierung wird die Nachvollziehbarkeit durch die Verwendung von <i><a href="#Begriffe">Pointcuts</a></i> weiter reduziert. Ein <i>Pointcut</i> enthält für einen <i><a href="#Begriffe">Join-Point</a></i> auszuführenden Code, ein <i>Join-Point</i> ist dabei ein genau definiertes Aufrufereignis. Hier können zu nahezu beliebigen Punkten in der Aufrufkette <i>Advices</i> aktiviert werden. Damit ist es im Extremfall sogar möglich, den Aufruf der Methoden <code>function()</code> oder <code>repaint()</code> an sich zu verhindern. So könnte man sich einen Aspekt vorstellen, der für den <i>Join-Point</i> „Aufruf der Methode <code>function()</code>“ einen <i>Advice</i> definiert, der explizit die weitere Abarbeitung dieses Funktionsaufrufs untersagt. Ebenso könnte man in einem <i>Advice</i> festlegen, dass anstatt der Methode <code>repaint()</code> eine andere Methode auf das Objekt angewandt werden soll. Die Information darüber, was als Nächstes geschehen soll, ist dabei am Ort des Geschehens selbst zunächst nicht abzulesen. </p> <div class="mw-heading mw-heading3"><h3 id="Vergleiche">Vergleiche</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=4" title="Abschnitt bearbeiten: Vergleiche" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=4" title="Quellcode des Abschnitts bearbeiten: Vergleiche"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Zum besseren Verständnis der Konzepte von <i>Pointcuts</i>, <i>Join-Points</i> und <i>Advices</i> dienen die Vergleiche mit den nachstehenden älteren Paradigmen </p> <ul><li><b>Structured Query Language</b> (<i><a href="/wiki/SQL" title="SQL">SQL</a></i>)<br /> Man stelle sich ein <i><a href="/wiki/SQL#Spaltenauswahl" title="SQL">SELECT</a></i>-Statement vor, das alle Methoden in allen Klassen eines Systems selektieren kann. In diesem Zusammenhang entspricht dann<br />- ein <i>Pointcut</i> der <i><a href="/wiki/SQL#Filter" title="SQL">WHERE</a></i>-Klausel, welche die Menge der selektierten Methoden einschränkt<br />- ein <i>Join-Point</i> einem konkreten Suchergebnis im Sinne eines <a href="/wiki/Datensatz" title="Datensatz">Datensatzes</a> aus einer <a href="/wiki/Datenbank" title="Datenbank">Datenbank</a> – nur, dass hier keine Datensätze aus einer Datenbank selektiert werden, sondern Methoden in einem System<br />- ein <i>Advice</i> ist dann die Methode in einem Aspekt, die vor, nach oder anstatt der ausgewählten Methode ausgeführt werden soll.</li></ul> <ul><li><b>andere Programmierparadigmen</b><br /> Während in der prozeduralen Programmierung die Nachvollziehbarkeit durch ein Quelltextfragment und in der objektorientierten Programmierung unter zusätzlicher Kenntnis über die Laufzeittypen vergleichsweise direkt gegeben ist, erfordert die Nachvollziehbarkeit in der aspektorientierten Programmierung die Kenntnis sämtlicher Aspekte, die Point-Cuts für die Join-Points des Code-Fragment definieren. <br /> <i>Orthogonal</i> bedeutet hier, dass Eigenschaften von Methoden „senkrecht“ zur normalen Programmierrichtung definiert werden. Die tatsächliche Code-Ausführung wird nicht nur durch die Aufruf- und Typenhierarchie, sondern zusätzlich „senkrecht“ (orthogonal) dazu von den Aspekten definiert.</li></ul> <div class="mw-heading mw-heading3"><h3 id="Analogie">Analogie</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=5" title="Abschnitt bearbeiten: Analogie" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=5" title="Quellcode des Abschnitts bearbeiten: Analogie"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Anschaulich kann man sich das Prinzip wie folgt vorstellen: ein Programm, gleichgültig ob prozedural oder objektorientiert, folgt einem <a href="/wiki/Programmablaufplan" title="Programmablaufplan">Programmablaufplan</a>, d.&#160;h. der Programmfluss ist an jeder Stelle durch lineare Folgen von Anweisungen (<a href="/wiki/Blockstruktur" title="Blockstruktur">Codeblöcke</a>) und <a href="/wiki/Sprunganweisung" title="Sprunganweisung">Sprünge</a> zwischen diesen (z.&#160;B. Methodenaufrufe) festgelegt. Ein Aspekt wäre hier so viel wie eine Schablone, die über diesen Originalplan gelegt wird und verschiedene Änderungen oder Ergänzungen am Ablaufschema vornimmt. Änderungen an der Schablone lassen den Originalplan unangetastet, die Schablone lässt sich jederzeit austauschen, mit anderen kombinieren oder wieder entfernen. </p> <div class="mw-heading mw-heading3"><h3 id="Technische_Betrachtung">Technische Betrachtung</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=6" title="Abschnitt bearbeiten: Technische Betrachtung" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=6" title="Quellcode des Abschnitts bearbeiten: Technische Betrachtung"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>In einer objektorientierten Laufzeitumgebung könnte aspektorientierte Programmierung durch veränderbare <a href="/w/index.php?title=Sprungvektor&amp;action=edit&amp;redlink=1" class="new" title="Sprungvektor (Seite nicht vorhanden)">Sprungvektoren</a> ermöglicht werden. Man kann sie als eine Art im Programmierparadigma vorgesehenes „Patchen“ von Funktionen ansehen. </p><p>Ein Objekt C wird in die Lage versetzt, Interaktionen zwischen zwei Objekten A und B zu überwachen, ohne dass dafür Veränderungen oder Erweiterungen an A und B notwendig sind. Natürlich ist tatsächlich doch eine Veränderung von A oder B oder beiden notwendig. <i>AspectJ</i> erzeugt diese Änderungen automatisch, der Vorgang dafür heißt <i><a href="/w/index.php?title=Weaving_(AOP)&amp;action=edit&amp;redlink=1" class="new" title="Weaving (AOP) (Seite nicht vorhanden)">Weaving</a></i>, da besagte Änderungen vor dem Kompilieren in den Originalcode „eingewebt“ werden. </p> <div class="mw-heading mw-heading2"><h2 id="Einsatzgebiete">Einsatzgebiete</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=7" title="Abschnitt bearbeiten: Einsatzgebiete" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=7" title="Quellcode des Abschnitts bearbeiten: Einsatzgebiete"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Die aspektorientierte Programmierung ist in der Lage, die bisher in der objektorientierten Programmierung eingesetzte <a href="/wiki/Ereignis_(Programmierung)" title="Ereignis (Programmierung)">ereignisgesteuerte Programmierung</a> (Event-Handling) ganz zu ersetzen. Die ereignisgesteuerte Programmierung dient dazu, ein Objekt X über Veränderungen an einem Objekt Y zu benachrichtigen. Das Objekt Y braucht das Objekt X dabei aber nicht zu kennen. Die bisherige Lösung wird hier am Beispiel eines Fensters in Java (java.awt.Frame) erklärt. Zu Ereignissen, die speziell für Fenster eintreten und über die ein anderer Programmteil benachrichtigt werden soll, zählt unter anderem das Schließen, das Aktivieren und das Deaktivieren. Eine Schnittstelle java.awt.event.WindowListener definiert dafür unterschiedliche Methoden und muss von den Objekten, die über Veränderungen am Fenster benachrichtigt werden möchten, implementiert werden. Objekte, die benachrichtigt werden möchten, müssen sich bei dem jeweiligen anderen Objekt registrieren. </p><p>Die aspektorientierte Programmierung kann die Definition solcher Schnittstellen überflüssig machen. Ein Aspekt X definiert für das zu überwachende Objekt Y die genau zu überwachenden Code-Ereignisse, genannt Point-Cut, zusammengesetzt aus Join-Points (Gesamte Methode, Methoden-Aufruf, Methoden-Rückkehr unterscheidbar in Methoden-Rückkehr mit Rückgabewert und Methoden-Rückkehr mit Exception), und definiert für die verschiedenen Point-Cuts den Advice, das ist der auszuführende Code. Die Ausführung von Code in X durch Veränderungen an einem Objekt Y kann also ohne zusätzliches Interface, Methoden und Registrierungsmechanismus erfolgen. </p><p>Aspektorientierte Programmierung kann bei der Entwicklung von Frameworks (Libraries) eingesetzt werden, um z.&#160;B. Eigenschaften wie Persistenz oder Synchronisierbarkeit zu implementieren. Der Transfermechanismus bleibt dann vor dem Benutzer der Bibliothek verborgen. Das Verbergen des Transfermechanismus macht den Code in diesem Fall übersichtlicher, da die Methoden nicht mit Framework-Code überfrachtet werden. </p><p>Ein weiteres Einsatzgebiet ist das Software-Testen, wo insbesondere das Einführen neuer Attribute in Klassen ohne die Veränderung ihrer Quelltexte (Inter-type Declarations) neue interessante Möglichkeiten für die Entwicklung von White-Box-Tests darstellt, z.&#160;B. um ein Tracing privater Attribute durchzuführen. </p> <div class="mw-heading mw-heading2"><h2 id="Joinpoint_vs._Joinpoint_shadow">Joinpoint vs. Joinpoint shadow</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=8" title="Abschnitt bearbeiten: Joinpoint vs. Joinpoint shadow" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=8" title="Quellcode des Abschnitts bearbeiten: Joinpoint vs. Joinpoint shadow"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Es muss zwischen Joinpoints und den sogenannten Joinpoint shadows unterschieden werden. Ein Joinpoint shadow ist das statische Vorkommen eines potentiellen Joinpoints. Ob dieser shadow (etwa ein im Quellcode stehender Methodenaufruf) tatsächlich zu einem Joinpoint wird, entscheidet sich erst zur Laufzeit in Abhängigkeit vom korrespondierenden Pointcut (resp. Pointcut-Designator). </p><p>Ein Pointcut definiert eine Menge von Joinpoint shadows, die er aus dem zugrunde liegenden Programm herausschneidet (cut). Wird während des Programmablaufs ein Joinpoint shadow betreten und ist sein definierender Pointcut erfüllbar, wird der „Joinpoint shadow“ zum „Joinpoint“. </p> <div class="mw-heading mw-heading2"><h2 id="Beispiel">Beispiel</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=9" title="Abschnitt bearbeiten: Beispiel" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=9" title="Quellcode des Abschnitts bearbeiten: Beispiel"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Folgendes Beispiel erläutert den Grundgedanken der aspektorientierten Programmierung. Die verwendete Programmiersprache ist <a href="/wiki/AspectJ" title="AspectJ">AspectJ</a>, die <a href="/wiki/Java_(Programmiersprache)" title="Java (Programmiersprache)">Java</a> um die Aspektorientierung erweitert. </p> <div class="mw-heading mw-heading3"><h3 id="Einführendes_Beispiel"><span id="Einf.C3.BChrendes_Beispiel"></span>Einführendes Beispiel</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=10" title="Abschnitt bearbeiten: Einführendes Beispiel" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=10" title="Quellcode des Abschnitts bearbeiten: Einführendes Beispiel"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Als einführendes Beispiel soll eine Standardaufgabe bei der Softwareentwicklung dienen: <a href="/wiki/Tracing" class="mw-redirect" title="Tracing">Tracing</a> von Informationen in eine Datei. Das Vorgehen <i>ohne</i> aspektorientierte Programmierung besteht darin, einen <a href="/wiki/Logging" title="Logging">Logger</a> zu erzeugen und dort eine entsprechende Methode aufzurufen, die die eigentliche Information in die Logdatei speichert: </p> <div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">eineMethode</span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">logger</span><span class="p">.</span><span class="na">trace</span><span class="p">(</span><span class="s">&quot;Betrete \&quot;eineMethode\&quot;&quot;</span><span class="p">);</span> <span class="w"> </span><span class="c1">// Abarbeitung der Methode</span> <span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span> <span class="w"> </span><span class="n">logger</span><span class="p">.</span><span class="na">trace</span><span class="p">(</span><span class="s">&quot;Verlasse \&quot;eineMethode\&quot;&quot;</span><span class="p">);</span> <span class="p">}</span> </pre></div> <p>Zu Beginn der Methode wird an den Logger gemeldet, dass die Methode betreten wird. Danach folgt die eigentliche Logik der Methode. Zum Schluss wird das Verlassen der Methode protokolliert. </p><p>In einer typischen Anwendung sind derartige Methodenaufrufe an den Logger in vielen Methoden und Klassen vorhanden – sie sind über die gesamte Anwendung verstreut und keinesfalls modular. Der Logger </p> <ul><li>muss jedem Objekt bekannt gemacht werden und</li> <li>kann nicht ohne weiteres an einer zentralen Stelle ausgetauscht werden – jedenfalls nicht, ohne diesen im System public static zu deklarieren, was einer globalen Variablen und somit zweifelhaftem Design gleichkommt.</li></ul> <p>Somit wird auch klar, was mit <i>semantisch und physisch unabhängige Programmstrecken</i> gemeint ist. In obiger Methode sind zwei eigentlich unabhängige Aufgaben miteinander vermengt. Dies ist zum einen das Protokollieren und zum anderen die eigentliche Logik der Methode, die darin besteht, das Ergebnis einer Addition in der Membervariablen <i>m</i> zu speichern. </p><p>Die aspektorientierte Programmierung erlaubt es nun, auch Aufgaben wie das Tracing zu modularisieren. Angenommen, das Betreten und Verlassen <i>einer jeden</i> Methode der Klasse soll auf die oben gezeigte Weise protokolliert werden. Gegenüber der konventionellen Programmierung lässt sich eine solche Anweisung in der AOP direkt als <i><a href="/w/index.php?title=Aspekt_(Informatik)&amp;action=edit&amp;redlink=1" class="new" title="Aspekt (Informatik) (Seite nicht vorhanden)">Aspekt</a></i> formulieren: </p> <div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">public</span><span class="w"> </span><span class="n">aspect</span><span class="w"> </span><span class="n">Tracing</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">pointcut</span><span class="w"> </span><span class="nf">traceCall</span><span class="p">():</span> <span class="w"> </span><span class="n">call</span><span class="p">(</span><span class="o">*</span><span class="w"> </span><span class="n">AOPDemo</span><span class="p">.</span><span class="o">*</span><span class="p">(..));</span> <span class="w"> </span><span class="n">before</span><span class="p">():</span><span class="w"> </span><span class="n">traceCall</span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&quot;Betrete \&quot;&quot;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">thisJoinPoint</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&quot;\&quot;&quot;</span><span class="p">);</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="n">after</span><span class="p">():</span><span class="w"> </span><span class="n">traceCall</span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&quot;Verlasse \&quot;&quot;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">thisJoinPoint</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&quot;\&quot;&quot;</span><span class="p">);</span> <span class="w"> </span><span class="p">}</span> <span class="p">}</span> </pre></div> <p>Im Aspekt wird bestimmt, dass alle Methoden der Klasse AOPDemo unabhängig von ihrer <a href="/wiki/Signatur_(Programmierung)" title="Signatur (Programmierung)">Signatur</a> einbezogen werden sollen. Die Aufgaben werden auf diese Weise separiert und die ursprüngliche Methode kann verkürzt geschrieben werden: </p> <div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">eineMethode</span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="c1">// Abarbeitung der Methode</span> <span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span> <span class="p">}</span> </pre></div> <div class="mw-heading mw-heading3"><h3 id="Weiterführendes_Beispiel"><span id="Weiterf.C3.BChrendes_Beispiel"></span>Weiterführendes Beispiel</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=11" title="Abschnitt bearbeiten: Weiterführendes Beispiel" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=11" title="Quellcode des Abschnitts bearbeiten: Weiterführendes Beispiel"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Außerdem ermöglicht die aspektorientierte Programmierung eine Umleitung des ursprünglichen Programmablaufs. Sicherheitsaspekte können zum Beispiel den ursprünglichen Programmablauf austauschen, um unberechtigte Zugriffe auf geschützte Programmteile zu verhindern. Caching-Aspekte erhöhen die Ausführungsgeschwindigkeit von Programmen und werden eingesetzt, um den Aufruf aufwendiger Programmteile wie Datenbank- oder Dateisystemzugriffe zu reduzieren. Das folgende Beispiel demonstriert die Umleitung von Methodenaufrufen bzw. den Austausch von Programmteilen als Interception Around Advice:<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">&#91;</span>1<span class="cite-bracket">&#93;</span></a></sup> </p> <div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">public</span><span class="w"> </span><span class="n">aspect</span><span class="w"> </span><span class="n">Caching</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">pointcut</span><span class="w"> </span><span class="nf">cacheCall</span><span class="p">():</span> <span class="w"> </span><span class="n">call</span><span class="p">(</span><span class="o">*</span><span class="w"> </span><span class="n">AOPDemo</span><span class="p">.</span><span class="o">*</span><span class="p">(..));</span> <span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="n">Map</span><span class="w"> </span><span class="n">cache</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Map</span><span class="p">();</span> <span class="w"> </span><span class="n">around</span><span class="p">():</span><span class="w"> </span><span class="n">cacheCall</span><span class="p">(</span><span class="n">Joinpoint</span><span class="w"> </span><span class="n">joinPointContext</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="c1">// Prüfen, ob Rückgabewert für aktuelle Aufruf-Argumente schon im Cache abgelegt wurde</span> <span class="w"> </span><span class="n">Object</span><span class="w"> </span><span class="n">args</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">joinPointContext</span><span class="p">.</span><span class="na">getArguments</span><span class="p">();</span> <span class="w"> </span><span class="kt">boolean</span><span class="w"> </span><span class="n">isCallCached</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cache</span><span class="p">.</span><span class="na">containsKey</span><span class="p">(</span><span class="n">args</span><span class="p">);</span> <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isCallCached</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="c1">// Umleitung und Austausch des ursprünglichen Methodenaufrufs, gesicherten Rückgabewert aus Cache verwenden</span> <span class="w"> </span><span class="n">Object</span><span class="w"> </span><span class="n">cachedReturnValue</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cache</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="n">args</span><span class="p">);</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">cachedReturnValue</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="c1">// Weiterleitung an ursprüngliche Methode und neuen Rückgabewert im Cache sichern</span> <span class="w"> </span><span class="n">Object</span><span class="w"> </span><span class="n">newReturnValue</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">joinPointContext</span><span class="p">.</span><span class="na">proceed</span><span class="p">();</span> <span class="w"> </span><span class="n">cache</span><span class="p">.</span><span class="na">put</span><span class="p">(</span><span class="n">args</span><span class="p">,</span><span class="w"> </span><span class="n">newReturnValue</span><span class="p">);</span> <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">newReturnValue</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">}</span> <span class="p">}</span> </pre></div> <div class="mw-heading mw-heading3"><h3 id="Begriffe">Begriffe</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=12" title="Abschnitt bearbeiten: Begriffe" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=12" title="Quellcode des Abschnitts bearbeiten: Begriffe"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Das Beispiel beinhaltet bereits die wichtigsten Konzepte, wenn auch nicht alle. In diesem Abschnitt werden die fehlenden hinzugefügt und den in der AOP verwendeten Begriffen zugeordnet. </p><p>Dazu wird das Beispiel um folgende Codesequenz erweitert und der bisherige Ablauf grafisch dargestellt: </p> <div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">quellMethode</span><span class="p">()</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">eineMethode</span><span class="p">();</span> <span class="p">}</span> </pre></div> <p><span class="mw-default-size" typeof="mw:File"><a href="/wiki/Datei:Aspektorientierte_Programmierung.svg" class="mw-file-description" title="Schematische Darstellung der Verwendung eines Aspekts"><img alt="Schematische Darstellung der Verwendung eines Aspekts" src="//upload.wikimedia.org/wikipedia/de/thumb/d/d7/Aspektorientierte_Programmierung.svg/712px-Aspektorientierte_Programmierung.svg.png" decoding="async" width="712" height="428" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/de/thumb/d/d7/Aspektorientierte_Programmierung.svg/1068px-Aspektorientierte_Programmierung.svg.png 1.5x, //upload.wikimedia.org/wikipedia/de/thumb/d/d7/Aspektorientierte_Programmierung.svg/1424px-Aspektorientierte_Programmierung.svg.png 2x" data-file-width="712" data-file-height="428" /></a></span> </p><p>Der Aspekt kommt zum Tragen, noch bevor <code>eineMethode()</code> betreten wird. Der Grund dafür ist der <b>Join Point</b> direkt davor. Diese Join Points sind implizit gegeben. Das heißt, sie sind vor jeder Methode vorhanden. Das Muster, das aus allen vorhandenen Join Points diejenigen aussucht, die für einen Aspekt interessant sind, nennt sich <b>Pointcut</b>. Tatsächlich handelt es sich bei den Pointcuts um Muster, die auch <a href="/wiki/Wildcard_(Informatik)" title="Wildcard (Informatik)">Wildcards</a> erlauben. Um festzulegen, wann welcher Code innerhalb des Aspekts auszuführen ist, kommen <b>Advices</b> zum Tragen. Im einführenden Beispiel sind dies <i>before</i> und <i>after</i>, im weiterführenden Beispiel <i>around</i>. Diese Advices sind, neben weiteren, implizit gegeben. </p><p>Die Programmierung mit Aspekten erlaubt es zudem, in und mit Aspekten das Verhalten von Klassen zu verändern. Es können durch Aspekte Felder und Methoden zu Klassen hinzugefügt werden. Auch hier ist es durch die Angabe von Wildcards gleichzeitig bei mehreren Klassen möglich. In einer Sprache wie <a href="/wiki/Java_(Programmiersprache)" title="Java (Programmiersprache)">Java</a> verletzen diese <b>Inter-Type Declarations</b> die Regel, dass sämtliche Felder und Methoden einer Klasse in einer Datei, bzw. der <a href="/wiki/Vererbung_(Programmierung)" title="Vererbung (Programmierung)">Vererbungshierarchie</a> der Klasse zu finden sind, da Aspekte dieser nicht angehören. </p> <div class="mw-heading mw-heading2"><h2 id="Typische_Aufgaben">Typische Aufgaben</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=13" title="Abschnitt bearbeiten: Typische Aufgaben" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=13" title="Quellcode des Abschnitts bearbeiten: Typische Aufgaben"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>AOP ist besonders zur Programmierung von sogenannten <a href="/wiki/Cross-Cutting_Concern" title="Cross-Cutting Concern">Cross-Cutting Concerns</a> geeignet. Beispiele dafür sind <a href="/wiki/Logging" title="Logging">Protokollierung</a>, <a href="/wiki/Ausnahmebehandlung" title="Ausnahmebehandlung">Fehlerbehandlung</a>, <a href="/wiki/Persistenz_(Informatik)" title="Persistenz (Informatik)">Persistenz</a>, <a href="/wiki/Datenvalidierung" title="Datenvalidierung">Datenvalidierung</a> und <a href="/wiki/Informationssicherheit" title="Informationssicherheit">IT-Sicherheit</a>. </p><p><a href="/wiki/Profiler_(Programmierung)" title="Profiler (Programmierung)">Profiling</a> APIs, wie bspw. in <a href="/wiki/Java_(Programmiersprache)" title="Java (Programmiersprache)">Java</a> enthalten, arbeiten auf ähnliche Weise wie AOP. Sie dienen dazu, unperformante Codestellen zu ermitteln. Dazu werden durch einen sog. Profiler Zeitmessungen für die Abarbeitung sämtlicher Methoden angestellt. Der eigentliche Profiler kann sich von der <a href="/wiki/Virtuelle_Maschine" title="Virtuelle Maschine">Virtual Machine</a> mitteilen lassen, wann eine Methode betreten und verlassen wird. Mit aspektorientierter Programmierung lässt sich daher auch ein Profiler realisieren. </p> <div class="mw-heading mw-heading2"><h2 id="Ähnliche_Lösungsansätze"><span id=".C3.84hnliche_L.C3.B6sungsans.C3.A4tze"></span>Ähnliche Lösungsansätze</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=14" title="Abschnitt bearbeiten: Ähnliche Lösungsansätze" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=14" title="Quellcode des Abschnitts bearbeiten: Ähnliche Lösungsansätze"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Aspekte haben ihren Ursprung in der <a href="/wiki/Objektorientierte_Programmierung" title="Objektorientierte Programmierung">objektorientierten Programmierung</a> und sind zumindest in ihrer Intention vergleichbar mit Metaobjektprotokollen, wie man sie beispielsweise im <a href="/wiki/Common_Lisp_Object_System" title="Common Lisp Object System">Common Lisp Object System</a> vorfindet. Ferner sind Aspekte mit Konzepten wie der <a href="/w/index.php?title=Subjektorientierte_Programmierung&amp;action=edit&amp;redlink=1" class="new" title="Subjektorientierte Programmierung (Seite nicht vorhanden)">subjektorientierten Programmierung</a>, den <a href="/wiki/Mixin" title="Mixin">Mixins</a>, den <a href="/w/index.php?title=Classbox&amp;action=edit&amp;redlink=1" class="new" title="Classbox (Seite nicht vorhanden)">Classboxes</a> oder dem Konzept der <a href="/wiki/Delegation_(Softwareentwicklung)" title="Delegation (Softwareentwicklung)">Delegation</a> verwandt, wie es in der Programmiersprache <a href="/wiki/Self_(Programmiersprache)" title="Self (Programmiersprache)">Self</a> vorzufinden ist. Einen ähnlich gelagerten oder gar gleichwertigen Lösungsansatz stellen die sogenannten <a href="/wiki/Trait_(Programmierung)" title="Trait (Programmierung)">Traits</a> dar. </p> <div class="mw-heading mw-heading2"><h2 id="Anmerkungen">Anmerkungen</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=15" title="Abschnitt bearbeiten: Anmerkungen" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=15" title="Quellcode des Abschnitts bearbeiten: Anmerkungen"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Vorteil der Aspektorientierung ist die logische und physische Trennung der Semantik (der Komponente) von dem technischen Detail (Aspekt). Als Nachteil der aspektorientierten Programmierung sei hier insbesondere der <i>Overhead</i> erwähnt, der nach dem <i>Weaving</i> im generierten Programm entsteht. Dies führt im Allgemeinen zu <a href="/wiki/Rechenleistung" title="Rechenleistung">Performance</a>-Einbußen. Des Weiteren reduziert aspektorientierte Programmierung die Nachvollziehbarkeit von Programmverhalten, da die Stellen, an denen ein Aspekt zuständig ist, im betroffenen Code nicht direkt erkennbar sind. <a href="/wiki/Debugging" class="mw-redirect" title="Debugging">Debugging</a> wird so stark erschwert, allerdings kann dieser Nachteil durch Unterstützung einer <a href="/wiki/Integrierte_Entwicklungsumgebung" title="Integrierte Entwicklungsumgebung">IDE</a> neutralisiert oder zumindest reduziert werden, indem das Debugging ebenso mehrdimensional vor sich geht wie das Entwickeln des Codes. </p><p>Ein weiterer Nachteil ist, dass beim Einsatz dieser Technik unerwünschte und schwer nachvollziehbare Wechselwirkungen zwischen einzelnen Aspekten auftreten können. </p><p>Aspekte und Komponenten können in verschiedenen Programmiersprachen definiert sein. </p> <div class="mw-heading mw-heading2"><h2 id="Siehe_auch">Siehe auch</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=16" title="Abschnitt bearbeiten: Siehe auch" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=16" title="Quellcode des Abschnitts bearbeiten: Siehe auch"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li><a href="/wiki/Reflexion_(Programmierung)" title="Reflexion (Programmierung)">Reflexion (Programmierung)</a></li></ul> <div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=17" title="Abschnitt bearbeiten: Literatur" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=17" title="Quellcode des Abschnitts bearbeiten: Literatur"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li>Lars Wunderlich: <i>AOP: Aspektorientierte Programmierung in der Praxis.</i> Entwickler.press, Frankfurt am Main 2005, <a href="/wiki/Spezial:ISBN-Suche/3935042744" class="internal mw-magiclink-isbn">ISBN 3-935042-74-4</a>.</li> <li>Oliver Böhm: <i>Aspektorientierte Programmierung mit AspectJ 5: Einsteigen in AspectJ und AOP.</i> Dpunkt Verlag, Heidelberg 2006, <a href="/wiki/Spezial:ISBN-Suche/3898643301" class="internal mw-magiclink-isbn">ISBN 3-89864-330-1</a>.</li> <li>Renaud Pawlak, Lionel Seinturier, Jean-Philippe Retaille: <i>Foundations of AOP for J2EE Development (Foundation).</i> Apress, Berkeley CA 2005, <a href="/wiki/Spezial:ISBN-Suche/1590595076" class="internal mw-magiclink-isbn">ISBN 1-59059-507-6</a>.</li> <li>Ralf Westphal: <i>Aspektorientierte Programmierung mit .NET.</i> In: <i>dotnetpro</i> Ulm 22.2007,10. <span class="plainlinks-print"><a href="/wiki/Internationale_Standardnummer_f%C3%BCr_fortlaufende_Sammelwerke" title="Internationale Standardnummer für fortlaufende Sammelwerke">ISSN</a>&#160;<span style="white-space:nowrap"><a rel="nofollow" class="external text" href="https://zdb-katalog.de/list.xhtml?t=iss%3D%221610-1553%22&amp;key=cql">1610-1553</a></span></span></li></ul> <div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=18" title="Abschnitt bearbeiten: Weblinks" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=18" title="Quellcode des Abschnitts bearbeiten: Weblinks"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li><a rel="nofollow" class="external text" href="http://common-lisp.net/project/closer/aspectl.html">AspectL.</a> Aspektorientierte Programmierung für Lisp</li> <li><a rel="nofollow" class="external text" href="http://eclipse.org/aspectj/">AspectJ.</a> Aspektorientierte Programmierung für Java</li> <li><a rel="nofollow" class="external text" href="http://www.rapier-loom.net/">LOOM.NET</a> – Aspektorientierte Programmierung für .NET</li> <li><a rel="nofollow" class="external text" href="http://www.aspectc.org/">AspectC++.</a> Aspektorientierte Programmierung für C++</li> <li><a rel="nofollow" class="external text" href="http://wwwiti.cs.uni-magdeburg.de/iti_db/forschung/fop/featurec/">FeatureC++.</a> Kombination von merkmalsorientierter Programmierung und aspektorientierter Programmierung für C++</li> <li><a rel="nofollow" class="external text" href="http://www.theserverside.de/funf-wege-der-fehlersuche-in-java/">Fehlersuche mit aspektorientierter Programmierung in Java</a> (deutsch)</li> <li><a rel="nofollow" class="external text" href="http://flow3.typo3.org/">FLOW3 – PHP Framework mit AOP</a></li> <li><a rel="nofollow" class="external text" href="http://aop.io/">PHP-AOP (AOP.io). aspektorientierter Programmierung in PHP</a></li> <li><a rel="nofollow" class="external text" href="http://go.aopphp.com/">Go! Aspektorientierte Programmierung für PHP</a></li> <li><a rel="nofollow" class="external text" href="https://code.google.com/p/loom-as3/">loom-as3 – ActionScript3 AOP Bytecode Weaver</a></li> <li><a rel="nofollow" class="external text" href="https://github.com/forensix/MGAOP/">Aspektorientierte Programmierung für Objective-C</a></li></ul> <div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit&amp;section=19" title="Abschnitt bearbeiten: Einzelnachweise" class="mw-editsection-visualeditor"><span>Bearbeiten</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit&amp;section=19" title="Quellcode des Abschnitts bearbeiten: Einzelnachweise"><span>Quelltext bearbeiten</span></a><span class="mw-editsection-bracket">]</span></span></div> <ol class="references"> <li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://static.springframework.org/spring/docs/2.5.x/reference/aop-api.html#aop-api-advice-around">Interception Around Advice</a></span> </li> </ol></div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">Abgerufen von „<a dir="ltr" href="https://de.wikipedia.org/w/index.php?title=Aspektorientierte_Programmierung&amp;oldid=244861570">https://de.wikipedia.org/w/index.php?title=Aspektorientierte_Programmierung&amp;oldid=244861570</a>“</div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/Wikipedia:Kategorien" title="Wikipedia:Kategorien">Kategorie</a>: <ul><li><a href="/wiki/Kategorie:Programmierparadigma" title="Kategorie:Programmierparadigma">Programmierparadigma</a></li></ul></div></div> </div> </div> <div id="mw-navigation"> <h2>Navigationsmenü</h2> <div id="mw-head"> <nav id="p-personal" class="mw-portlet mw-portlet-personal vector-user-menu-legacy vector-menu" aria-labelledby="p-personal-label" > <h3 id="p-personal-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Meine Werkzeuge</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anonuserpage" class="mw-list-item"><span title="Benutzerseite der IP-Adresse, von der aus du Änderungen durchführst">Nicht angemeldet</span></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Spezial:Meine_Diskussionsseite" title="Diskussion über Änderungen von dieser IP-Adresse [n]" accesskey="n"><span>Diskussionsseite</span></a></li><li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Spezial:Meine_Beitr%C3%A4ge" title="Eine Liste der Bearbeitungen, die von dieser IP-Adresse gemacht wurden [y]" accesskey="y"><span>Beiträge</span></a></li><li id="pt-createaccount" class="mw-list-item"><a href="/w/index.php?title=Spezial:Benutzerkonto_anlegen&amp;returnto=Aspektorientierte+Programmierung&amp;returntoquery=section%3D13%26veaction%3Dedit%26redirect%3Dno" title="Wir ermutigen dich dazu, ein Benutzerkonto zu erstellen und dich anzumelden. Es ist jedoch nicht zwingend erforderlich."><span>Benutzerkonto erstellen</span></a></li><li id="pt-login" class="mw-list-item"><a href="/w/index.php?title=Spezial:Anmelden&amp;returnto=Aspektorientierte+Programmierung&amp;returntoquery=section%3D13%26veaction%3Dedit%26redirect%3Dno" title="Anmelden ist zwar keine Pflicht, wird aber gerne gesehen. [o]" accesskey="o"><span>Anmelden</span></a></li> </ul> </div> </nav> <div id="left-navigation"> <nav id="p-namespaces" class="mw-portlet mw-portlet-namespaces vector-menu-tabs vector-menu-tabs-legacy vector-menu" aria-labelledby="p-namespaces-label" > <h3 id="p-namespaces-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Namensräume</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-main" class="selected mw-list-item"><a href="/wiki/Aspektorientierte_Programmierung" title="Seiteninhalt anzeigen [c]" accesskey="c"><span>Artikel</span></a></li><li id="ca-talk" class="mw-list-item"><a href="/wiki/Diskussion:Aspektorientierte_Programmierung" rel="discussion" title="Diskussion zum Seiteninhalt [t]" accesskey="t"><span>Diskussion</span></a></li> </ul> </div> </nav> <nav id="p-variants" class="mw-portlet mw-portlet-variants emptyPortlet vector-menu-dropdown vector-menu" aria-labelledby="p-variants-label" > <input type="checkbox" id="p-variants-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-variants" class="vector-menu-checkbox" aria-labelledby="p-variants-label" > <label id="p-variants-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Deutsch</span> </label> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </nav> </div> <div id="right-navigation"> <nav id="p-views" class="mw-portlet mw-portlet-views vector-menu-tabs vector-menu-tabs-legacy vector-menu" aria-labelledby="p-views-label" > <h3 id="p-views-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Ansichten</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected mw-list-item"><a href="/wiki/Aspektorientierte_Programmierung"><span>Lesen</span></a></li><li id="ca-ve-edit" class="mw-list-item"><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;veaction=edit" title="Diese Seite mit dem VisualEditor bearbeiten [v]" accesskey="v"><span>Bearbeiten</span></a></li><li id="ca-edit" class="collapsible mw-list-item"><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=edit" title="Den Quelltext dieser Seite bearbeiten [e]" accesskey="e"><span>Quelltext bearbeiten</span></a></li><li id="ca-history" class="mw-list-item"><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=history" title="Frühere Versionen dieser Seite [h]" accesskey="h"><span>Versionsgeschichte</span></a></li> </ul> </div> </nav> <nav id="p-cactions" class="mw-portlet mw-portlet-cactions emptyPortlet vector-menu-dropdown vector-menu" aria-labelledby="p-cactions-label" title="Weitere Optionen" > <input type="checkbox" id="p-cactions-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-cactions" class="vector-menu-checkbox" aria-labelledby="p-cactions-label" > <label id="p-cactions-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Weitere</span> </label> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </nav> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <h3 >Suche</h3> <form action="/w/index.php" id="searchform" class="vector-search-box-form"> <div id="simpleSearch" class="vector-search-box-inner" data-search-loc="header-navigation"> <input class="vector-search-box-input" type="search" name="search" placeholder="Wikipedia durchsuchen" aria-label="Wikipedia durchsuchen" autocapitalize="sentences" title="Durchsuche die Wikipedia [f]" accesskey="f" id="searchInput" > <input type="hidden" name="title" value="Spezial:Suche"> <input id="mw-searchButton" class="searchButton mw-fallbackSearchButton" type="submit" name="fulltext" title="Suche nach Seiten, die diesen Text enthalten" value="Suchen"> <input id="searchButton" class="searchButton" type="submit" name="go" title="Gehe direkt zu der Seite mit genau diesem Namen, falls sie vorhanden ist." value="Artikel"> </div> </form> </div> </div> </div> <div id="mw-panel" class="vector-legacy-sidebar"> <div id="p-logo" role="banner"> <a class="mw-wiki-logo" href="/wiki/Wikipedia:Hauptseite" title="Hauptseite"></a> </div> <nav id="p-navigation" class="mw-portlet mw-portlet-navigation vector-menu-portal portal vector-menu" aria-labelledby="p-navigation-label" > <h3 id="p-navigation-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Navigation</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage-description" class="mw-list-item"><a href="/wiki/Wikipedia:Hauptseite" title="Hauptseite besuchen [z]" accesskey="z"><span>Hauptseite</span></a></li><li id="n-topics" class="mw-list-item"><a href="/wiki/Portal:Wikipedia_nach_Themen"><span>Themenportale</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Spezial:Zuf%C3%A4llige_Seite" title="Zufällige Seite aufrufen [x]" accesskey="x"><span>Zufälliger Artikel</span></a></li> </ul> </div> </nav> <nav id="p-Mitmachen" class="mw-portlet mw-portlet-Mitmachen vector-menu-portal portal vector-menu" aria-labelledby="p-Mitmachen-label" > <h3 id="p-Mitmachen-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Mitmachen</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-Artikel-verbessern" class="mw-list-item"><a href="/wiki/Wikipedia:Beteiligen"><span>Artikel verbessern</span></a></li><li id="n-Neuerartikel" class="mw-list-item"><a href="/wiki/Hilfe:Neuen_Artikel_anlegen"><span>Neuen Artikel anlegen</span></a></li><li id="n-portal" class="mw-list-item"><a href="/wiki/Wikipedia:Autorenportal" title="Info-Zentrum über Beteiligungsmöglichkeiten"><span>Autorenportal</span></a></li><li id="n-help" class="mw-list-item"><a href="/wiki/Hilfe:%C3%9Cbersicht" title="Übersicht über Hilfeseiten"><span>Hilfe</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Spezial:Letzte_%C3%84nderungen" title="Liste der letzten Änderungen in Wikipedia [r]" accesskey="r"><span>Letzte Änderungen</span></a></li><li id="n-contact" class="mw-list-item"><a href="/wiki/Wikipedia:Kontakt" title="Kontaktmöglichkeiten"><span>Kontakt</span></a></li><li id="n-sitesupport" class="mw-list-item"><a href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&amp;utm_medium=sidebar&amp;utm_campaign=C13_de.wikipedia.org&amp;uselang=de" title="Unterstütze uns"><span>Spenden</span></a></li> </ul> </div> </nav> <nav id="p-tb" class="mw-portlet mw-portlet-tb vector-menu-portal portal vector-menu" aria-labelledby="p-tb-label" > <h3 id="p-tb-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Werkzeuge</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Spezial:Linkliste/Aspektorientierte_Programmierung" title="Liste aller Seiten, die hierher verlinken [j]" accesskey="j"><span>Links auf diese Seite</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Spezial:%C3%84nderungen_an_verlinkten_Seiten/Aspektorientierte_Programmierung" rel="nofollow" title="Letzte Änderungen an Seiten, die von hier verlinkt sind [k]" accesskey="k"><span>Änderungen an verlinkten Seiten</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Spezial:Spezialseiten" title="Liste aller Spezialseiten [q]" accesskey="q"><span>Spezialseiten</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;oldid=244861570" title="Dauerhafter Link zu dieser Seitenversion"><span>Permanenter Link</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;action=info" title="Weitere Informationen über diese Seite"><span>Seiten­­informationen</span></a></li><li id="t-cite" class="mw-list-item"><a href="/w/index.php?title=Spezial:Zitierhilfe&amp;page=Aspektorientierte_Programmierung&amp;id=244861570&amp;wpFormIdentifier=titleform" title="Hinweise, wie diese Seite zitiert werden kann"><span>Artikel zitieren</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Spezial:URL-K%C3%BCrzung&amp;url=https%3A%2F%2Fde.wikipedia.org%2Fw%2Findex.php%3Ftitle%3DAspektorientierte_Programmierung%26section%3D13%26veaction%3Dedit"><span>Kurzlink</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Spezial:QrCode&amp;url=https%3A%2F%2Fde.wikipedia.org%2Fw%2Findex.php%3Ftitle%3DAspektorientierte_Programmierung%26section%3D13%26veaction%3Dedit"><span>QR-Code herunterladen</span></a></li> </ul> </div> </nav> <nav id="p-coll-print_export" class="mw-portlet mw-portlet-coll-print_export vector-menu-portal portal vector-menu" aria-labelledby="p-coll-print_export-label" > <h3 id="p-coll-print_export-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Drucken/​exportieren</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="coll-download-as-rl" class="mw-list-item"><a href="/w/index.php?title=Spezial:DownloadAsPdf&amp;page=Aspektorientierte_Programmierung&amp;action=show-download-screen"><span>Als PDF herunterladen</span></a></li><li id="t-print" class="mw-list-item"><a href="/w/index.php?title=Aspektorientierte_Programmierung&amp;printable=yes" title="Druckansicht dieser Seite [p]" accesskey="p"><span>Druckversion</span></a></li> </ul> </div> </nav> <nav id="p-wikibase-otherprojects" class="mw-portlet mw-portlet-wikibase-otherprojects vector-menu-portal portal vector-menu" aria-labelledby="p-wikibase-otherprojects-label" > <h3 id="p-wikibase-otherprojects-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">In anderen Projekten</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-wikibase" class="wb-otherproject-link wb-otherproject-wikibase-dataitem mw-list-item"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q30267" title="Link zum verbundenen Objekt im Datenrepositorium [g]" accesskey="g"><span>Wikidata-Datenobjekt</span></a></li> </ul> </div> </nav> <nav id="p-lang" class="mw-portlet mw-portlet-lang vector-menu-portal portal vector-menu" aria-labelledby="p-lang-label" > <h3 id="p-lang-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">In anderen Sprachen</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li class="interlanguage-link interwiki-ar mw-list-item"><a href="https://ar.wikipedia.org/wiki/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9_%D9%85%D9%88%D8%AC%D9%87%D8%A9_%D8%A8%D8%A7%D9%84%D8%B3%D9%85%D8%A7%D8%AA" title="برمجة موجهة بالسمات – Arabisch" lang="ar" hreflang="ar" data-title="برمجة موجهة بالسمات" data-language-autonym="العربية" data-language-local-name="Arabisch" class="interlanguage-link-target"><span>العربية</span></a></li><li class="interlanguage-link interwiki-bg mw-list-item"><a href="https://bg.wikipedia.org/wiki/%D0%90%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%B0%D0%BD%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%B8%D1%80%D0%B0%D0%BD%D0%B5" title="Аспектно-ориентирано програмиране – Bulgarisch" lang="bg" hreflang="bg" data-title="Аспектно-ориентирано програмиране" data-language-autonym="Български" data-language-local-name="Bulgarisch" class="interlanguage-link-target"><span>Български</span></a></li><li class="interlanguage-link interwiki-ca mw-list-item"><a href="https://ca.wikipedia.org/wiki/Programaci%C3%B3_orientada_a_aspectes" title="Programació orientada a aspectes – Katalanisch" lang="ca" hreflang="ca" data-title="Programació orientada a aspectes" data-language-autonym="Català" data-language-local-name="Katalanisch" class="interlanguage-link-target"><span>Català</span></a></li><li class="interlanguage-link interwiki-cs mw-list-item"><a href="https://cs.wikipedia.org/wiki/Aspektov%C4%9B_orientovan%C3%A9_programov%C3%A1n%C3%AD" title="Aspektově orientované programování – Tschechisch" lang="cs" hreflang="cs" data-title="Aspektově orientované programování" data-language-autonym="Čeština" data-language-local-name="Tschechisch" class="interlanguage-link-target"><span>Čeština</span></a></li><li class="interlanguage-link interwiki-da mw-list-item"><a href="https://da.wikipedia.org/wiki/Aspektorienteret_programmering" title="Aspektorienteret programmering – Dänisch" lang="da" hreflang="da" data-title="Aspektorienteret programmering" data-language-autonym="Dansk" data-language-local-name="Dänisch" class="interlanguage-link-target"><span>Dansk</span></a></li><li class="interlanguage-link interwiki-en mw-list-item"><a href="https://en.wikipedia.org/wiki/Aspect-oriented_programming" title="Aspect-oriented programming – Englisch" lang="en" hreflang="en" data-title="Aspect-oriented programming" data-language-autonym="English" data-language-local-name="Englisch" class="interlanguage-link-target"><span>English</span></a></li><li class="interlanguage-link interwiki-es mw-list-item"><a href="https://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_aspectos" title="Programación orientada a aspectos – Spanisch" lang="es" hreflang="es" data-title="Programación orientada a aspectos" data-language-autonym="Español" data-language-local-name="Spanisch" class="interlanguage-link-target"><span>Español</span></a></li><li class="interlanguage-link interwiki-fa mw-list-item"><a href="https://fa.wikipedia.org/wiki/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%E2%80%8C%D9%86%D9%88%DB%8C%D8%B3%DB%8C_%D8%AC%D9%86%D8%A8%D9%87%E2%80%8C%DA%AF%D8%B1%D8%A7" title="برنامه‌نویسی جنبه‌گرا – Persisch" lang="fa" hreflang="fa" data-title="برنامه‌نویسی جنبه‌گرا" data-language-autonym="فارسی" data-language-local-name="Persisch" class="interlanguage-link-target"><span>فارسی</span></a></li><li class="interlanguage-link interwiki-fi mw-list-item"><a href="https://fi.wikipedia.org/wiki/Aspektiohjelmointi" title="Aspektiohjelmointi – Finnisch" lang="fi" hreflang="fi" data-title="Aspektiohjelmointi" data-language-autonym="Suomi" data-language-local-name="Finnisch" class="interlanguage-link-target"><span>Suomi</span></a></li><li class="interlanguage-link interwiki-fr mw-list-item"><a href="https://fr.wikipedia.org/wiki/Programmation_orient%C3%A9e_aspect" title="Programmation orientée aspect – Französisch" lang="fr" hreflang="fr" data-title="Programmation orientée aspect" data-language-autonym="Français" data-language-local-name="Französisch" class="interlanguage-link-target"><span>Français</span></a></li><li class="interlanguage-link interwiki-gl mw-list-item"><a href="https://gl.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_aspectos" title="Programación orientada a aspectos – Galicisch" lang="gl" hreflang="gl" data-title="Programación orientada a aspectos" data-language-autonym="Galego" data-language-local-name="Galicisch" class="interlanguage-link-target"><span>Galego</span></a></li><li class="interlanguage-link interwiki-hu mw-list-item"><a href="https://hu.wikipedia.org/wiki/Aspektusorient%C3%A1lt_programoz%C3%A1s" title="Aspektusorientált programozás – Ungarisch" lang="hu" hreflang="hu" data-title="Aspektusorientált programozás" data-language-autonym="Magyar" data-language-local-name="Ungarisch" class="interlanguage-link-target"><span>Magyar</span></a></li><li class="interlanguage-link interwiki-it mw-list-item"><a href="https://it.wikipedia.org/wiki/Programmazione_orientata_agli_aspetti" title="Programmazione orientata agli aspetti – Italienisch" lang="it" hreflang="it" data-title="Programmazione orientata agli aspetti" data-language-autonym="Italiano" data-language-local-name="Italienisch" class="interlanguage-link-target"><span>Italiano</span></a></li><li class="interlanguage-link interwiki-ja mw-list-item"><a href="https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0" title="アスペクト指向プログラミング – Japanisch" lang="ja" hreflang="ja" data-title="アスペクト指向プログラミング" data-language-autonym="日本語" data-language-local-name="Japanisch" class="interlanguage-link-target"><span>日本語</span></a></li><li class="interlanguage-link interwiki-ko mw-list-item"><a href="https://ko.wikipedia.org/wiki/%EA%B4%80%EC%A0%90_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D" title="관점 지향 프로그래밍 – Koreanisch" lang="ko" hreflang="ko" data-title="관점 지향 프로그래밍" data-language-autonym="한국어" data-language-local-name="Koreanisch" class="interlanguage-link-target"><span>한국어</span></a></li><li class="interlanguage-link interwiki-nl mw-list-item"><a href="https://nl.wikipedia.org/wiki/Aspectgeori%C3%ABnteerd_programmeren" title="Aspectgeoriënteerd programmeren – Niederländisch" lang="nl" hreflang="nl" data-title="Aspectgeoriënteerd programmeren" data-language-autonym="Nederlands" data-language-local-name="Niederländisch" class="interlanguage-link-target"><span>Nederlands</span></a></li><li class="interlanguage-link interwiki-pl mw-list-item"><a href="https://pl.wikipedia.org/wiki/Programowanie_aspektowe" title="Programowanie aspektowe – Polnisch" lang="pl" hreflang="pl" data-title="Programowanie aspektowe" data-language-autonym="Polski" data-language-local-name="Polnisch" class="interlanguage-link-target"><span>Polski</span></a></li><li class="interlanguage-link interwiki-pt mw-list-item"><a href="https://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_orientada_a_aspecto" title="Programação orientada a aspecto – Portugiesisch" lang="pt" hreflang="pt" data-title="Programação orientada a aspecto" data-language-autonym="Português" data-language-local-name="Portugiesisch" class="interlanguage-link-target"><span>Português</span></a></li><li class="interlanguage-link interwiki-ro mw-list-item"><a href="https://ro.wikipedia.org/wiki/Programarea_orientat%C4%83_pe_aspecte" title="Programarea orientată pe aspecte – Rumänisch" lang="ro" hreflang="ro" data-title="Programarea orientată pe aspecte" data-language-autonym="Română" data-language-local-name="Rumänisch" class="interlanguage-link-target"><span>Română</span></a></li><li class="interlanguage-link interwiki-ru mw-list-item"><a href="https://ru.wikipedia.org/wiki/%D0%90%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" title="Аспектно-ориентированное программирование – Russisch" lang="ru" hreflang="ru" data-title="Аспектно-ориентированное программирование" data-language-autonym="Русский" data-language-local-name="Russisch" class="interlanguage-link-target"><span>Русский</span></a></li><li class="interlanguage-link interwiki-sr mw-list-item"><a href="https://sr.wikipedia.org/wiki/%D0%90%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D1%98%D0%B5%D0%BD%D1%82%D0%B8%D1%81%D0%B0%D0%BD%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%B8%D1%80%D0%B0%D1%9A%D0%B5" title="Аспектно-оријентисано програмирање – Serbisch" lang="sr" hreflang="sr" data-title="Аспектно-оријентисано програмирање" data-language-autonym="Српски / srpski" data-language-local-name="Serbisch" class="interlanguage-link-target"><span>Српски / srpski</span></a></li><li class="interlanguage-link interwiki-sv mw-list-item"><a href="https://sv.wikipedia.org/wiki/Aspektorienterad_programmering" title="Aspektorienterad programmering – Schwedisch" lang="sv" hreflang="sv" data-title="Aspektorienterad programmering" data-language-autonym="Svenska" data-language-local-name="Schwedisch" class="interlanguage-link-target"><span>Svenska</span></a></li><li class="interlanguage-link interwiki-te mw-list-item"><a href="https://te.wikipedia.org/wiki/%E0%B0%86%E0%B0%B8%E0%B1%8D%E0%B0%AA%E0%B1%86%E0%B0%95%E0%B1%8D%E0%B0%9F%E0%B1%8D_%E0%B0%93%E0%B0%B0%E0%B0%BF%E0%B0%AF%E0%B1%86%E0%B0%82%E0%B0%9F%E0%B1%86%E0%B0%A1%E0%B1%8D_%E0%B0%AA%E0%B1%8D%E0%B0%B0%E0%B1%8B%E0%B0%97%E0%B1%8D%E0%B0%B0%E0%B0%BE%E0%B0%AE%E0%B0%BF%E0%B0%82%E0%B0%97%E0%B1%8D" title="ఆస్పెక్ట్ ఓరియెంటెడ్ ప్రోగ్రామింగ్ – Telugu" lang="te" hreflang="te" data-title="ఆస్పెక్ట్ ఓరియెంటెడ్ ప్రోగ్రామింగ్" data-language-autonym="తెలుగు" data-language-local-name="Telugu" class="interlanguage-link-target"><span>తెలుగు</span></a></li><li class="interlanguage-link interwiki-th mw-list-item"><a href="https://th.wikipedia.org/wiki/%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%80%E0%B8%82%E0%B8%B5%E0%B8%A2%E0%B8%99%E0%B9%82%E0%B8%9B%E0%B8%A3%E0%B9%81%E0%B8%81%E0%B8%A3%E0%B8%A1%E0%B9%80%E0%B8%8A%E0%B8%B4%E0%B8%87%E0%B8%A5%E0%B8%B1%E0%B8%81%E0%B8%A9%E0%B8%93%E0%B8%B0" title="การเขียนโปรแกรมเชิงลักษณะ – Thailändisch" lang="th" hreflang="th" data-title="การเขียนโปรแกรมเชิงลักษณะ" data-language-autonym="ไทย" data-language-local-name="Thailändisch" class="interlanguage-link-target"><span>ไทย</span></a></li><li class="interlanguage-link interwiki-tr mw-list-item"><a href="https://tr.wikipedia.org/wiki/Cephe_y%C3%B6nelimli_programlama" title="Cephe yönelimli programlama – Türkisch" lang="tr" hreflang="tr" data-title="Cephe yönelimli programlama" data-language-autonym="Türkçe" data-language-local-name="Türkisch" class="interlanguage-link-target"><span>Türkçe</span></a></li><li class="interlanguage-link interwiki-uk mw-list-item"><a href="https://uk.wikipedia.org/wiki/%D0%90%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D1%96%D1%94%D0%BD%D1%82%D0%BE%D0%B2%D0%B0%D0%BD%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F" title="Аспектно-орієнтоване програмування – Ukrainisch" lang="uk" hreflang="uk" data-title="Аспектно-орієнтоване програмування" data-language-autonym="Українська" data-language-local-name="Ukrainisch" class="interlanguage-link-target"><span>Українська</span></a></li><li class="interlanguage-link interwiki-vi mw-list-item"><a href="https://vi.wikipedia.org/wiki/L%E1%BA%ADp_tr%C3%ACnh_h%C6%B0%E1%BB%9Bng_kh%C3%ADa_c%E1%BA%A1nh" title="Lập trình hướng khía cạnh – Vietnamesisch" lang="vi" hreflang="vi" data-title="Lập trình hướng khía cạnh" data-language-autonym="Tiếng Việt" data-language-local-name="Vietnamesisch" class="interlanguage-link-target"><span>Tiếng Việt</span></a></li><li class="interlanguage-link interwiki-zh mw-list-item"><a href="https://zh.wikipedia.org/wiki/%E9%9D%A2%E5%90%91%E5%88%87%E9%9D%A2%E7%9A%84%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1" title="面向切面的程序设计 – Chinesisch" lang="zh" hreflang="zh" data-title="面向切面的程序设计" data-language-autonym="中文" data-language-local-name="Chinesisch" class="interlanguage-link-target"><span>中文</span></a></li> </ul> <div class="after-portlet after-portlet-lang"><span class="wb-langlinks-edit wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q30267#sitelinks-wikipedia" title="Links auf Artikel in anderen Sprachen bearbeiten" class="wbc-editpage">Links bearbeiten</a></span></div> </div> </nav> </div> </div> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> Diese Seite wurde zuletzt am 11. Mai 2024 um 06:29 Uhr bearbeitet.</li> <li id="footer-info-copyright"><div id="footer-info-copyright-stats" class="noprint"><a rel="nofollow" class="external text" href="https://pageviews.wmcloud.org/?pages=Aspektorientierte_Programmierung&amp;project=de.wikipedia.org">Abrufstatistik</a>&#160;· <a rel="nofollow" class="external text" href="https://xtools.wmcloud.org/authorship/de.wikipedia.org/Aspektorientierte_Programmierung?uselang=de">Autoren</a> </div><div id="footer-info-copyright-separator"><br /></div><div id="footer-info-copyright-info"> <p>Der Text ist unter der Lizenz <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">„Creative-Commons Namensnennung – Weitergabe unter gleichen Bedingungen“</a> verfügbar; Informationen zu den Urhebern und zum Lizenzstatus eingebundener Mediendateien (etwa Bilder oder Videos) können im Regelfall durch Anklicken dieser abgerufen werden. Möglicherweise unterliegen die Inhalte jeweils zusätzlichen Bedingungen. Durch die Nutzung dieser Website erklären Sie sich mit den <span class="plainlinks"><a class="external text" href="https://foundation.wikimedia.org/wiki/Policy:Terms_of_Use/de">Nutzungsbedingungen</a> und der <a class="external text" href="https://foundation.wikimedia.org/wiki/Policy:Privacy_policy/de">Datenschutzrichtlinie</a></span> einverstanden.<br /> </p> Wikipedia® ist eine eingetragene Marke der Wikimedia Foundation Inc.</div></li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy/de">Datenschutz</a></li> <li id="footer-places-about"><a href="/wiki/Wikipedia:%C3%9Cber_Wikipedia">Über Wikipedia</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Wikipedia:Impressum">Impressum</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Universal_Code_of_Conduct">Verhaltenskodex</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Entwickler</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/de.wikipedia.org">Statistiken</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Stellungnahme zu Cookies</a></li> <li id="footer-places-mobileview"><a href="//de.m.wikipedia.org/w/index.php?title=Aspektorientierte_Programmierung&amp;section=13&amp;veaction=edit&amp;mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobile Ansicht</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> <script>(RLQ=window.RLQ||[]).push(function(){mw.log.warn("This page is using the deprecated ResourceLoader module \"codex-search-styles\".\n[1.43] Use a CodexModule with codexComponents to set your specific components used: https://www.mediawiki.org/wiki/Codex#Using_a_limited_subset_of_components");mw.config.set({"wgHostname":"mw-web.codfw.main-6b8d669998-ltnnd","wgBackendResponseTime":122,"wgPageParseReport":{"limitreport":{"cputime":"0.073","walltime":"0.719","ppvisitednodes":{"value":235,"limit":1000000},"postexpandincludesize":{"value":430,"limit":2097152},"templateargumentsize":{"value":18,"limit":2097152},"expansiondepth":{"value":7,"limit":100},"expensivefunctioncount":{"value":7,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":10617,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 43.492 1 Vorlage:ISSN","100.00% 43.492 1 -total"]},"scribunto":{"limitreport-timeusage":{"value":"0.004","limit":"10.000"},"limitreport-memusage":{"value":680225,"limit":52428800}},"cachereport":{"origin":"mw-web.eqiad.main-5dc468848-xqxx2","timestamp":"20241122202759","ttl":2592000,"transientcontent":false}}});});</script> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Article","name":"Aspektorientierte Programmierung","url":"https:\/\/de.wikipedia.org\/wiki\/Aspektorientierte_Programmierung","sameAs":"http:\/\/www.wikidata.org\/entity\/Q30267","mainEntity":"http:\/\/www.wikidata.org\/entity\/Q30267","author":{"@type":"Organization","name":"Autoren der Wikimedia-Projekte"},"publisher":{"@type":"Organization","name":"Wikimedia Foundation, Inc.","logo":{"@type":"ImageObject","url":"https:\/\/www.wikimedia.org\/static\/images\/wmf-hor-googpub.png"}},"datePublished":"2003-11-11T10:45:35Z","headline":"Programmierparadigma f\u00fcr die objektorientierte Programmierung"}</script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10