Ich komme zu spät zum Spiel, aber ich biete dies für spätere Entwickler, die über diese Frage stolpern könnten.
Ich rate dringend von AOP ab, wenn Ihre Anwendung davon abhängt, dass sie ordnungsgemäß funktioniert. Aspekte funktionieren so:
- Beratung (zusätzliches Verhalten) wird angewendet auf
- Verknüpfungspunkte (Stellen, an denen der zusätzliche Code angehängt werden kann, ein solcher Methodenbeginn oder -ende oder wenn ein bestimmtes Ereignis ausgelöst wird)
- ... wo Pointcut- Muster (ein Muster, das erkennt, ob ein bestimmter Join-Punkt übereinstimmt) übereinstimmen
Für alle, die schon seit langer Zeit Computer benutzen, ist die Tatsache, dass Muster verwendet werden, möglicherweise etwas, das man genau betrachten sollte. Hier ist ein Beispiel für einen Pointcut, der mit jeder benannten Methode übereinstimmt, set
unabhängig von den Argumenten:
call(* set(..))
Das ist also ein ziemlich weitreichender Punkt, und es sollte klar sein, dass es ratsam ist, vorsichtig damit umzugehen (kein Wortspiel beabsichtigt), da Sie Ratschläge auf viele Dinge anwenden.
Oder wie auch immer, lassen Sie uns auf alles hinweisen, unabhängig von Name oder Unterschrift!
execution(* *(..))
Wir sollten also vorsichtig sein, da hier viel Power steckt, aber dies ist kein Argument gegen Aspekte - es ist ein Argument zur Vorsicht, da hier viel Power steckt und der Mustervergleich leicht schief gehen kann (schlagen Sie einfach Ihre Lieblingssuchmaschine nach aop bugs und viel spaß
So sieht also ein relativ sicherer Pointcut aus:
pointcut setter(): target(Point) &&
( call(void setX(int)) ||
call(void setY(int)) );
Dies gibt explizit Hinweise, ob Methoden mit Namen setX
oder setY
für ein Point
Objekt gefunden werden. Die Methoden können nur int
s empfangen und müssen es auch sein void
. Sieht ziemlich sicher aus, oder? Nun, das ist sicher, wenn diese Methoden existieren und Sie den richtigen Rat angewendet haben. Wenn nicht, schade; es versagt stillschweigend.
Ein Freund hat zum Beispiel versucht, eine Java-Anwendung zu debuggen, bei der alle ab und zu falsche Daten zurückgaben. Es war ein seltener Fehler und schien nicht mit einem bestimmten Ereignis oder Daten im Besonderen korreliert zu sein. Es war ein Threading-Fehler, der bekanntermaßen schwer zu testen oder zu erkennen ist. Es stellte sich heraus, dass sie Aspekte verwendeten, um Methoden zu sperren und sie "threadsicher" zu machen, aber ein Programmierer, der eine Methode umbenannte und einen Pointcut nicht übereinstimmte, verursachte einen unbeaufsichtigten Bruch der Anwendung.
Daher sage ich den Leuten, wenn sie AOP verwenden müssen, um Aspekte wie Ausnahmen zu behandeln: In einem gut konzipierten System können sie entfernt werden, und die Software funktioniert weiterhin ordnungsgemäß. Wenn die Funktionalität des Programms jedoch von AOP abhängt, führen Sie eine ungerechtfertigte Fragilität in Ihr Programm ein.
Protokollierung, Debugging und Tracing sind daher hervorragende Beispiele für Verhaltensweisen, die in Bezug auf Aspekte, aber auch auf die Sicherheit perfekt sind. Nee. Fadensicherheit? Nee.
Eine robuste Alternative zu AOP finden Sie unter Eigenschaften . Anstatt an die Sprache gebunden zu sein, werden sie direkt in die Sprache integriert, benötigen keine "trait aware" IDE (obwohl dies hilfreich sein kann) und weisen Kompilierungsfehler auf, wenn die von Ihnen benötigten Methoden nicht vorhanden sind. Traits erledigen die Trennung von Anliegen viel sauberer, da das Problem von Anfang an besser definiert wurde. Ich benutze sie ausgiebig und sie sind fantastisch.