SlideShare a Scribd company logo
1 of 48
Download to read offline
Méta-programmation
&
Programmation
Orientée Aspect

Laurent Broudoux (@lbroudoux) | Janvier 2014
Quelques mots...
Laurent Broudoux
Le jour ...
Architecte IT Senior chez MMA
Mots-clés : Java, SOA, Agile, Software factories
La nuit …
Coder, geek, open source comitter (voir http://github.com/lbroudoux)

Me joindre / suivre
@lbroudoux
laurent.broudoux@gmail.com
http://lbroudoux.wordpress.com
Méta

Programmation

? ? ??
? ? ? ?
?

Comprendre...
Que sont les Métadonnées ?
●

Des données à propos d'autres données ou des données
décrivant d'autres données
–

Structurale (conjoint à la création de la donnée)
●
●

Valeurs possibles

●

Relations avec d'autres données

●

–

Type

Objectifs

Descriptives (après la création de la donnée)
●

Conditions de création

●

Contexte d'existence

●

Etc ...
Comment définir des Métadonnées ?
●

De façon implicite
–

●

En suivant des conventions

De façon explicite
–

A l'extérieur du code
●

–

Configuration : XML, YML, …

A l'intérieur du code
●

Commentaires
–

●

Javadoc (@author, @version, @since, ...)

Code lui-même
–
–
–

Meta tags HTML (<meta name=''author'' content=''L. Broudoux''>)
Annotations Java (@Override, @Deprecated, …)
Domain Specific Language pour les langages dynamiques
Méta Programmation ?
●

Ecriture de programmes qui écrivent ou manipulent
d'autres programmes ou eux-même en se basant sur des
métadonnées.
« It is about programming at the meta level, that is
about changing your interpreter or changing how code
is compile »
- Ralph E. Johnson
Bénéfices
●

Lors de la conception
–

Modularité
●

–
●

Séparation des préoccupations

Evolutivité

Lors du développement
–

Gain de productivité, temps
●

En évitant le code boiler plate

–

Minimisation du LOC

–

Simplicité
Un process pour la Métaprogrammation
Comment exprimer les Métadonnées ?

Définition des Métadonnées
Comment extraire,
récupérer les

Métadonnées associées au
programme courant ?

Sous quel forme (implicite vs explicite,
externe vs interne) ?

Processing des Métadonnées

Comment opérer des
transformations du

programme courant en

fonction des Métadonnées
trouvées ?

Interprétation des Métadonnées
Un exemple d'application (i)
●

Soit une méthode permettant de retrouver les
utilisateurs ayant le même prénom …
–

Imaginons la intégrée dans une classe DAO
Un exemple d'application (ii)
●

On désire maintenant ajouter une méthode permettant
de retrouver les utilisateurs ayant le même nom …
–

Imaginons la intégrée dans la même classe DAO

Quelles différences ?
Un exemple d'application (iii)
●

●

En mettant en œuvre les principes de la Métaprogrammation, on peux imaginer ne plus avoir à écrire ces
méthodes !
On décide d'une convention permettant de faire la
correspondance …

… on implémente la transformation nécessaire pour
ajouter ces fonctions !
Outils pour

implémenter

Principalement en Java ...
Un processus pour la Métaprogrammation
Comment exprimer les Métadonnées ?

Définition des Métadonnées
Comment extraire,
récupérer les

Métadonnées associées au
programme courant ?

Sous quel forme (implicite vs explicite,
externe vs interne) ?

Processing des Métadonnées

Comment opérer des
transformations du

programme courant en

fonction des Métadonnées
trouvées ?

Interprétation des Métadonnées
Conventions
●

●

●

Définition des Métadonnées

La façon la plus simple est de définir des conventions :
de nommage ou de localisation.
Attention : le bon respect de ces conventions ne peut
souvent pas être vérifié !!
Exemples :
–

Nommage du test case de Foo : FooTest

–

Nommage des méthodes liées à la persistance d'objets : save(),
update(), delete(), findAll(), findBy*(), …

–

Localisation des classes persistantes dans /grails-app/domain
pour Grails
On nomme cette approche « Convention Over Configuration »
Paramétrage Externe
●

●

Définition des Métadonnées

On décrit dans un fichier annexe des propriétés,
comportements ou contraintes supplémentaires
d'éléments de l'application.
Exemples :
–

ejb-jar.xml pour EJB

–

routes.rb pour RoR
Annotations Java
●

●

Définition des Métadonnées

Depuis Java 5, le langage offre la possibilité de définir
ses propres annotations
Une annotation se définit dans un fichier .java avec le
mot clé @interface
Cible : une classe, une
méthode, un champs

Rétention : seulement dans le

source, dans le bytecode mais
non accessible, dans le
bytecode et accessible

Attributs : éléments de

configuration des métadonnées portées par
l'annotation.
Annotations Java
●

Définition des Métadonnées

Une annotation s'applique en important simplement la
classe correspondante et en utilisant le marqueur
@<Mon annotation> avant l'élément visé (classe,
méthode ou champs)
Domain Specific Language
●

●

Définition des Métadonnées

Dans le cadre des langages dynamiques, on peut utiliser
des DSL directement embarqués dans le code mais en
dehors de la partie algorithmie.
Exemples :
–

Contraintes dans Groovy/Grails

–

Règles de routage dans RoR
Un processus pour la Métaprogrammation
Comment exprimer les Métadonnées ?

Définition des Métadonnées
Comment extraire,
récupérer les

Métadonnées associées au
programme courant ?

Sous quel forme (implicite vs explicite,
externe vs interne) ?

Processing des Métadonnées

Comment opérer des
transformations du

programme courant en

fonction des Métadonnées
trouvées ?

Interprétation des Métadonnées
Réflexivité et chargeurs de
classes
●

Processing des Métadonnées

Pour les conventions de nommage, les APIs de
réflexivité sont vos amies !
–
–

Classes groovy.lang.MetaClass et
groovy.lang.ExpandoMetaClass en Groovy

–

●

Packages java.lang.reflect en Java

Méthodes instance_variables(), instance_methods() et
respond_to ?() en Ruby

Pour les conventions de localisation, les chargeurs de classes
sont vos amis !
–

URLClassLoader sur les langages de la JVM

–

Directives require en Ruby ou Python
Annotations Java
●

