Frage

Wie die meisten Entwickler hier und in der ganzen Welt, ich habe die Entwicklung von Software-Systemen mit dem objektorientierten Programmierung (OOP) Techniken seit vielen Jahren. Also, wenn ich die aspektorientierte Programmierung lesen (AOP) viele der Probleme löst, dass traditionelle OOP nicht vollständig oder direkt löst, Ich mache eine Pause und denke, es ist real?

Ich habe eine Menge von Informationen zu lesen versuchen, die Schlüssel dieses AOP Paradigmas und ich ist in dem gleichen Ort zu lernen, so, ich seine Vorteile in der realen Welt der Anwendungsentwicklung besser verstehen wollte.

Hat jemand habe die Antwort?

War es hilfreich?

Lösung

Warum "vs"? Es ist nicht „vs“. Sie können Aspect Oriented Programming in Verbindung mit der funktionalen Programmierung, aber auch in Kombination mit einer objektorientierten verwenden. Es ist nicht "vs", es ist "Aspect Oriented Programming mit Objektorientierte Programmierung".

Für mich AOP ist eine Art „Meta-Programmierung“. Alles, was AOP ist auch ohne es nur um mehr Code hinzufügen getan werden könnte. AOP sparen Sie einfach diesen Code zu schreiben.

Wikipedia hat eines der besten Beispiele für diese Meta-Programmierung. Angenommen, Sie haben eine grafische Klasse mit vielen „gesetzt ... ()“ Methoden. Nach jedem Satz Verfahren änderten sich die Daten der verwendeten Grafiken, damit die Grafik geändert und somit müssen die Grafiken auf dem Bildschirm aktualisiert werden. Angenommen, die Grafik neu zu zeichnen Sie anrufen müssen „Display.update ()“. Der klassische Ansatz ist, diese zu lösen durch Zugabe von mehr Code . Am Ende jeden Satz Methode Sie schreiben

void set...(...) {
    :
    :
    Display.update();
}

Wenn Sie 3 Set-Methoden haben, ist das kein Problem. Wenn Sie 200 (hypothetische) haben, es wird immer echte schmerzhaft dies überall hinzuzufügen. Auch wenn Sie eine neue Set-Methode hinzufügen, müssen Sie sicher sein, nicht zu vergessen, am Ende des Hinzufügen diesen, sonst hat man nur einen Fehler erstellt.

AOP löst dies ohne Tonnen von Code hinzufügen, anstatt Sie einen Aspekt hinzufügen:

after() : set() {
   Display.update();
}

Und das ist es! Anstatt das Schreiben der Update-Code selbst, sagen Sie nur das System, das nach einer bestimmten () pointcut erreicht ist, muss sie diesen Code ausführen und es wird diesen Code ausführen. Keine Notwendigkeit, 200 Methoden zu aktualisieren, keine Notwendigkeit, um sicherzustellen, dass Sie nicht an einer neuen Satz-Methode, um diesen Code hinzuzufügen vergessen. Zusätzlich brauchen Sie nur ein pointcut:

pointcut set() : execution(* set*(*) ) && this(MyGraphicsClass) && within(com.company.*);

Was bedeutet das? Das heißt, wenn eine Methode mit dem Namen wird „gesetzt *“ (* bedeutet einen beliebigen Namen nach Satz folgen könnte), und zwar unabhängig davon, was die Methode zurückgibt (erste Sternchen) oder welche Parameter es dauert (dritte Stern) und es Teil des Pakets ist eine Methode der MyGraphicsClass und diese Klasse „com.company. *“, dann ist dies ein Satz () pointcut. Und unser erster Code sagt " nach jede Methode ausgeführt wird, der eine Reihe pointcut ist, führen Sie den folgenden Code".

Sehen Sie, wie AOP löst elegant das Problem hier? Eigentlich hier beschrieben alles kann bei der Kompilierung durchgeführt werden. Ein AOP Präprozessor kann einfach ändern Sie Ihre Quelle (zum Beispiel das Hinzufügen Display.update () bis zum Ende eines jeden Set-Point Cut-Methode), bevor auch Kompilieren der Klasse selbst.

Allerdings zeigt dieses Beispiel auch einer der großen Nachteile von AOP. AOP tut tatsächlich etwas, das viele Programmierer ein „ Anti-Pattern betrachten “. Die genauen Muster „ Aktion in einem Abstand “ genannt.

  

