initiation à l’aop
DESCRIPTION
Présentée par Félix-Antoine Bourbonnais aux étudiants d'informatique et de génie logiciel de l'Université Laval dans le cadre d'un cours d'architecture logicielle.TRANSCRIPT
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Initiation à l’AOP
Architecture logicielle Université Laval
Automne 2012
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Félix-Antoine Bourbonnais Ing. jr, PSM-I
Formateur & Coach Agile
o Tests automatisés: TDD/ATDD, BDD, …
o Orientation objet avancée
o Architecture agile
o Réusinage et qualité (Clean Code)
o Agile Scrum
Concepteur de logiciels
o Pratiques de développement
o Java, Python, etc.
2
@fbourbonnais
linkedin.com/in/fbourbonnais
elapsetech.com/fab
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Réchauffement…
Qui fait ou a fait de l’AOP dans un
projet?
Qui a eu une mauvaise expérience
avec l’AOP?
Image: Nutdanai Apikhomboonwaroot / FreeDigitalPhotos.net 3
© 2
01
2 E
lapse
Te
chn
olo
gie
s NOTIONS PRÉALABLES
Quelques…
4
© 2
01
2 E
lapse
Te
chn
olo
gie
s
SRP
5 SOLID Motivational Posters, by Derick Bailey http://lostechies.com/derickbailey/2009/02/11/solid-development-principles-in-motivational-pictures/
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Gestion des dépendances
6
Objectif: minimiser l’impacts des modifications
Et si on change « Display »?
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Problèmes OO
7
Est-ce que beaucoup de classes risquent d’utiliser Display?
Toutes les fonctionnalités sont utilisées par les figures?
Est-ce que Display risque de changer?
Dans quel sens devrait être la dépendance?
Abstraction?
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Solution OO
8
SRP?
Il faut toujours appeler notify()
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Solution AO
9
© 2
01
2 E
lapse
Te
chn
olo
gie
s PRÉOCCUPATIONS TRANSVERSES
Les
10
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Préoccupations transverses
11
Certaines préoccupations secondaires sont impossibles à regrouper et contaminent
plusieurs classes.
Angl.: Crosscutting concerns.
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Préoccupations transverses
Éparpillement
Enchevêtrement
12
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Préoccupations transverses
13
Éparpillement (dispersion)
Sécurité
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Préoccupations transverses
14
Enchevêtrement (cohésion)
Persistance
Fonctionnalité principale
Sécurité
Observation
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Ench
evêtremen
t (1)
15
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Ench
evêtremen
t (2)
16
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Ench
evêtremen
t (3)
17
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Ench
evêtremen
t (4)
18
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Ench
evêtremen
t (p
rincip
ale)
19
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Ench
evêtremen
t (récap
itulatif)
20
© 2
01
2 E
lapse
Te
chn
olo
gie
s L’AOP
Introduction à
21
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Orientation objet et préoccupations
22
Théoriquement, chaque classe devrait représenter une seule préoccupation.
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Orientation aspect
23
Aspect 1 Classe 1
Aspect 2
Aspect 3
Classe 2
C
C
A
A
A
© 2
01
2 E
lapse
Te
chn
olo
gie
s
AOP
24
L’AOP est un paradigme
© 2
01
2 E
lapse
Te
chn
olo
gie
s LA TERMINOLOGIE ET DU
FONCTIONNEMENT
Aperçu rapide de…
25
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Un aspect
Un module encapsulant une préoccupation
Peu gérer les préoccupations transverses
Généralement une classe « évoluée »
o Capacités supplémentaires afin de permettre l’encapsulation de préoccupations transverses
26
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Contenu typique d’un aspect
Code à exécuter
Indication des cibles
Aspect
27
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Aspect en AspectJ
28
public aspect VisitorAspect {
/∗ −−−−−−−− Pointcuts −−−−−−−− ∗/
protected pointcut startMethod() :
execution( ∗ start∗(..) );
/∗ −−−−−−−− Advices −−−−−−−− ∗/
after() : startMethod() {
printHello();
}
}
© 2
01
2 E
lapse
Te
chn
olo
gie
s
MAUVAISES PRATIQUES Quelques
Image: Ambro/ FreeDigitalPhotos.net 29
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Trop, c’est comme pas assez…
Quand 50% du code est composé d’aspects…
Est-ce 50% du code est composé de préoccupations transverses?
Image: farconville / FreeDigitalPhotos.net 30
© 2
01
2 E
lapse
Te
chn
olo
gie
s
L’AOP n’est pas un pansement
Suis-je en train d’utiliser l’AOP pour corriger un problème de design?
Ne vous servez pas de l’AOP comme parfum afin de masquer les mauvaises odeurs…
Image: digitalart / FreeDigitalPhotos.net 31
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Le « trip techno »
32
L’AOP c’est trop COOL !!
La chute pourrait être douloureuse!
• « AspectJ... WOW trop cool ! » • « On peut bidouiller plein de trucs avec ça ! » • « Tsé le truc qu’on arrivait pas à faire... on va faire un aspect qui va
changer ça puis qui va décider si… »
© 2
01
2 E
lapse
Te
chn
olo
gie
s
BONNES PRATIQUES Quelques
Image: photostock / FreeDigitalPhotos.net 33
© 2
01
2 E
lapse
Te
chn
olo
gie
s
OO encore d’actualité
34
Ce qui était vrai en OO l’est encore en AO
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Utiliser l’aspect comme « lien »
Déléguer à une classe qui contient la logique liée à cette préoccupation
Utiliser l’aspect pour tisser la logique
Note: Peut varier en fonction du tisseur (ex.: AspectJ)
35
pointcut inXorY() :
execution(* *(..))
&& within(X || Y);
after() : inXorY {
persistance.clearCache();
}
X (classe cible)
Y (classe cible)
Asp
ect
Persistance (classe à tisser)
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Dépendances et couplage
N’oubliez pas que l’aspect est couplé à toutes les classes où il s’injecte*. * Où un point de coupure apparie
Image: Salvatore Vuono / FreeDigitalPhotos.net 36
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Précision du point de coupure
Un PC précis est plus à risque d’être impacté par un changement
Un PC très générique risque d’apparier trop de PJ
On appelle cela le « Fragile Pointcut Problem » [1]
[1] C. Koppen et M. Störzer. PCDiff : attacking the fragile pointcut problem.
In European Interactive Workshop on Aspects in Software (EIWAS), 2004. 37
pointcut pcPrecis() : execution(void C.doX());
pointcut pcGenerique() : execution(* C.doX*(..));
pointcut pcPourEtreCertainAvoirProbleme : execution(* *(..));
- Si C.doX() est renommé pour C.doXInContext() …
- Si on ajoute C.doXPasRapportAvecAspect() …
© 2
01
2 E
lapse
Te
chn
olo
gie
s INTRODUIRE DE L’AOP DANS VOTRE
PROJET
Comment
38
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Choisir sa technologie
Image: Sura Nualpradid / FreeDigitalPhotos.net 39
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Considérer la complexité ajoutée
Gains
Complexité
40
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Considérer l’intégration
Avec d’autres cadres applicatifs (framework)
Le système de déploiement
L’intégrateur continu
Les technologie de tests
Etc.
Image: manostphoto / FreeDigitalPhotos.net 41
© 2
01
2 E
lapse
Te
chn
olo
gie
s
S’assurer de maîtriser les concepts
Image: renjith krishnan / FreeDigitalPhotos.net 42
Rappelez-vous que vous introduisez un nouveau paradigme et non pas simplement une
technologie « cool »!
Prototyper
Essayer sur un petit projet
Bien se documenter
Bien former son équipe
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Se discipliner
Résistez au « canon pour tuer une mouche »
L’AO tourne généralement mal entre les mains de cowboys
Balancez toujours la complexité versus le gain
Tester!
Image: photostock / FreeDigitalPhotos.net 43
© 2
01
2 E
lapse
Te
chn
olo
gie
s TECHNOLOGIE
Choisir sa
44
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Quelques cadres pour Java
AspectJ
Spring-AOP
Guice-AOP
…
45
© 2
01
2 E
lapse
Te
chn
olo
gie
s
AspectJ
Le plus complet
o Plusieurs primitives
o Plusieurs PJ possibles
Extension à Java
o Requiert un compilateur d’Aspects
o Ou de remplacer le chargement des classes (CL ou Java Agent)
46
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Spring supporte deux tisseurs
Spring
Spring AJ
Spring AOP
47
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Sprint-AOP
Java 100% pur
o Ne requiert pas de compilateur spécial
o Ne requiert pas de Java Agent
o Utilise des « Proxies » dynamiques
Limitations
o Tissage possible uniquement dans des Beans Spring
o Peu de primitives et limitées (ex.: exécution de méthodes)
o Ne peut intercepter des appels à « this »
48
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Spring-Aj
Spring peut se servir d’aspects de Spring pour élargir ses fonctionnalités
Spring se sert d’AspectJ pour lui-même
@Configurable permet d’injecter des dépendances dans des objets qui ne sont pas des Beans
49
Souvent une mauvaise odeur concernant le design…
Spring
FW++ AspectJ
Spring AJ
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Syntaxe ou tisseur?
Tissage
Spring-AOP (proxy)
AspectJ
Spring-AJ
Syntaxe (langage)
XML
@AspectJ
Langage AJ (.aj)
50
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Google Guice
Limitations similaires à Spring-AOP (par « proxies »)
Syntaxe propre
o Java
o Pas de syntaxe cachée dans les chaînes de caractères des annotations (comme @AspectJ)
51
© 2
01
2 E
lapse
Te
chn
olo
gie
s MODE DE TISSAGE
Choisir son
52
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Deux grandes approches de tissage
À la compilation (CTW)
À l’exécution (LTW)
53
© 2
01
2 E
lapse
Te
chn
olo
gie
s
CTW (Compile-Time Weaving)
Tissage à la compilation
Remplace généralement le compilateur de Java
Peut tisser uniquement dans le code compilé (pas dans une lib. externe)
Produit du Bytecode standard tissé
54
© 2
01
2 E
lapse
Te
chn
olo
gie
s
LTW (Load-Time Weaving)
Tissage lors du chargement de la classe
Remplace (assiste) le chargeur de classes de Java (ClassLoader)
Requiert généralement le démarrage de la JVM avec un JavaAgent
Peut être problématique avec des JEE Container ou entrer en conflit avec d’autres instrumentations
55
© 2
01
2 E
lapse
Te
chn
olo
gie
s L’INTÉGRATION
Considérer
56
© 2
01
2 E
lapse
Te
chn
olo
gie
s
AJDT
Plugin Eclipse pour AspectJ
Désagrément subtile:
o Force le CTW sur le projet dans Eclipse quand la nature « AspectJ » est activée
Offre de l’assistance
o Complétion (limitée)
o Réusinage (limité)
o Coloration syntaxique et validateur
57
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Maven
Plugin pour AspectJ
Si combiné avec AJDT
o Compile avec AJC versus JDT-AJ pour Eclipse
o Toujours faire « mvn clean » pour éviter les problèmes
Pour du LTW utilisez le Exec Maven Plugin (ou autre) et passez le JavaAgent
58
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Spring + AJ
Utiliser le Java Agent de Spring plutôt que celui par défaut d’AspectJ
Attention à la combinaison Spring-AOP (proxy) et AJDT
59
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Autres considérations
Maven
o Il est possible que les métriques soient comptées en double en CTW.
o Ex.: couverture des tests
JEE Container et Spring
o Des chargeurs de classes spécifiques sont disponibles pour plusieurs JEE Container.
o Sinon, il faut se rabattre sur u Java Agent de la JVM
60
© 2
01
2 E
lapse
Te
chn
olo
gie
s
QUESTIONS Période de
61
© 2
01
2 E
lapse
Te
chn
olo
gie
s
ELAPSE TECHNOLOGIES Formation conçue par
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Nos services
Formations
o Formations publiques
o Formations privées sur mesure en entreprise
Accompagnement d’entreprises
o Mentorat et coaching
o Diagnostique
Service-conseil
o Agent de changement
o Expertise et conseils de pointe
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Notre expertise
Processus Agile
o Scrum, Kanban, …
o eXtreme Programming
Pratiques de développement
o Tests automatisés (TDD, ATDD, BDD, ...)
o Architecture Agile
o Réusinage (refactoring)
o Qualité (code propre, intégration continue, …)
© 2
01
2 E
lapse
Te
chn
olo
gie
s
Blogue
Image: renjith krishnan / FreeDigitalPhotos.net
Suivez nos professionnels sur developpementagile.com