Processing des Métadonnées

Au runtime
–

Depuis Java 5, il est possible de récupérer
programmatiquement les annotations d'un objet
Annotations Java
●

Processing des Métadonnées

Au build time
–

Depuis Java 6, il est possible de récupérer
programmatiquement les annotations d'un objet pendant
la compilation en créant un AnnotationProcessor.
●

Il est alors possible d'interagir avec les messages de
diagnostic du compilateur et enchaîner d'autres actions ...
Un processus pour la Métaprogrammation
Comment exprimer les Métadonnées ?

Définition des Métadonnées
Comment extraire,
récupérer les

Métadonnées associées au
programme courant ?

Sous quel forme (implicite vs explicite,
externe vs interne) ?

Processing des Métadonnées

Comment opérer des
transformations du

programme courant en

fonction des Métadonnées
trouvées ?

Interprétation des Métadonnées
Proxy dynamique Java
●

Interprétation des Métadonnées

Le principe :
–

Le proxy est un objet généré dynamiquement par la JVM afin
d'être vu comme implémentant 1 ou plusieurs interfaces,

–

Le proxy ne porte pas d'implémentation, il délègue le tout à un
InvocationHandler

–

L'InvocationHandler peut agir en tant que « décorateur » d'un
autre objet wrappé

Client

Proxy

Invocation
Handler

Vu comme un seul objet implémentant
une ou plusieurs interfaces

Cible
Proxy dynamique Java
●

Interprétation des Métadonnées

L'utilisation
–

On implémente l'interface java.lang.reflect.InvocationHandler

–

On appelle la méthode newProxyInstance() sur la classe
java.lang.reflect.Proxy en en fournissant les interfaces devant
être implémentées et l'invocation handler

–

C'est tout !
Proxy dynamique Java

Interprétation des Métadonnées

●

Une des fonctions les plus puissantes de la JVM !

●

Avec les proxies dynamiques, on peut implémenter :
–

Des politiques de sécurité pour l'accès aux objets,

–

La transparence des communications réseaux entre
objets,

–

Des applications utilisant multiples versions
incompatibles de la même librairie,

–

Toutes les transformations de comportement possibles et
imaginables pour un programme !
Transformations complètes
●

Interprétation des Métadonnées

Modification de la structure du code
–
–

Ajout / modification de comportements

–

●

Abstract Syntax Tree (AST) dans les langages dynamiques
Modification de hiérarchies de classes (voir gestion de
pseudo héritage multiple même en Java)

Modification directe du bytecode
–

Application du principe des proxies dynamiques aux
classes
●

Voir ASM, CGLib ou Javassist
Programmation Orientée Aspect

ou Aspect Oriented Programming
Programmation Orientée Aspect

« La Programmation Orientée Aspect est un paradigme
de développement qui vise à augmenter la modularité
en permettant de traiter de façon indépendante les
cross-cutting concerns (préoccupations secondaires ou
orthogonales) »
- Gregor Kiczales, 1990s
Cross-cutting concerns (i)
« Lorsque qu'un client valide un panier, il faut vérifier
que le contenu est disponible et sauvegarder la
commande en base. »
Expert métier
Ventes
Cross-cutting concerns (ii)
« Lorsque le panier est validé, il faut vérifier que l'on
dispose bien d'un client correctement identifié / loggé »

Expert Sécurité
Cross-cutting concerns (iii)
« A chaque validation de panier, je veux tracer l'appel
pour connaître : les performances, les erreurs
potentielles, ... »
Exploitant
Cross-cutting concerns (iv)
« Quand je valide un panier, il faut mettre à jour les
stocks »

Expert métier

Approvisionnement
Cross-cutting concerns (v)
« Les 2 systèmes Vente et Approvisionnement doivent
être cohérents »

Expert SI

Quelle proportion
de ce code dédiée
à la préoccupation
principale ?
Cross-cutting concerns (vi)
●

Quelles autres réponses purement objet ?
–

Traiter par hiérarchie de classes ?
●

●

TxCart < StockCart < TracableCart < SecuredCart < Cart ?

Réponses de l'AOP
–

Gérer chaque concern indépendamment et fusionner le tout
dans une étape d'assemblage !

Vente (Cart)
Sources

TX

Appro (Stock)
Securité
Traces

weaving
Application
AspectJ
●

●