Aktion in einem Abstand ein   anti-Muster (a erkannt gemeinsame   Fehler) in dem Verhalten in einem Teil   der ein Programm basierend auf wild variiert   schwer oder gar nicht erkennen   Operationen in einem anderen Teil der   Programm.

Als Neuling auf ein Projekt, könnte ich nur den Code von jeder Set-Methode gelesen und es gebrochen betrachten, da sie die Anzeige nicht zu aktualisieren scheinen. Ich glaube nicht, sehen , indem nur auf den Code einer Set-Methode suchen, dass, nachdem er ausgeführt wird, wird ein anderer Code „magische Weise“ die Anzeige aktualisieren ausgeführt werden. Ich halte dies für einen ernsthaften Nachteil! Durch die Änderungen an einer Methode, könnten seltsame Fehler eingeführt werden. Weiteres Verständnis des Codeflusses Code, wo bestimmte Dinge scheinen richtig zu funktionieren, aber nicht offensichtlich ist (wie gesagt, sie arbeiten nur magisch ... irgendwie), wirklich hart ist.

Update

Nur um zu klären, dass: Manche Menschen den Eindruck haben, könnte ich AOP ich sage etwas schlecht ist und nicht verwendet werden sollte. Das ist nicht, was ich sage! AOP ist eigentlich ein großartiges Feature. Ich sage nur „Verwenden Sie es sorgfältig“. AOP nur Probleme verursachen, wenn Sie normale mischenCode und AOP für die gleiche Aspect . In dem obigen Beispiel haben wir den Aspekt des Wert eines graphischen Objekt zu aktualisieren und das aktualisierte Objekt zu malen. Das ist in der Tat ein einzelner Aspekt. Coding die Hälfte davon als normalen Code und die andere Hälfte davon als Aspekt ist es, was das Problem hinzufügt.

Wenn Sie AOP für einen ganz anderen Aspekt, z.B. für die Protokollierung, werden Sie nicht in das Anti-Pattern Problem laufen. In diesem Fall könnte ein Neuling auf dem Projekt fragen, „Wo diese alle Log-Meldungen kommen? Ich sehe jede Protokollausgabe im Code nicht“, aber das ist kein großes Problem. Änderungen, die er an die Programmlogik macht bricht kaum die Protokoll Anlage und Änderungen an der Protokoll Anlage gemacht wird kaum seine Programmlogik brechen - diese Aspekte völlig getrennt sind. AOP für die Protokollierung hat den Vorteil, dass Ihr Programmcode vollständig konzentrieren kann auf zu tun, was sie tun sollen, und Sie können nach wie vor anspruchsvolles Logging haben, ohne den Code mit überall von Hunderten von Log-Meldungen vollgestopft werden. Auch wenn neuer Code eingeführt wird, auf magische Weise Protokollmeldungen zur richtigen Zeit mit dem richtigen Inhalt angezeigt. Der Neuling Programmierer könnte nicht verstehen, warum sie da sind oder woher sie kamen, aber da sie die „richtige Sache“ auf der „richtigen Zeitpunkt“ wird sich einzuloggen, kann er nur nehmen glücklich, dass sie da sind und sich nach etwas anderem .

So eine gute Verwendung von AOP in meinem Beispiel wäre immer anmelden, wenn jeder Wert über eine Set-Methode aktualisiert wurde. Dies wird nicht ein Anti-Muster erstellen und so gut wie nie die Ursache eines Problems sein.

Man könnte sagen, wenn Sie leicht AOP missbrauchen können so viele Probleme zu schaffen, ist es eine schlechte Idee, alles zu verwenden. Allerdings Welche Technologie kann nicht missbraucht werden? Sie können Datenkapselung missbrauchen, können Sie die Vererbung missbrauchen. So ziemlich jede nützliche Programmiertechnik kann missbraucht werden. Betrachten wir eine Programmiersprache so begrenzt, dass es nur enthält Funktionen, die nicht missbraucht werden kann; eine Sprache, wo Funktionen, die nur verwendet werden können, wie sie anfänglich verwendet werden, wurden bestimmt. Eine solche Sprache so begrenzt sein würde, dass es fraglich ist, ob es kann sogar für reale Welt Programmierung verwendet werden.

Andere Tipps

OOP und AOP schließen sich nicht aus. AOP kann gute Ergänzung zu OOP sein. AOP ist besonders praktisch für das Hinzufügen von Standard-Code wie Protokollierung, Performance Tracking etc. Verfahren ohne den Methodencode mit diesem Standard-Code zu verstopfen.

