9
votes

Quel est un court exemple de déclarations inter-types dans Aspectj qui démontre l'utilité de l'approche?

J'ai d'abord pensé à utiliser des iTD pour définir le journal d'enregistrement final privé statique privé = ... pour certains cas non liés, mais cela ne ressemble pas assez à une amélioration évidente de l'utiliser comme une démonstration Exemple.

Y a-t-il un exemple standard / suggéré de l'utilisation du IDD, que les gens doivent utiliser à des fins d'enseignement?


0 commentaires

3 Réponses :


10
votes

Java ne prend pas en charge plusieurs héritages ou mixin. Mais avec ITD, vous pouvez faire Scala comme des traits ou rubis comme des mélanges.

Voici un exemple en tirant parti de la JPA et du ressort configurable: em> p>

interface: p> xxx pré>

aspectj ITD: p>

@Entity
@Configurable
public class MyJPAObject implements DomainNotify {
}


0 commentaires

16
votes

J'aimerais ajouter un autre exemple à la réponse d'Adam.

Utiliser des aspects est un moyen d'améliorer la modularisation de votre logiciel, ainsi que de l'OUP, sauf que le POO est appliqué "verticalement", tandis que l'AOP est appliquée " horizontalement ". p>

Donc, tandis que des conseils peuvent être utilisés pour modifier" horizontalement "le comportement de toutes les méthodes répondant à certains critères, le code Aften de l'avis aura également besoin de certaines données, et ITD permet d'ajouter que Les champs "horizontalement" tout en contiennent en même temps dans une seule unité de compilation (l'aspect) Données et code associés. P>

Comme vous ajoutez des données via des champs ITD, vous voudrez probablement également offrir une méthode manipuler ces champs, comme un setter / getter. P>

J'ai essayé de le reformer quelques fois, j'espère que c'est facile à comprendre. P>

Pour vous donner un exemple, supposons que vous ayez Un programme d'édition graphique, où l'utilisateur peut créer, supprimer et afficher un certain nombre de formes (jolie canonique EH?: D). P>

Les formes ont beaucoup de données, par exemple ils ont une couleur, coordinat esc etc. qui appartiennent correctement à la classe elle-même. Toutefois, comme il s'agit d'une application Web 3.0, vous souhaitez que les utilisateurs puissent coopérer sur un seul dessin, ce qui signifie que chaque forme doit savoir quand il est modifié, s'il a été communiqué à d'autres utilisateurs que la forme est modifiée, en ce qui concerne les autres utilisateurs. est verrouillé par un utilisateur qui le traînait réellement, etc. p>

Vous pouvez le faire en une simple oop, la mise en œuvre de pièces pertinentes en forme ou quelle que soit votre classe racine, mais vous allez polluer toutes vos configurations avec des appels Comme "cette.setDirty (true)" ou des trucs similaires. P>

Au lieu de cela, vous décidez de faire un AOP et de la mettre en œuvre dans un aspect. Dans ce cas, vous pouvez facilement ajouter un conseil après toutes les configurissures, mais vous devez également stocker une "sale" booléenne, voire une liste de propriétés modifiées si vous souhaitez optimiser votre protocole réseau n'envoie que des deltas de modifications. p>

Vous pouvez l'implémenter comme p>

public aspect ShapesAreDirtyThings {

   private boolean Shape.dirty;

   after(Shape s) : execution(* Shape+.set*(..)) {
       s.dirty = true;
       // Set some other global field, start a thread to communicate 
       // to other users about the change, whatever .. 
   } 

   public boolean Shape.isDirty() {
       return s.dirty;
   }

   public boolean Shape.findDirtyChildren() { // whatever
} 


0 commentaires

3
votes

Jetez un coup d'œil au printemps roo. C'est un dev. env utilisation printemps. Je le vois comme un rubis sur des rails mais en Java avec le printemps; -)

Il utilise un iTD beaucoup pour générer un getter, un setter, une totring, etc. Basé sur les attributs que vous définissez lorsque vous créez votre classe.

printemps roo


0 commentaires