Première implémentation Java des principes de l'AOP. Provient du centre
de recherche de Xerox. Version 1.0 en 2002.
AspectJ est une extension du langage Java gérée par la fondation Eclipse
(voir http://www.eclipse.org/aspectj)

●

AspectJ implémente le weaving en faisant de la réécriture de bytecode. 4
types de weaving :
–

Compile-time : le code source de l'application et celui du langage aspect sont
fusionnés avant d'être transformé en bytecode

–

Link-time : la fusion se passe après la production de bytecode pour le langage
primaire et le langage aspect

–

Load-time : la fusion de bytecode se passe lors du chargement par le
ClassLoader

–

Run-time : la JVM est responsable de la détection et l'exécution des aspects
AspectJ - exemple
●

HelloWorld AOP style !

TraceAspect.aj
AspectJ – concepts principaux
●

Join point
–

●

Pointcut
–

●

Du code extérieur à exécuter quand un join point est atteint dans le code de
l'application

Inter-type declaration
–

●

Une expression permettant d'identifier des join points au sein d'un
programme

Advice
–

●

Un « point » d'exécution prédictible d'une application

Un mécanisme permettant d'ajouter des attributs ou des méthodes à des
classes précédemment définies

Aspect
–

Une structure analogue à une classe qui encapsule join points, pointcuts,
advices et inter-type declaration.
AspectJ – Join points
●

Notion la plus importante du paradigme : un « point »
clairement défini dans l'exécution d'un composant.

1

A a = new A();

a

2

a.b

5

3
4

6
7

9

10
13

8

a.a();

11
12
AspectJ – Pointcuts (i)
●

Exemples

Designator

Description

execution

Matche l'exécution d'une méthode ou d'un constructeur

call

Matche l'appel d'une méthode ou d'un constructeur

initialization

Matche l'exécution du premier constructeur de la classe

handler

Matche les exceptions levées

get

Matche la référence à un attribut de classe

set

Matche l'assignation d'un attribut de classe

this

Retourne l'objet associé à un join point particulier ou restreint la
portée d'un join point en spécifiant un type de classe

target

Retourne l'objet cible d'un join point ou restreint la portée d'un join
point

args

Expose les arguments d'un join point ou restreint la portée d'un join
point en spécifiant des arguments

cflow

Retourne les join points dans le flux d'exécution d'un autre join
point

cflowbelow

Retourne les join points dans le flux d'exécution d'un autre join
point sans inclure le join point courant
AspectJ – Pointcuts (ii)
●

Quelques exemples ...

Expression

Commentaire

pointcut allStringMethods(String str) :
call(public * HelloWorld.*(..) &&
args(str))

Matche toutes les méthodes publics de HelloWorld
ayant 1 argument de type String. L'argument est
récupéré pour utilisation dans l'advice

pointcut construct() :
initialization(new(..))

Matche les constructeurs de tous les objets dans le
système !

pointcut constructRoleList() :
initialization(RoleList.new())

Matche le constructeur de la classe RoleList et de
tous ses ascendants (ArrayList, AbstractList, List)

pointcut userFirstname(User user) :
execution(public String getFirstname())
&& this(user)

Matche la méthode getFirstname() et rend
disponible l'objet courant de l'invocation disponible
pour l'advice

poincut handle(UserNotFoundException
e) : handler(UserNotFoundException) &&
args(e)

Matche le lancement d'une exception donnée par
n'importe quelle méthode. Rend accessible
l'exception pour l'advice.

pointcut getB() : call(* * B.getB());
pointcut a() : call(public void A.a());
pointcut getBInA() : getB() &&
cflow(a()) ;

Matche l'exécution de la méthode getB() seulement
lorsque appelée depuis la méthode a()
AspectJ – Advices (i)
●

Référence

Advice

Description

before

S'exécute avant le join point désigné.
A utiliser pour tout ce qui concerne l'insertion de pré-conditions ou garantir
l'initialisation d'objets (ouverture de connexion DB, etc ...)

after

S'exécute après le join point désigné.
A utiliser pour tout ce qui concerne les post-conditions, les opérations de
filtrages ou garantir la libération de ressources (fermeture connexion)

after returning

Même chose que after. Permet en plus de garantir que le join point visé
s'est exécuté avec succès.

after throwing

Même chose que after. Permet en plus de garantir que le join point visé s'est
achevé en lançant une exception.

around

Remplace l'exécution du join point désigné.
A utiliser lorsque l'on veut conditionner l'exécution d'un join point ou
complètement remplacer son exécution.
AspectJ – Advices (ii)
●

Eléments disponibles dans les advices
–

thisJoinPoint : attribut permettant d'accéder aux détails
du join point courant (déclaration et instance)

–

thisJoinPointStaticPart : attribut permettant d'accéder
aux détails de déclaration du join point courant

–

proceed() : méthode permettant de lancer l'exécution du join
point courant
AspectJ – Inter-type Declarations
●

Les ITDs permettent :
–

l'ajout d'attributs ou de méthode à une classe,

–

L'ajout de comportement via la modification de la hiérarchie
d'héritage ou d'implémentation.

Après compilation et weaving, la classe User implémente l'interface Comparable. Il est
donc possible d'invoquer la méthode compareTo() sur les instances de User.
AspectJ – Aspect
●

●

●

Un aspect est simplement la structure permettant de regrouper les
éléments vus précédemment et présentant une certaine cohérence
Dans AspectJ, on décrit un aspect : soit dans un fichier .aj, soit dans
une classe Java annotée avec @Aspect

Cycle de vie d'un Aspect
–

Par défaut, les aspects sont des singletons. On ne peut donc
pas leur faire porter d'état !

–

Il est possible de forcer la création d'un Aspect par objet en
utilisant la directive perthis(this(obj))

–

Il est possible de forcer la création d'un Aspect par flux en
utilisant la directive percflow(<pointcut>)
Quelques usages de l'AOP
●

●

●

●

●

Gestion de toute la « machinerie » technique : sécurité,
transactions, connexions réseaux et base de données,
serialization...
Gestion des préoccupations liées au diagnostique : log et traces,
mesures de performances, exception handling particulier, …
Gestion de toute la « machinerie » objet : getters et setters,
toString(), equals(), …
Déploiement de patch : nouveaux advices venant remplacer les
précédents !
Assemblage de métiers différents : vente et approvisionnement,
vente et connaissance client, ...
Points clés
●

Les primitives de méta-programming s'organisent selon 3 phases :
–
–

Processing de méta-données,

–

●

Définition de méta-données,
Interprétation de méta-données et transformation de programme.

Assemblons ces primitives et imaginons :
–

–

L'interception par un processeur lors de la compilation qui génère lui-même des
aspects,

–

●

L'usage d'annotations Java ou le respect de conventions de nommages en phase de
développement,

Aspects qui peuvent alors être fusionnés pour enrichir les composants produits ...

… tout en conservant un code initial clair, léger et orienté vers l'objectif métier du
composant !
Merci !

More Related Content

What's hot

Java 110605092007-phpapp02
Java 110605092007-phpapp02Java 110605092007-phpapp02
Java 110605092007-phpapp02Eric Bourdet
 
Design patterns french
Design patterns frenchDesign patterns french
Design patterns frenchmeriem sari
 
Présentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemePrésentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemeStéphane Traumat
 
Les Web Services en 60 diapos chrono !
Les Web Services en 60 diapos chrono !Les Web Services en 60 diapos chrono !
Les Web Services en 60 diapos chrono !Olivier Le Goaër
 
POO Java Introduction
POO Java IntroductionPOO Java Introduction
POO Java IntroductionMouna Torjmen
 
Telosys tools jug-nantes-2014-v1.2
Telosys tools jug-nantes-2014-v1.2Telosys tools jug-nantes-2014-v1.2
Telosys tools jug-nantes-2014-v1.2Laurent Guérin
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introductionneuros
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...ENSET, Université Hassan II Casablanca
 
Et pourquoi pas JEE ?
Et pourquoi pas JEE ?Et pourquoi pas JEE ?
Et pourquoi pas JEE ?PALO IT
 
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)cornnery
 

What's hot (20)