aspektorientierte pogramming bietet eine schöne Art und Weise Querschnittsthemen wie die Protokollierung zu implementieren, Sicherheit. Dieser Querschnitt concers sind Stücke von Logik, die an vielen Orten angewandt werden müssen, aber tatsächlich hat nichts mit der Business-Logik zu tun.

Sie sollten sehen, AOP als Ersatz von OOP nicht, mehr als ein netten Add-on, dass macht Ihren Code sauber, lose gekoppelte und auf die Geschäftslogik konzentrieren. Also von AOP Anwendung werden Sie zwei große Vorteile gt:

  1. Die Logik für jedes Anliegen ist jetzt an einem Ort, im Gegensatz ganzen Codebasis gestreut wird.

  2. Klassen sind sauberer, da sie nur Code für ihr primäres Anliegen (oder Kernfunktionalität) enthalten und sekundäre Bedenken zu Aspekten verschoben.

Ich denke, es auf diese Frage keine allgemeine Antwort ist aber eine Sache zu beachten ist, dass AOP nicht ersetzen OOP sondern fügt bestimmte Zersetzung Features, die die so genannten Tyrannei der Adresse die dominante Zusammensetzung ( 1 ) (oder Ablängen betrifft).

Es hilft sicherlich in bestimmten Fällen so lange wie Sie die Kontrolle über die Werkzeuge und Sprachen sind für ein bestimmtes Projekt zu verwenden, sondern fügt auch ein neues Maß an Komplexität in Bezug auf Interaktion von Aspekten und die Notwendigkeit für zusätzliche Tools wie die < a href = "http://www.eclipse.org/ajdt" rel = "nofollow noreferrer"> AJDT noch Ihr Programm zu verstehen.

Gregor Kiczales einmal gab einen interessanten Einführungsvortrag auf AOP bei Google Tech Talks, die ich empfehlen, hier: Aspect Oriented Programming. Radical Forschung in Modularität

Vor allem AOP nicht OOP ersetzen. AOP erweitert OOP. Die Ideen und Praktiken der OOP bleiben relevant. ein gutes Objekt-Design hat, wird es wahrscheinlich, sie zu verlängern erleichtert Aspekte.

Ich denke, die Ideen, die AOP bringt wichtig sind. Wir müssen Wege erarbeiten zu implementieren Querschnitts-Bedenken in Bezug auf verschiedene Klassen in Ihrem Programm, ohne die Klassen selbst ändern zu müssen. Aber ich denke, das AOP wird schließlich nur ein Teil von anderen Tools werden wir nutzen und kein separates Werkzeug oder Technik. Wir sehen bereits, dies geschieht.

Ein paar dynamischer Sprachen wie Ruby und Python haben Sprachkonstrukte wie Mixins, die die gleichen Probleme zu lösen. Dies sieht viel wie AOP aber ist besser integriert in der Sprache.

Frühling und Schloss und ein paar anderen Dependency Injection-Framework haben Optionen Verhalten zu den Klassen hinzuzufügen sie injizieren. Dies ist eine Möglichkeit, Runtime-Weben tun, und ich denke, das ist eine Menge Potenzial hat.

Ich glaube nicht, dass Sie ein völlig neues Paradigma verwenden AOP lernen. Die Ideen sind interessant, aber langsam durch vorhandene Werkzeuge und Sprachen absorbiert zu werden. Nur informiert bleiben und diese Tools ausprobieren.

AOP ist ein neues Programmierparadigma mit diesem Konzept handelt. Ein Aspekt ist ein Software-Unternehmen einen spezifischen nicht-funktionalen Teil der Anwendung zu implementieren.

Ich denke, dieser Artikel ist ein guter Ort, um mit Aspect Oriented Programming zu starten: http://www.jaftalks.com/wp/ index.php / Einführung zu aspektorientierte Programmierung /

OOP wird hauptsächlich verwendet, um Ihre Business-Logik , während AOP organisieren hilft, Ihre Nicht-funktionale Dinge zu organisieren wie Auditing, Logging, Transaktionsmanagement, Sicherheit usw.

So können Sie Ihre Business-Logik mit nicht-fiktionaler Logik entkoppeln können, den Code sauberer macht.

Otter Vorteil ist, können Sie die Beratung (zB Revision) gelten sehr konsequent, ohne eine Schnittstelle implementiert, die ohne sie zu berühren Business-Logik

für Änderung eine große Flexibilität gibt
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top