Was ist ein kurzes Beispiel für Inter-Type-Deklarationen in AspectJ, die die Nützlichkeit des Ansatzes demonstriert?

8

Ich dachte zuerst darüber nach, ITDs zu verwenden, um private static final Logger logger = ... für einige nicht miteinander verwandte Fälle zu definieren, aber es sieht nicht nach einer offensichtlichen Verbesserung aus, die als Demonstrationsbeispiel verwendet werden könnte.

Gibt es ein standardisiertes / vorgeschlagenes Beispiel für die ITD-Nutzung, die Menschen für Unterrichtszwecke verwenden sollten?

    
soc 13.09.2011, 14:14
quelle

3 Antworten

14

Ich möchte ein weiteres Beispiel zu Adams Antwort hinzufügen.

Die Verwendung von Aspekten ist eine Möglichkeit, die Modularisierung Ihrer Software zu verbessern, ebenso wie OOP, außer dass OOP "vertikal" angewendet wird, während AOP "horizontal" angewendet wird.

So, während Beratung verwendet werden kann, um "horizontal" das Verhalten aller Methoden zu ändern, die auf einige Kriterien reagieren, benötigt aften code in advice auch einige Daten, und ITD macht es möglich, diese Felder "horizontal" hinzuzufügen, während der Gleichzeitig enthalten in einer einzigen Kompilierungseinheit (der Aspekt) verwandte Daten und Code.

Da Sie Daten über ITD-Felder hinzufügen, möchten Sie wahrscheinlich auch eine Methode zum Bearbeiten dieser Felder anbieten, z. B. einen Setter / Getter.

Ich habe versucht, es ein paar Mal umzuformulieren, ich hoffe es ist leicht zu verstehen.

Um Ihnen ein Beispiel zu geben, nehmen Sie an, Sie haben ein grafisches Bearbeitungsprogramm, in dem der Benutzer eine Reihe von Formen erstellen, löschen und anzeigen kann (ziemlich kanonisch, wie?: D).

Formen haben viele Daten, zum Beispiel haben sie eine Farbe, Koordinaten usw., die korrekt zur Klasse selbst gehören. Da es sich um eine Web 3.0-Anwendung handelt, möchten Sie jedoch, dass Benutzer in einer einzigen Zeichnung zusammenarbeiten können. Das bedeutet, dass jede Form wissen muss, wann sie geändert wird, ob sie anderen Benutzern mitgeteilt wurde, dass die Form geändert wurde ist durch einen Benutzer gesperrt, der es tatsächlich usw. zieht.

Sie können dies in einfacher OOP tun, indem Sie relevante Teile in Shape oder was auch immer Ihre Wurzelklasse ist, aber Sie werden alle Ihre Setter mit Aufrufen wie "this.setDirty (true)" oder ähnlichem belasten.

Stattdessen entscheiden Sie sich für AOP und implementieren es in einem Aspekt. In diesem Fall können Sie leicht einen Ratschlag nach allen Setter hinzufügen, aber Sie müssen auch einen "schmutzigen" booleschen Wert oder sogar eine Liste von geänderten Eigenschaften speichern, wenn Sie Ihr Netzwerkprotokoll optimieren und nur Deltas von Änderungen senden möchten.

Sie könnten es wie

implementieren %Vor%

Dies ist nichts, was Sie mit gewöhnlichem AOP nicht tun können, es ist einfach eine Sache, in einer einzigen Kompilierungseinheit Informationen, die von diesem Rat benötigt werden, und Methoden, die schließlich mit diesen Daten arbeiten, zu kapseln.

    
Simone Gianni 13.09.2011, 17:34
quelle
8

Java unterstützt keine Mehrfachvererbung oder -mischung. Aber mit ITDs kannst du Scala wie Traits oder Ruby wie Mixins machen.

Hier ist ein Beispiel, das JPA und Spring's Configurable nutzt:

Schnittstelle:

%Vor%

AspectJ ITD:

%Vor%

Nun wird jede Klasse, die DomainNotify implementiert, die gewollten ITD-Methoden erhalten.

%Vor%     
Adam Gent 13.09.2011 14:34
quelle
3

Schauen Sie sich Spring ROO an. Es ist ein schneller Entwickler. env mit Frühling. Ich sehe es als Ruby on Rails, aber in Java mit Spring ;-)

Es verwendet ITD sehr viel, um Getter, Setter, toString usw. zu erzeugen, basierend auf den Attributen, die Sie beim Erstellen Ihrer Klasse definieren.

Spring Roo

    
Cygnusx1 16.09.2011 15:26
quelle

Tags und Links