Cours design pattern m youssfi partie 7 facade bridge flyweight
Cours design pattern m youssfi partie 7 facade bridge flyweightCours design pattern m youssfi partie 7 facade bridge flyweight
Cours design pattern m youssfi partie 7 facade bridge flyweight
 
Support JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVCSupport JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVC
 
Java 110605092007-phpapp02
Java 110605092007-phpapp02Java 110605092007-phpapp02
Java 110605092007-phpapp02
 
Chap 02 poo en java
Chap 02 poo en javaChap 02 poo en java
Chap 02 poo en java
 
Design patterns french
Design patterns frenchDesign patterns french
Design patterns french
 
Présentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemePrésentation de JEE et de son écosysteme
Présentation de JEE et de son écosysteme
 
Tutoriel java
Tutoriel javaTutoriel java
Tutoriel java
 
Les Web Services en 60 diapos chrono !
Les Web Services en 60 diapos chrono !Les Web Services en 60 diapos chrono !
Les Web Services en 60 diapos chrono !
 
POO Java Introduction
POO Java IntroductionPOO Java Introduction
POO Java Introduction
 
Telosys tools jug-nantes-2014-v1.2
Telosys tools jug-nantes-2014-v1.2Telosys tools jug-nantes-2014-v1.2
Telosys tools jug-nantes-2014-v1.2
 
Cours de Génie Logiciel / ESIEA 2013-2014
Cours de Génie Logiciel / ESIEA 2013-2014 Cours de Génie Logiciel / ESIEA 2013-2014
Cours de Génie Logiciel / ESIEA 2013-2014
 
Cours design pattern m youssfi partie 5 adapter
Cours design pattern m youssfi partie 5 adapterCours design pattern m youssfi partie 5 adapter
Cours design pattern m youssfi partie 5 adapter
 
Cours spring
Cours springCours spring
Cours spring
 
Abstract factory+adapter
Abstract factory+adapterAbstract factory+adapter
Abstract factory+adapter
 
Design Pattern introduction
Design Pattern introductionDesign Pattern introduction
Design Pattern introduction
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
 
Et pourquoi pas JEE ?
Et pourquoi pas JEE ?Et pourquoi pas JEE ?
Et pourquoi pas JEE ?
 
Presentation JPA
Presentation JPAPresentation JPA
Presentation JPA
 
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
Plateforme De DéVeloppement En Php5 (Zend + Doctrine)
 
Design patterns
Design patternsDesign patterns
Design patterns
 

Viewers also liked

Viewers also liked (20)

Opac social y principios de planificación
Opac social y principios de planificaciónOpac social y principios de planificación
Opac social y principios de planificación
 
Undefecto en la mujer
Undefecto en la mujerUndefecto en la mujer
Undefecto en la mujer
 
Madrid
MadridMadrid
Madrid
 
El Platano
El PlatanoEl Platano
El Platano
 
Ch06
Ch06Ch06
Ch06
 
Monsanto
MonsantoMonsanto
Monsanto
 
Fidélité DIM Mael Noubissié Tatiana Civet
Fidélité DIM Mael Noubissié Tatiana CivetFidélité DIM Mael Noubissié Tatiana Civet
Fidélité DIM Mael Noubissié Tatiana Civet
 
Certificado CIADE
Certificado CIADECertificado CIADE
Certificado CIADE
 
Ch05
Ch05Ch05
Ch05
 
Impresionante bebe en el utero
Impresionante bebe en el uteroImpresionante bebe en el utero
Impresionante bebe en el utero
 
Asia misteriosa
Asia misteriosaAsia misteriosa
Asia misteriosa
 
Clôture de la journée webassoc par JM Sémoulin, 29 janvier 2015
Clôture de la journée webassoc par JM Sémoulin, 29 janvier 2015Clôture de la journée webassoc par JM Sémoulin, 29 janvier 2015
Clôture de la journée webassoc par JM Sémoulin, 29 janvier 2015
 
Rompecabezas mim
Rompecabezas mimRompecabezas mim
Rompecabezas mim
 
Conociendo Laponia
Conociendo LaponiaConociendo Laponia
Conociendo Laponia
 
Atelier pratique : CR CMS - Webassoc 14 avril 2015
Atelier pratique : CR CMS - Webassoc 14 avril 2015Atelier pratique : CR CMS - Webassoc 14 avril 2015
Atelier pratique : CR CMS - Webassoc 14 avril 2015
 
Diaporama 4 Strasbourg
Diaporama 4 StrasbourgDiaporama 4 Strasbourg
Diaporama 4 Strasbourg
 
Blue planet project
Blue planet projectBlue planet project
Blue planet project
 
Los archivos de Joaquín González Moreno (2ª parte)
Los archivos de Joaquín González Moreno (2ª parte)Los archivos de Joaquín González Moreno (2ª parte)
Los archivos de Joaquín González Moreno (2ª parte)
 
ALFIN 2.0
ALFIN 2.0ALFIN 2.0
ALFIN 2.0
 
Bibliotecas que lo hablan
Bibliotecas que lo hablanBibliotecas que lo hablan
Bibliotecas que lo hablan
 

Similar to Programmation orientee aspect 201401 - Ensim

DDD, CQRS et Event Sourcing : quand coder propre n'est plus suffisant
 DDD, CQRS et Event Sourcing : quand coder propre n'est plus suffisant DDD, CQRS et Event Sourcing : quand coder propre n'est plus suffisant
DDD, CQRS et Event Sourcing : quand coder propre n'est plus suffisantcluelessjoe
 
POO Licence L2 Partie I.pdf
POO Licence L2 Partie I.pdfPOO Licence L2 Partie I.pdf
POO Licence L2 Partie I.pdfLarbaSAWADOGO2
 
Domain-Specific Languages avec Groovy
Domain-Specific Languages avec GroovyDomain-Specific Languages avec Groovy
Domain-Specific Languages avec GroovyGuillaume Laforge
 
DesignPatternsISI.pdf
DesignPatternsISI.pdfDesignPatternsISI.pdf
DesignPatternsISI.pdfandre543581
 
Comment récupérer un projet Web pourri ... et réussir à travailler dessus.
Comment récupérer un projet Web pourri ... et réussir à travailler dessus.Comment récupérer un projet Web pourri ... et réussir à travailler dessus.
Comment récupérer un projet Web pourri ... et réussir à travailler dessus.Guillaume RICHARD
 
