Hallo Hans,
Kann mir jemand mal erklären, was DAS TOLLE an Aspect J sein soll ? Vielleicht bin ich ja auf dem Holzweg, aber das ganze Aspect-Gelumpe mit Pointcut, Before und After kann ich doch auch mit ganz normalen Logging-Anweisungen (z.B. System.out.println("Aufruf von Methode xy mit Parameter a=5, b=7") zu Beginn der Methode xy) bzw. dem üblichen try-catch-Kontrukten machen, oder ?
Ja das kann man. Die Idee von AOP ist aber, solche verschiedenen Aspekte einer Klasse getrennt implementieren zu können und so übersichtlicheren Code zu bekommen.
Das logging-Beispiel ist so das Standardbeispiel für AOP. Das funktioniert auch sehr schön, weil logging den eigentlichen Programmablauf ja nicht verändert.
Ein anderes Beispiel ist z.B. eine Schicht für Zugriffsberechtigungen z.B. für die Verwaltung von Bankkonten (das Standardbeispiel für objektorientierten Entwurf ;-) Mit AOP könnte man erst mal die eigentlichen Operationen wie Überweisen implementieren und dann einen Aspekt dazu packen, der vor den einzelnen Operationen die entsprechenden Überprüfungen durchführt.
Ich habe das bisher noch nicht praktisch ausprobiert aber bislang bin ich aus mehreren Gründen nicht wirklich überzeugt:
- AOP zerstört die Modularität. So kann ein Aspekt das verhalten einer Klasse von außen verändern ohne dass die Klasse dies vorsieht. Vererbung kann das zwar auch, aber nicht ohne dass das entstandene Objekt seinen Typ ändert und auch nur viel eingeschränkter.
- Es gibt verschiedene Entwurfsmuster um ähnliche Funktionalität zu ereichen. Man könnte z.B. eine ereignisbasierte Schnittstelle zur Klasse hinzufügen, die Logging oder den Eingriff in den Programmablauf z.B. für oben beschriebene Zugriffskontrolle erlaubt. Man könnte auch das Decorator-Muster verwenden und das verhalten damit in 3 getrennten Schichten realisieren.
- Das Hinzufügen von weiteren, nicht beim Entwurf der eigentlichen Klasse angedachten Aspekten ist ein Märchen. Die Klasse muss die Operationen schon so untergliedert haben, dass man da mit AOP vernünftig eingreifen kann.
Bei Logging ist das noch kein Problem, bei dem Zugriffsrechte-Beispiel muss man aber z.B. mindestens einen Parameter für den Benutzernamen vorsehen, obwohl den die Klasse selbst nicht braucht. Aber ein Aspekt kann ja nicht die Signatur einer Methode ändern. - Soweit ich das überblicke gibt es keine (sinnvolle) Regelung für die Reihenfolge mehrer Aspekte, die an den selben Stellen in den Ablauf eingreifen. Mir scheint, dass da Programmverhalten verteilt wird, das womöglich zusammenhängt und auch nicht unabhängig verändert werden kann.
- AOP ist kein Ersatz für oben erwähnte objektorientierte Lösungsanstäze. Diese sind im Gegensatz zu AOP auch zur Laufzeit rekonfigurierbar.
Grüße
Daniel