Aspektorientierte Programmierung (AOP)

Ich möchte in diesem Artikel heute kurz die aspektorientierte Programmierung (AOP) vorstellen, die ein Programmierparadigma für die objektorientierte Programmierung (OOP) ist, um generische Funktionalitäten über mehrer Klassen hinweg zu verwenden.

Grundsätzlich hat Software bestimme Aufgaben/Anforderungen zu erfüllen, wobei sich die Anforderungen grob in zwei Bereiche gliedern lassen:

  • Core-Level Concerns oder auch funktionale Anforderungen:
    hierunter versteht man Anforderungen an eine Software, die sich gut in einzelne Funktionen kapseln lassen und als Module oder Objekte implementiert werden
  • System-Level Concerns oder auch technische Rahmenbedigungen:
    hierunter versteht man Anforderungen, die sich nicht einfach kapseln lassen, da sie an vielen Stellen implementiert werden müssen

Um diese zwei Bereiche einer Software physisch voneinander zu trennen, kann die AOP als Werkzeug genutzt werden. Als Beispiel nehme ich mal die Entwicklung eines Frameworks.

Bei der Entwicklung von Frameworks hilft der Einsatz von AOP dabei, die technischen Rahmenbedingungen des Frameworks (Caching, Zugriffsrechte, Transaktionen, Logging) bereit zu stellen, ohne dass sie für jede Komponente separat implementiert werden müssen. Ein Benutzer des Frameworks kann diese Funktionalitäten dann je nach vorgegebener Implementierung z.B. über Vererbung oder MetaTags verwenden. Zusätzlich bietet es den Vorteil, dass die einzelnen Komponenten nicht mit Framework-Code überfrachtet werden. So kann das Framework dank AOP den ursprünglichen Programmablauf umleiten, wenn Sicherheitsaspekte den unberechtigen Zugriff auf geschütze Programmteile verhindern. Oder die Ausführungsgeschwindigkeit kann durch Caching-Aspekte erhöht werden, da Aufrufe von aufwendigen Programmteilen, wie Datenbank- oder Dateisystemzugriffen, reduziert werden können.

Neben den Vorteil der logischen und physischen Trennung der Komponenten von den technischen Details (Aspekten) sollten die Nachteile nicht vernachlässigt werden. So kann es zu unerwünschten und schwer nachvollziehbaren Wechselwirkungen zwischen einzelnen Aspekten kommen. Auch kann sich die Nachvollziehbarkeit vom Programmverhalten reduzieren, da aus dem Quellcode nicht direkt ersichtlich ist, an welchen Stellen ein Aspekt zuständig ist, was unter anderem auch ein Debugging erschwert. Auch kann es im allgemeinen zu Performance-Einbußen kommen.