Patrons de conception de la programmation fonctionnelle
Patrons de conception de la programmation fonctionnellePatrons de conception de la programmation fonctionnelle
Patrons de conception de la programmation fonctionnelleAssociation Agile Nantes
 
Rex Software Factories 20140117 - Ensim
Rex Software Factories 20140117 - EnsimRex Software Factories 20140117 - Ensim
Rex Software Factories 20140117 - EnsimLaurent Broudoux
 
La persistance des données : ORM et hibernate
La persistance des données : ORM et hibernateLa persistance des données : ORM et hibernate
La persistance des données : ORM et hibernateYouness Boukouchi
 
Projet COM02.ppt
Projet COM02.pptProjet COM02.ppt
Projet COM02.pptPtidej Team
 
Automatisation des tests - objectifs et concepts - partie 2
Automatisation des tests  - objectifs et concepts - partie 2Automatisation des tests  - objectifs et concepts - partie 2
Automatisation des tests - objectifs et concepts - partie 2Christophe Rochefolle
 
Introduction of the most important design pattern
Introduction of the most important design patternIntroduction of the most important design pattern
Introduction of the most important design patternThierry Gayet
 

Similar to Programmation orientee aspect 201401 - Ensim (20)

DDD, CQRS et Event Sourcing : quand coder propre n'est plus suffisant
 DDD, CQRS et Event Sourcing : quand coder propre n'est plus suffisant DDD, CQRS et Event Sourcing : quand coder propre n'est plus suffisant
DDD, CQRS et Event Sourcing : quand coder propre n'est plus suffisant
 
Apprentissage du java
Apprentissage du javaApprentissage du java
Apprentissage du java
 
POO Licence L2 Partie I.pdf
POO Licence L2 Partie I.pdfPOO Licence L2 Partie I.pdf
POO Licence L2 Partie I.pdf
 
Domain-Specific Languages avec Groovy
Domain-Specific Languages avec GroovyDomain-Specific Languages avec Groovy
Domain-Specific Languages avec Groovy
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
DesignPatternsISI.pdf
DesignPatternsISI.pdfDesignPatternsISI.pdf
DesignPatternsISI.pdf
 
Tutoriel java
Tutoriel javaTutoriel java
Tutoriel java
 
Rapport Tal Master 1
Rapport Tal Master 1Rapport Tal Master 1
Rapport Tal Master 1
 
Lmo02.ppt
Lmo02.pptLmo02.ppt
Lmo02.ppt
 
Comment récupérer un projet Web pourri ... et réussir à travailler dessus.
Comment récupérer un projet Web pourri ... et réussir à travailler dessus.Comment récupérer un projet Web pourri ... et réussir à travailler dessus.
Comment récupérer un projet Web pourri ... et réussir à travailler dessus.
 
Patrons de conception de la programmation fonctionnelle
Patrons de conception de la programmation fonctionnellePatrons de conception de la programmation fonctionnelle
Patrons de conception de la programmation fonctionnelle
 
Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)
 
Rex Software Factories 20140117 - Ensim
Rex Software Factories 20140117 - EnsimRex Software Factories 20140117 - Ensim
Rex Software Factories 20140117 - Ensim
 
La persistance des données : ORM et hibernate
La persistance des données : ORM et hibernateLa persistance des données : ORM et hibernate
La persistance des données : ORM et hibernate
 
Projet+com02.ppt
Projet+com02.pptProjet+com02.ppt
Projet+com02.ppt
 
Chapter1
Chapter1Chapter1
Chapter1
 
Projet COM02.ppt
Projet COM02.pptProjet COM02.ppt
Projet COM02.ppt
 
Automatisation des tests - objectifs et concepts - partie 2
Automatisation des tests  - objectifs et concepts - partie 2Automatisation des tests  - objectifs et concepts - partie 2
Automatisation des tests - objectifs et concepts - partie 2
 
Introduction of the most important design pattern
Introduction of the most important design patternIntroduction of the most important design pattern
Introduction of the most important design pattern
 

More from Laurent Broudoux

OpenShift pour le developpement cloud native - 20171214
OpenShift pour le developpement cloud native - 20171214OpenShift pour le developpement cloud native - 20171214
OpenShift pour le developpement cloud native - 20171214Laurent Broudoux
 
Talk Red Hat Entreprise Numerique - Eip Designer - 20160323
Talk Red Hat Entreprise Numerique - Eip Designer - 20160323Talk Red Hat Entreprise Numerique - Eip Designer - 20160323
Talk Red Hat Entreprise Numerique - Eip Designer - 20160323Laurent Broudoux
 
Talk OpenGroup Quebec - Architecture d'Entreprise chez MMA - 20151207
Talk OpenGroup Quebec - Architecture d'Entreprise chez MMA - 20151207Talk OpenGroup Quebec - Architecture d'Entreprise chez MMA - 20151207
Talk OpenGroup Quebec - Architecture d'Entreprise chez MMA - 20151207Laurent Broudoux
 
Talk EclipseSirius Con - EIP Designer - 20151203
Talk EclipseSirius Con - EIP Designer - 20151203Talk EclipseSirius Con - EIP Designer - 20151203
Talk EclipseSirius Con - EIP Designer - 20151203Laurent Broudoux
 
Introduction EIP Designer 20151119 - Architecwave
Introduction EIP Designer 20151119 - ArchitecwaveIntroduction EIP Designer 20151119 - Architecwave
Introduction EIP Designer 20151119 - ArchitecwaveLaurent Broudoux
 
Usages et deploiement Eclipse MMA 201502 - Eclipse Demo Camp
Usages et deploiement Eclipse MMA 201502 - Eclipse Demo CampUsages et deploiement Eclipse MMA 201502 - Eclipse Demo Camp
Usages et deploiement Eclipse MMA 201502 - Eclipse Demo CampLaurent Broudoux
 
Introduction NoSql 201406 - lbroudoux
Introduction NoSql 201406 - lbroudouxIntroduction NoSql 201406 - lbroudoux
Introduction NoSql 201406 - lbroudouxLaurent Broudoux
 
Introduction NoSQL 201401 - Ensim
Introduction NoSQL 201401 - EnsimIntroduction NoSQL 201401 - Ensim
Introduction NoSQL 201401 - EnsimLaurent Broudoux
 

More from Laurent Broudoux (8)

OpenShift pour le developpement cloud native - 20171214
OpenShift pour le developpement cloud native - 20171214OpenShift pour le developpement cloud native - 20171214
OpenShift pour le developpement cloud native - 20171214
 
Talk Red Hat Entreprise Numerique - Eip Designer - 20160323
Talk Red Hat Entreprise Numerique - Eip Designer - 20160323Talk Red Hat Entreprise Numerique - Eip Designer - 20160323
Talk Red Hat Entreprise Numerique - Eip Designer - 20160323
 
Talk OpenGroup Quebec - Architecture d'Entreprise chez MMA - 20151207
Talk OpenGroup Quebec - Architecture d'Entreprise chez MMA - 20151207Talk OpenGroup Quebec - Architecture d'Entreprise chez MMA - 20151207
Talk OpenGroup Quebec - Architecture d'Entreprise chez MMA - 20151207
 
Talk EclipseSirius Con - EIP Designer - 20151203
Talk EclipseSirius Con - EIP Designer - 20151203Talk EclipseSirius Con - EIP Designer - 20151203
Talk EclipseSirius Con - EIP Designer - 20151203
 
Introduction EIP Designer 20151119 - Architecwave
Introduction EIP Designer 20151119 - ArchitecwaveIntroduction EIP Designer 20151119 - Architecwave
Introduction EIP Designer 20151119 - Architecwave
 
Usages et deploiement Eclipse MMA 201502 - Eclipse Demo Camp
Usages et deploiement Eclipse MMA 201502 - Eclipse Demo CampUsages et deploiement Eclipse MMA 201502 - Eclipse Demo Camp
Usages et deploiement Eclipse MMA 201502 - Eclipse Demo Camp
 
Introduction NoSql 201406 - lbroudoux
Introduction NoSql 201406 - lbroudouxIntroduction NoSql 201406 - lbroudoux
Introduction NoSql 201406 - lbroudoux
 
Introduction NoSQL 201401 - Ensim
Introduction NoSQL 201401 - EnsimIntroduction NoSQL 201401 - Ensim
Introduction NoSQL 201401 - Ensim
 

Programmation orientee aspect 201401 - Ensim

  • 2. Quelques mots... Laurent Broudoux Le jour ... Architecte IT Senior chez MMA Mots-clés : Java, SOA, Agile, Software factories La nuit … Coder, geek, open source comitter (voir http://github.com/lbroudoux) Me joindre / suivre @lbroudoux laurent.broudoux@gmail.com http://lbroudoux.wordpress.com
  • 3. Méta Programmation ? ? ?? ? ? ? ? ? Comprendre...
  • 4. Que sont les Métadonnées ? ● Des données à propos d'autres données ou des données décrivant d'autres données – Structurale (conjoint à la création de la donnée) ● ● Valeurs possibles ● Relations avec d'autres données ● – Type Objectifs Descriptives (après la création de la donnée) ● Conditions de création ● Contexte d'existence ● Etc ...
  • 5. Comment définir des Métadonnées ? ● De façon implicite – ● En suivant des conventions De façon explicite – A l'extérieur du code ● – Configuration : XML, YML, … A l'intérieur du code ● Commentaires – ● Javadoc (@author, @version, @since, ...) Code lui-même – – – Meta tags HTML (<meta name=''author'' content=''L. Broudoux''>) Annotations Java (@Override, @Deprecated, …) Domain Specific Language pour les langages dynamiques
  • 6. Méta Programmation ? ● Ecriture de programmes qui écrivent ou manipulent d'autres programmes ou eux-même en se basant sur des métadonnées. « It is about programming at the meta level, that is about changing your interpreter or changing how code is compile » - Ralph E. Johnson
  • 7. Bénéfices ● Lors de la conception – Modularité ● – ● Séparation des préoccupations Evolutivité Lors du développement – Gain de productivité, temps ● En évitant le code boiler plate – Minimisation du LOC – Simplicité
  • 8. Un process pour la Métaprogrammation Comment exprimer les Métadonnées ? Définition des Métadonnées Comment extraire, récupérer les Métadonnées associées au programme courant ? Sous quel forme (implicite vs explicite, externe vs interne) ? Processing des Métadonnées Comment opérer des transformations du programme courant en fonction des Métadonnées trouvées ? Interprétation des Métadonnées
  • 9. Un exemple d'application (i) ● Soit une méthode permettant de retrouver les utilisateurs ayant le même prénom … – Imaginons la intégrée dans une classe DAO
  • 10. Un exemple d'application (ii) ● On désire maintenant ajouter une méthode permettant de retrouver les utilisateurs ayant le même nom … – Imaginons la intégrée dans la même classe DAO Quelles différences ?
  • 11. Un exemple d'application (iii) ● ● En mettant en œuvre les principes de la Métaprogrammation, on peux imaginer ne plus avoir à écrire ces méthodes ! On décide d'une convention permettant de faire la correspondance … … on implémente la transformation nécessaire pour ajouter ces fonctions !
  • 13. Un processus pour la Métaprogrammation Comment exprimer les Métadonnées ? Définition des Métadonnées Comment extraire, récupérer les Métadonnées associées au programme courant ? Sous quel forme (implicite vs explicite, externe vs interne) ? Processing des Métadonnées Comment opérer des transformations du programme courant en fonction des Métadonnées trouvées ? Interprétation des Métadonnées
  • 14. Conventions ● ● ● Définition des Métadonnées La façon la plus simple est de définir des conventions : de nommage ou de localisation. Attention : le bon respect de ces conventions ne peut souvent pas être vérifié !! Exemples : – Nommage du test case de Foo : FooTest – Nommage des méthodes liées à la persistance d'objets : save(), update(), delete(), findAll(), findBy*(), … – Localisation des classes persistantes dans /grails-app/domain pour Grails On nomme cette approche « Convention Over Configuration »
  • 15. Paramétrage Externe ● ● Définition des Métadonnées On décrit dans un fichier annexe des propriétés, comportements ou contraintes supplémentaires d'éléments de l'application. Exemples : – ejb-jar.xml pour EJB – routes.rb pour RoR
  • 16. Annotations Java ● ● Définition des Métadonnées Depuis Java 5, le langage offre la possibilité de définir ses propres annotations Une annotation se définit dans un fichier .java avec le mot clé @interface Cible : une classe, une méthode, un champs Rétention : seulement dans le source, dans le bytecode mais non accessible, dans le bytecode et accessible Attributs : éléments de configuration des métadonnées portées par l'annotation.
  • 17. Annotations Java ● Définition des Métadonnées Une annotation s'applique en important simplement la classe correspondante et en utilisant le marqueur @<Mon annotation> avant l'élément visé (classe, méthode ou champs)
  • 18. Domain Specific Language ● ● Définition des Métadonnées Dans le cadre des langages dynamiques, on peut utiliser des DSL directement embarqués dans le code mais en dehors de la partie algorithmie. Exemples : – Contraintes dans Groovy/Grails – Règles de routage dans RoR
  • 19. Un processus pour la Métaprogrammation Comment exprimer les Métadonnées ? Définition des Métadonnées Comment extraire, récupérer les Métadonnées associées au programme courant ? Sous quel forme (implicite vs explicite, externe vs interne) ? Processing des Métadonnées Comment opérer des transformations du programme courant en fonction des Métadonnées trouvées ? Interprétation des Métadonnées
  • 20. Réflexivité et chargeurs de classes ● Processing des Métadonnées Pour les conventions de nommage, les APIs de réflexivité sont vos amies ! – – Classes groovy.lang.MetaClass et groovy.lang.ExpandoMetaClass en Groovy – ● Packages java.lang.reflect en Java Méthodes instance_variables(), instance_methods() et respond_to ?() en Ruby Pour les conventions de localisation, les chargeurs de classes sont vos amis ! – URLClassLoader sur les langages de la JVM – Directives require en Ruby ou Python
  • 21. Annotations Java ● Processing des Métadonnées Au runtime – Depuis Java 5, il est possible de récupérer programmatiquement les annotations d'un objet
  • 22. Annotations Java ● Processing des Métadonnées Au build time – Depuis Java 6, il est possible de récupérer programmatiquement les annotations d'un objet pendant la compilation en créant un AnnotationProcessor. ● Il est alors possible d'interagir avec les messages de diagnostic du compilateur et enchaîner d'autres actions ...
  • 23. Un processus pour la Métaprogrammation Comment exprimer les Métadonnées ? Définition des Métadonnées Comment extraire, récupérer les Métadonnées associées au programme courant ? Sous quel forme (implicite vs explicite, externe vs interne) ? Processing des Métadonnées Comment opérer des transformations du programme courant en fonction des Métadonnées trouvées ? Interprétation des Métadonnées
  • 24. Proxy dynamique Java ● Interprétation des Métadonnées Le principe : – Le proxy est un objet généré dynamiquement par la JVM afin d'être vu comme implémentant 1 ou plusieurs interfaces, – Le proxy ne porte pas d'implémentation, il délègue le tout à un InvocationHandler – L'InvocationHandler peut agir en tant que « décorateur » d'un autre objet wrappé Client Proxy Invocation Handler Vu comme un seul objet implémentant une ou plusieurs interfaces Cible
  • 25. Proxy dynamique Java ● Interprétation des Métadonnées L'utilisation – On implémente l'interface java.lang.reflect.InvocationHandler – On appelle la méthode newProxyInstance() sur la classe java.lang.reflect.Proxy en en fournissant les interfaces devant être implémentées et l'invocation handler – C'est tout !
  • 26. Proxy dynamique Java Interprétation des Métadonnées ● Une des fonctions les plus puissantes de la JVM ! ● Avec les proxies dynamiques, on peut implémenter : – Des politiques de sécurité pour l'accès aux objets, – La transparence des communications réseaux entre objets, – Des applications utilisant multiples versions incompatibles de la même librairie, – Toutes les transformations de comportement possibles et imaginables pour un programme !
  • 27. Transformations complètes ● Interprétation des Métadonnées Modification de la structure du code – – Ajout / modification de comportements – ● Abstract Syntax Tree (AST) dans les langages dynamiques Modification de hiérarchies de classes (voir gestion de pseudo héritage multiple même en Java) Modification directe du bytecode – Application du principe des proxies dynamiques aux classes ● Voir ASM, CGLib ou Javassist
  • 28. Programmation Orientée Aspect ou Aspect Oriented Programming
  • 29. Programmation Orientée Aspect « La Programmation Orientée Aspect est un paradigme de développement qui vise à augmenter la modularité en permettant de traiter de façon indépendante les cross-cutting concerns (préoccupations secondaires ou orthogonales) » - Gregor Kiczales, 1990s
  • 30. Cross-cutting concerns (i) « Lorsque qu'un client valide un panier, il faut vérifier que le contenu est disponible et sauvegarder la commande en base. » Expert métier Ventes
  • 31. Cross-cutting concerns (ii) « Lorsque le panier est validé, il faut vérifier que l'on dispose bien d'un client correctement identifié / loggé » Expert Sécurité
  • 32. Cross-cutting concerns (iii) « A chaque validation de panier, je veux tracer l'appel pour connaître : les performances, les erreurs potentielles, ... » Exploitant
  • 33. Cross-cutting concerns (iv) « Quand je valide un panier, il faut mettre à jour les stocks » Expert métier Approvisionnement
  • 34. Cross-cutting concerns (v) « Les 2 systèmes Vente et Approvisionnement doivent être cohérents » Expert SI Quelle proportion de ce code dédiée à la préoccupation principale ?
  • 35. Cross-cutting concerns (vi) ● Quelles autres réponses purement objet ? – Traiter par hiérarchie de classes ? ● ● TxCart < StockCart < TracableCart < SecuredCart < Cart ? Réponses de l'AOP – Gérer chaque concern indépendamment et fusionner le tout dans une étape d'assemblage ! Vente (Cart) Sources TX Appro (Stock) Securité Traces weaving Application
  • 36. AspectJ ● ● Première implémentation Java des principes de l'AOP. Provient du centre de recherche de Xerox. Version 1.0 en 2002. AspectJ est une extension du langage Java gérée par la fondation Eclipse (voir http://www.eclipse.org/aspectj) ● AspectJ implémente le weaving en faisant de la réécriture de bytecode. 4 types de weaving : – Compile-time : le code source de l'application et celui du langage aspect sont fusionnés avant d'être transformé en bytecode – Link-time : la fusion se passe après la production de bytecode pour le langage primaire et le langage aspect – Load-time : la fusion de bytecode se passe lors du chargement par le ClassLoader – Run-time : la JVM est responsable de la détection et l'exécution des aspects
  • 37. AspectJ - exemple ● HelloWorld AOP style ! TraceAspect.aj
  • 38. AspectJ – concepts principaux ● Join point – ● Pointcut – ● Du code extérieur à exécuter quand un join point est atteint dans le code de l'application Inter-type declaration – ● Une expression permettant d'identifier des join points au sein d'un programme Advice – ● Un « point » d'exécution prédictible d'une application Un mécanisme permettant d'ajouter des attributs ou des méthodes à des classes précédemment définies Aspect – Une structure analogue à une classe qui encapsule join points, pointcuts, advices et inter-type declaration.
  • 39. AspectJ – Join points ● Notion la plus importante du paradigme : un « point » clairement défini dans l'exécution d'un composant. 1 A a = new A(); a 2 a.b 5 3 4 6 7 9 10 13 8 a.a(); 11 12
  • 40. AspectJ – Pointcuts (i) ● Exemples Designator Description execution Matche l'exécution d'une méthode ou d'un constructeur call Matche l'appel d'une méthode ou d'un constructeur initialization Matche l'exécution du premier constructeur de la classe handler Matche les exceptions levées get Matche la référence à un attribut de classe set Matche l'assignation d'un attribut de classe this Retourne l'objet associé à un join point particulier ou restreint la portée d'un join point en spécifiant un type de classe target Retourne l'objet cible d'un join point ou restreint la portée d'un join point args Expose les arguments d'un join point ou restreint la portée d'un join point en spécifiant des arguments cflow Retourne les join points dans le flux d'exécution d'un autre join point cflowbelow Retourne les join points dans le flux d'exécution d'un autre join point sans inclure le join point courant
  • 41. AspectJ – Pointcuts (ii) ● Quelques exemples ... Expression Commentaire pointcut allStringMethods(String str) : call(public * HelloWorld.*(..) && args(str)) Matche toutes les méthodes publics de HelloWorld ayant 1 argument de type String. L'argument est récupéré pour utilisation dans l'advice pointcut construct() : initialization(new(..)) Matche les constructeurs de tous les objets dans le système ! pointcut constructRoleList() : initialization(RoleList.new()) Matche le constructeur de la classe RoleList et de tous ses ascendants (ArrayList, AbstractList, List) pointcut userFirstname(User user) : execution(public String getFirstname()) && this(user) Matche la méthode getFirstname() et rend disponible l'objet courant de l'invocation disponible pour l'advice poincut handle(UserNotFoundException e) : handler(UserNotFoundException) && args(e) Matche le lancement d'une exception donnée par n'importe quelle méthode. Rend accessible l'exception pour l'advice. pointcut getB() : call(* * B.getB()); pointcut a() : call(public void A.a()); pointcut getBInA() : getB() && cflow(a()) ; Matche l'exécution de la méthode getB() seulement lorsque appelée depuis la méthode a()
  • 42. AspectJ – Advices (i) ● Référence Advice Description before S'exécute avant le join point désigné. A utiliser pour tout ce qui concerne l'insertion de pré-conditions ou garantir l'initialisation d'objets (ouverture de connexion DB, etc ...) after S'exécute après le join point désigné. A utiliser pour tout ce qui concerne les post-conditions, les opérations de filtrages ou garantir la libération de ressources (fermeture connexion) after returning Même chose que after. Permet en plus de garantir que le join point visé s'est exécuté avec succès. after throwing Même chose que after. Permet en plus de garantir que le join point visé s'est achevé en lançant une exception. around Remplace l'exécution du join point désigné. A utiliser lorsque l'on veut conditionner l'exécution d'un join point ou complètement remplacer son exécution.
  • 43. AspectJ – Advices (ii) ● Eléments disponibles dans les advices – thisJoinPoint : attribut permettant d'accéder aux détails du join point courant (déclaration et instance) – thisJoinPointStaticPart : attribut permettant d'accéder aux détails de déclaration du join point courant – proceed() : méthode permettant de lancer l'exécution du join point courant
  • 44. AspectJ – Inter-type Declarations ● Les ITDs permettent : – l'ajout d'attributs ou de méthode à une classe, – L'ajout de comportement via la modification de la hiérarchie d'héritage ou d'implémentation. Après compilation et weaving, la classe User implémente l'interface Comparable. Il est donc possible d'invoquer la méthode compareTo() sur les instances de User.
  • 45. AspectJ – Aspect ● ● ● Un aspect est simplement la structure permettant de regrouper les éléments vus précédemment et présentant une certaine cohérence Dans AspectJ, on décrit un aspect : soit dans un fichier .aj, soit dans une classe Java annotée avec @Aspect Cycle de vie d'un Aspect – Par défaut, les aspects sont des singletons. On ne peut donc pas leur faire porter d'état ! – Il est possible de forcer la création d'un Aspect par objet en utilisant la directive perthis(this(obj)) – Il est possible de forcer la création d'un Aspect par flux en utilisant la directive percflow(<pointcut>)
  • 46. Quelques usages de l'AOP ● ● ● ● ● Gestion de toute la « machinerie » technique : sécurité, transactions, connexions réseaux et base de données, serialization... Gestion des préoccupations liées au diagnostique : log et traces, mesures de performances, exception handling particulier, … Gestion de toute la « machinerie » objet : getters et setters, toString(), equals(), … Déploiement de patch : nouveaux advices venant remplacer les précédents ! Assemblage de métiers différents : vente et approvisionnement, vente et connaissance client, ...
  • 47. Points clés ● Les primitives de méta-programming s'organisent selon 3 phases : – – Processing de méta-données, – ● Définition de méta-données, Interprétation de méta-données et transformation de programme. Assemblons ces primitives et imaginons : – – L'interception par un processeur lors de la compilation qui génère lui-même des aspects, – ● L'usage d'annotations Java ou le respect de conventions de nommages en phase de développement, Aspects qui peuvent alors être fusionnés pour enrichir les composants produits ... … tout en conservant un code initial clair, léger et orienté vers l'objectif métier du composant !