Vous êtes sur la page 1sur 82

1

Programmation par aspects


AspectJ
Daniel Hagimont
IRIT/ENSEEIHT
2 rue Charles Camichel - BP 7122
31071 TOULOUSE CEDEX 7
Daniel.Hagimont@enseeiht.fr
http://hagimont.perso.enseeiht.fr
Remerciements
Sara Bouchenak
2
Bonne modularit
Parsing XML dans org.apache.tomcat

lignes rouges montrent le code concern

tout est regroup dans un seul module (classe)


Parsing XML
3
Bonne modularit
Reconnaissance de pattern dURL dans org.apache.tomcat

lignes rouges montrent le code concern

tout est regroup dans deux modules (hritage)


Reconnaissance de pattern dURL
4
Problmes
Traage dans org.apache.tomcat

lignes rouges montrent le code concern

pas regroup dans un seul module

pas dans un petit nombre de modules


Traage non modulaire
5
Synthse
Traitements trs localiss
lecture de fichiers de config., parsing XML
Traitements rpartis sur peu de classes
traitement de requtes HTTP, expressions rgulires
Traitements se retrouvant dans quasiment tout le
code
traage, diagnostic, rendre compte des requtes traites et
des problmes
org.apache.tomcat
6
Inconvnients dun code
non modulaire
Code redondant

Mme fragment de code dans plusieurs classes


Code non clair

Structure non explicite

Image globale non claire


Code difficile modifier/maintenir

Trouver toutes les classes concernes

Etre sr deffectuer les modifications de faon cohrente

Trs peu daide des outils de programmation OO


7
Principe de lAOP
Sparer les concepts (traitements) entrelacs
Minimiser les dpendances entre eux
Chaque traitement doit avoir

un objectif clair

une structure bien dfinie, modulaire


+
Aspects

Traitements modulaires qui peuvent par la suite tre


entrelacs
Aspect-Oriented Programming
8
Plan
1. Introduction lAOP
2. Introduction AspectJ
3. Syntaxe AspectJ
4. Dveloppement logiciel avec AspectJ
5. Synthse et Rfrences
9
Dfinition de lAOP
AOP = Aspect-Oriented Programming
(programmation oriente aspect
ou programmation par aspects)
"La programmation par aspectsest une
technique permettant de factoriser certains
traitements dont la ralisation est a priori
disperse travers un systme, ft-il orient-
objet."
10
Aspects :
fonctionnels et orthogonaux

Un systme logiciel est constitu de :

Aspects fonctionnels
(core concerns). Modules logiciels qui mettent en
uvre la logique applicative du systme logiciel.

Aspects orthogonaux
(crosscutting concerns). Modules qui mettent en
uvre des fonctionnalits systme utilises par
plusieurs autres modules.
11
Mthodologie de lAOP :
Mise en uvre des aspects

Mise en uvre de chaque aspect


indpendamment des autres

Aspects fonctionnels : clients, comptes, oprations


bancaires, etc.

Aspects orthogonaux : persistance, authentification,


performances, etc.

Techniques de mise en uvre

Langages procduraux

Techniques orientes-objet, etc.


12
Mthodologie de lAOP :
Composition des aspects

Spcification des rgles de composition des


aspects

Rgles utilises pour la construction du systme


final

Processus de composition : intgration ou weaving

Exemple : avant chaque opration sur le systme


bancaire, le client doit tre authentifi.
aspect fonctionnel
aspect
orthogonal
rgle de composition
13
Ralisation de lAOP

AOP : une mthodologie de programmation

Ralisation de la mthodologie AOP :

Langage de mise en uvre des aspects (fonctionnels et


orthogonaux) : C, C++, Java, etc.

Langage de spcification des rgles de composition des


aspects : AspectC, AspectJ, etc.

Outil dintgration des aspects (weaving) : aspect weaver,


compilateur AOP (AspectC, AspectJ, etc.)
14
Ralisation de lAOP
dans Java
aspects
fonctionnels
aspects
fonctionnels
aspects
fonctionnels
aspects
fonctionnels
aspects
fonctionnels
aspects
orthogonaux
rgles de
composition
Compilateur
AOP
aspects
fonctionnels et
orthogonaux
composs
Java
Java
AspectJ
compilo AspectJ
Java
15
Plan
1. Introduction lAOP
2. Introduction AspectJ

Composition dans AspectJ

join point, pointcut, advice, introduction, declaration, aspect

Mthodologie de programmation

Exemples
3. Syntaxe AspectJ
4. Dveloppement logiciel avec AspectJ
5. Synthse et Rfrences
16
Composition dans
AspectJ

Composition statique

Modification de la structure statique du systme :


classes et interfaces

Ajout dattributs et mthodes

Dclaration de messages davertissement (warnings) ou


derreurs affichs lors de la compilation

Composition dynamique

Ajout dun nouveau comportement lexcution "normale" du


programme

Etendre ou remplacer une opration

Action effectue avant/aprs lexcution de certaines mthodes


ou de certains traitants dexceptions dans des classes
17
Elments de composition
dans AspectJ

AspectJ

une extension du langage Java

pour dfinir les rgles de composition statique et


dynamique

Elments de composition dans AspectJ

Join point

Pointcut

Advice

Introduction

Declaration (at compile-time)

Aspect
18
Join point

Dfinition

Un point identifi dans lexcution dun programme

Un appel de mthode ou laccs lattribut dun objet

Exemple

Join points de la classe Account incluent

lexcution de la mthode credit

laccs lattribut balance


public class Account {
float balance;
void credit(float amount) {
this.balance += amount;
}
}
19
Pointcut

Dfinition

Slection dun join point

Rcupration du contexte au niveau de ce join point

Exemple

Pointcut

slectionne le join point correspondant lappel de la mthode


credit de la classe Account

rcupre le contexte de cet appel : lobjet sur lequel la mthode


est appele, les paramtres de la mthode
execution (void Account.credit(float))
20
Advice

Dfinition

Code excut un pointcut

Excution avant, aprs ou en remplacement dun pointcut

Exemple

Advice

affichage dun message

avant lexcution de la mthode credit de la classe Account


before() : execution (void Account.credit(float)) {
System.out.println("About to perform credit operation");
}
21
Introduction

Dfinition

Introduction dune modification statique une classe ou


interface

Ajout dune mthode ou dun attribut une classe, extension de


la hirarchie des classes et interfaces

Exemple

Introduction

extension de la hirarchie

classe Account implmente linterface BankingAccount

ajout du nouvel attribut _minimalBalance la classe Account


declare parents : Account implements BankingEntity;
private float Account._minimalBalance;
22
Compile-time declaration

Dfinition

Instruction de composition statique

Ajout de messages davertissement ou derreurs affichs lors de


la compilation

Exemple

Declaration

dclaration dun message davertissement

affichage si appel de la mthode save de la classe Persistence


declare warning : call (void Persistence.save(Object)) :
"Deprecated method Persistence.save(),
Consider using Persistence.saveOptimized()";
23
Aspect

Dfinition

Module de code qui contient la spcification des rgles de


composition statiques et dynamiques utilises

Introductions + declarations + pointcuts + advices = aspect

Aspect dans AspectJ quivalent une classe dans Java

Exemple de fichier ExampleAspect.java


public aspect ExampleAspect {
declare parents : Account implements BankingEntity;
before() : execution (void Account.credit(float)) {
System.out.println("About to perform credit operation");
}
declare warning : call (void Persistence.save(Object)) :
"Deprecated method Persistence.save(),
Consider using Persistence.saveOptimized()";
}
24
Mthodologie de
programmation

Conception
1. Identifier les join points o il faut tendre/modifier un
comportement
2. Concevoir le nouveau comportement introduire ces points-l

Mise en uvre
1. Ecriture dun module aspect qui contient la mise en uvre de
cette conception
2. Ecriture, dans laspect, des pointcuts qui slectionnent les join
points dsirs
3. Ecriture dun advice associ chaque pointcut pour dfinir le
nouveau comportement introduire chacun de ces points
4. Ajout de rgles de composition statique (introductions,
declarations) si ncessaire
25
Exemple Hello (1/4)

Application
public class Communicator {
public static void print(String message) {
System.out.println(message);
}
public static void print(String person, String message) {
System.out.println(person + ", " + message);
}
}
public class Test {
public static void main(String[] args) {
Communicator.print("Want to learn AspectJ?");
Communicator.print("Tom", "how are you?");
}
}
26
Exemple Hello (2/4)

Compilation Java

Excution
javac Communicator.java Test.java
java Test
Want to learn AspectJ?
Tom, how are you?
27
Exemple Hello (3/4)

Aspect
public aspect HelloAspect {
pointcut printCall() : call (void Communicator.print(..));
before() : printCall() {
System.out.print("Hello! ");
}
}
O Dclaration daspect
O Dclaration de pointcut
O Dclaration dadvice
28
Exemple Hello (4/4)

Compilation AspectJ

Excution
ajc Communicator.java Test.java HelloAspect.java
java Test
Hello! Want to learn AspectJ?
Hello! Tom, how are you?
29
Exemple de traage (1/4)

Application originale
package banking;
public class Account {
float balance;
void credit(float amount) {

this.balance += amount;

}
void debit(float amount) {

this.balance -= amount;

}
}
30
Exemple de traage (2/4)

Application modifie " la main" pour traage


package banking;
public class Account {
float balance;
void credit(float amount) {
Logger.entering("banking.Account", "credit(float)");
this.balance += amount;
Logger.exiting("banking.Account", "credit(float)");
}
void debit(float amount) {
Logger.entering("banking.Account", "debit(float)");
this.balance -= amount;
Logger.exiting("banking.Account", "debit(float)");
}
}
31
Exemple de traage (3/4)

Autre solution : Aspect de traage automatique


public aspect AutoLogAspect {
pointcut methodExecution() : execution (* banking.Account.*(..));
before() : methodExecution() {
Signature sig = thisJoinPointStaticPart.getSignature();
String className = sig.getDeclaringType().getName();
String methodName = sig.getName();
Logger.entering(className, methodName);
}
after() : methodExecution() {
Signature sig = thisJoinPointStaticPart.getSignature();
String className = sig.getDeclaringType().getName();
String methodName = sig.getName();
Logger.exiting(className, methodName);
} }
32
Exemple de traage (4/4)
application
originale
module de
traage
aspect de
traage auto
Compilateur
AOP
application avec
traage
Java
Java
AspectJ compilo AspectJ
Java
Account
Logger
AutoLogAspect
Account + Logger
33
Plan
1. Introduction lAOP
2. Introduction AspectJ
3. Syntaxe AspectJ

Pointcut

Call vs. Execution

Pointcuts de flot de contrle, de structure lexicale

Advice

Passage de paramtres entre pointcut et advice


4. Dveloppement logiciel avec AspectJ
5. Synthse et Rfrences
34
signature
type de pointcut
nom de pointcut
mot-cl
mode daccs
Syntaxe dun pointcut
[mode_accs] pointcut nom_pointcut([args]) : definition_pointcut
Exemple
public pointcut printCall() : call ( void Communicator.print(..) )
Signature dun pointcut

Signature de type

Signature de mthodes/constructeurs

Signature dattribut
Pointcut
35
Pointcut :
Signature de type
Signature
Account Type (classe / interface) de nom Account
Types associs
*Account Type dont le nom se termine avec Account, tel que SavingsAccount,
CheckingAccount
java.*.Date Type Date dans tout sous-package direct du package java, tel que
java.util.Date, java.sql.Date
java..Date Tout type Date dans le package java ou un sous-package direct ou
indirect du package java
java.util.List+ Tout type hritant de linterface java.util.List (limplmentant)
36
Pointcut :
Signature de mthode
La mthode publique clear() de la classe Collection qui ne prend aucun
paramtre et retourne void
Mthodes associes
Toute mthode publique de la classe Account, dont le nom commence
par set, qui prend un paramtre unique de type quelconque et qui
retourne void
Toute mthode de la classe Account, ne prenant pas de paramtre, quels
que soient son type de retour et mode daccs
Toute mthode publique de la classe Account, qui prend des paramtres
de nombre et types quelconques et qui retourne void
Signature
public void
Collection.clear()
public void
Account.set*(*)
* Account.*()
public void
Account.*(..)
* *.*(..) throws
RemoteException
Toute mthode qui peut lever une exception de type RemoteException
37
Pointcut :
Signature de constructeur
Le constructeur public de la classe Account, ne prenant aucun paramtre
Constructeurs associs
Le constructeur public de la classe Account, qui prend un paramtre unique
de type int
Tout constructeur public de la classe Account, qui prend un nombre et un
type quelconques de paramtres
Tout constructeur public de la classe Account ou dune de ses sous-classes
Signature
public
Account.new()
public
Account.new(int)
public
Account.new(..)
public
Account+.new(..)
38
Pointcut :
Signature dattribut
Lattribut priv balance de la classe Account
Attributs associs
Tout attribut de la classe Account, quels que soient son nom, son type et
son mode daccs
Tout attribut public et statique du package banking ou dun de ses sous-
packages directs ou indirects
Tout attribut de nimporte quelle classe
Signature
private float
Account.balance
* Account.*
public static *
banking..*.*
* *.*
39
Oprateur unaire : !
Oprateurs binaire : && (et) || (ou)
Oprateurs de pointcuts
Tout attribut public et non final de nimporte quelle classe public !final *.*
Tout type autre que Vector !Vector
Type Vector ou Hashtable Vector || Hashtable
Tout type implmentant les deux interfaces, tel que java.util.ArrayList java.util.RandomAc
cess+ &&
java.util.List+
40
signature
type de pointcut
nom de pointcut
mot-cl
mode daccs
Exemple
public pointcut printCall() : call ( void Communicator.print(..) )
Type dun pointcut

Appel de mthode, constructeur

Excution de mthode, constructeur

Accs un attribut en lecture, criture, etc.


Type de pointcut
41
Types de pointcuts
Syntaxe Type de pointcut
call(signature_mthode) Appel de mthode
execution(signature_mthode) Excution de mthode
call(signature_constructeur) Appel de constructeur
execution(signature_constructeur) Excution de constructeur
Initialisation de classe staticinitialization(signature_type)
Accs un attribut en lecture get(signature_attribut)
Accs un attribut en criture set(signature_attribut)
Traitant dexception handler(signature_type)
42
Exemple
Call vs. Execution (1/5)
public class Account {
float balance;
void credit(float amount) {

this.balance += amount;
}
}
public class Test {
public static void main(String[] args) {
Account account = new Account();

accout.credit(100);
}
}
execution de la
mthode credit
call de la
mthode credit
43
Aspect utilisant le call
Call vs. Execution (2/5)
public aspect AutoLogAspect_Call {
pointcut creditMethodCall() : call (* Account.credit(..));

before() : creditMethodCall() {

Logger.entering(className, methodName);
}
}
44
Application de lAutoLogAspect_Call
Call vs. Execution (3/5)
public class Account {
float balance;
void credit(float amount) {

this.balance += amount;
}
}
public class Test {
public static void main(String[] args) {
Account account = new Account();
Logger.entering("Account", "credit(float)");
account.credit(100);
}
}
45
Aspect utilisant lexecution
Call vs. Execution (4/5)
public aspect AutoLogAspect_Execution {
pointcut creditMethodExecution() : execution (* Account.credit(..));

before() : creditMethodExecution() {

Logger.entering(className, methodName);
}
}
46
Application de lAutoLogAspect_Execution
Call vs. Execution (5/5)
public class Account {
float balance;
void credit(float amount) {
Logger.entering("Account", "credit(float)");
this.balance += amount;
}
}
public class Test {
public static void main(String[] args) {
Account account = new Account();

accout.credit(100);
}
}
47
Pointcuts relatifs au
flot de contrle
Tout join point dans le flot de contrle dune mthode credit de la classe
Account, y compris lappel la mthode credit elle-mme
Description
Tout join point dans le flot de contrle dune mthode credit de la classe
Account, sauf lappel la mthode credit elle-mme
Tout join point dans le flot de contrle du pointcut creditMethodCall
Tout join point dans le flot de contrle dun constructeur de la classe
Account, sauf lexcution du constructeur lui-mme
Pointcut
cflow(call
(* Account.credit(..)))
cflowbelow(call
(* Account.credit(..)))
cflow(
creditMethodCall())
cflowbelow(execution
(* Account.new(..)))
48
Exemple
cflow / cflowbelow :
mais encore
public class Test {
public static void main(String[] args) {
Account account = new Account();

account.credit(100);
}
}
49
cflow / cflowbelow :
mais encore
public class Account {
int id; // account id
Database database; // associated database
float getBalance() {
return database.query("SELECT balance FROM accounts WHERE id=" + id);
}
void setBalance(float b) {
database.update("UPDATE accounts SET balance="+b+" WHERE id=" + id);
}
void credit(float amount) {

setBalance(getBalance() + amount);
}
}
50
cflow / cflowbelow :
mais encore
public class Database {
float query(String sqlQuery) {
lecture de la base de donnes
}
void update(String sqlQuery) {
criture dans la base de donnes
}
}
51
Flot de contrle lappel de la mthode credit
cflow / cflowbelow :
mais encore
Test.main
Account.credit
new
Account
Account.getBalance Account.setBalance
Database.query
Database.update
52
Aspect utilisant le cflow
cflow :
mais encore
public aspect AutoLogAspect_CallF {
pointcut creditMethodCallF() : cflow( call (* Account.credit(..)) );

before() : creditMethodCallF() {
System.out.println("Hello!");
}
}
53
cflow( call(* Account.credit(..)) )
cflow :
mais encore
Test.main
Account.credit
new
Account
Account.getBalance Account.setBalance
Database.query Database.update
54
Exemple
cflow :
mais encore
public class Test {
public static void main(String[] args) {
Account account = new Account();
System.out.println("Hello!");
account.credit(100);
}
}
55
cflow :
mais encore
public class Account {
int id; // account id
Database database; // associated database
float getBalance() {
System.out.println("Hello!");
return database.query("SELECT balance FROM accounts WHERE id=" + id);
}
void setBalance(float b) {
System.out.println("Hello!");
database.update("UPDATE accounts SET balance="+b+" WHERE id=" + id);
}
void credit(float amount) {
System.out.println("Hello!");
setBalance(getBalance() + amount);
}
}
56
cflow :
mais encore
public class Database {
float query(String sqlQuery) {
System.out.println("Hello!");
lecture de la base de donnes
}
void update(String sqlQuery) {
System.out.println("Hello!");
criture dans la base de donnes
}
}
57
Aspect utilisant le cflowbelow
cflowbelow :
mais encore
public aspect AutoLogAspect_CallFB {
pointcut creditMethodCallFB() : cflowbelow( call (* Account.credit(..)) );

before() : creditMethodCallFB() {
System.out.println("Hello!");
}
}
58
cflowbelow( call(* Account.credit(..)) )
cflowbelow :
mais encore
Test.main
Account.credit
new
Account
Account.getBalance Account.setBalance
Database.query
Database.update
59
Exemple
cflowbelow :
mais encore
public class Test {
public static void main(String[] args) {
Account account = new Account();
System.out.println("Hello!");
accout.credit(100);
}
}
60
Pointcuts relatifs
la structure lexicale
Tout join point dans la classe Account (compris dans la porte lexicale
de la classe Account)
Description
Tout join point dans la classe Account et ses sous-classes (compris dans
la porte lexicale de ces classes)
Tout join point dans toute mthode credit de classe Account (compris
dans la porte lexicale de cette mthode)
Pointcut
within(Account)
within(Account+)
withincode(*
Account.credit(..))
61
Aspect utilisant lexecution
Exemple avec within
public aspect AutoLogAspect_Execution {
pointcut methodExecution() : execution (* *.Account.*(..))
&& within(banking..*);

before() : methodExecution() {

Logger.entering(className, methodName);
}
}
62
this(Type) ou this(ObjectIdentifier)
target(Type) ou target(ObjectIdentifier)
Pointcuts relatifs
lobjet dexcution
Description Pointcut
Tout join point o le this est une instance de la classe Account ou dune
de ses sous-classes (appel de mthode ou accs lattribut dun objet
Account). Pointcut utilis en combinaison avec execution
this(Account)
Tout join point o lobjet sur lequel une mthode est appele est une
instance de la classe Account ou dune de ses sous-classes. Pointcut
utilis en combinaison avec call
target(Account)
Rcupration dans
une variable
63
args(Type ou ObjectIdentifier,..)
Pointcuts arguments
Description Pointcut
Tous les join points de toutes les mthodes o le premier paramtre est
de type String et le dernier de type int
args(String,..,int)
64
nom de pointcut
specification dadvice
Advice :
Traitement effectuer lors dun pointcut
Syntaxe dun advice
specification_advice([args]) : nom_pointcut([args}) {
corps de ladvice
}
Exemple
before () : printCall () {
corps de ladvice
}
Advice
65
type de pointcut
specification dadvice
signature
Syntaxe dun advice
specification_advice([args]) : definition_pointcut {
corps de ladvice
}
Exemple
before () : call ( void Communicator.print(..) ) {
corps de ladvice
}
Advice : Syntaxe
66
Advice before

sexcute avant le join point


Advice after

sexcute aprs le join point


Advice around

englobe lexcution du join point


Types dadvices
67
Exemple
before () : call ( * Account.*(..)) {
authentifier lutilisateur
}
Cas particulier
Si ladvice before lve une exception, la mthode
concerne nest alors pas excute
Exemples dutilisation
Traage, authentification, etc.
Advice before
68
Toute terminaison (normale ou exception)
after () : call ( * Account.*(..)) {
tracer toute terminaison
}
Terminaison normale
after returning () : call ( * Account.*(..)) {
tracer la terminaison normale
}
Terminaison en cas de leve dexception
after throwing () : call ( * Account.*(..)) {
tracer la leve dexception
}
Advice after
69
Remplacer un traitement
around () : call ( void Account.credit(float)) {
nouvelle mise en uvre de la mthode
}
Entourer un traitement
around (Account account, float amount) :
call ( * Account.credit(float)) && target(account) && args(amount) {
tracer le dbut de la mthode
proceed(account, amount);
tracer la fin de la mthode
}
Advice around
70
Passage de contexte entre
le join point et ladvice (1/3)
Passage de paramtres
before (Account account , float amount ) :

call ( * Account.credit(float)) && target( account ) && args( amount ) {
System.out.println("Crediting from " + account + " value " + amount );
}
71
Passage de contexte entre le
join point et ladvice (2/3)
Rcupration du rsultat
after returning (Object object ) :

call ( Object Account.*(..)) {
System.out.println("Result " + object );
}
72
Passage de contexte entre le
join point et ladvice (3/3)
Rcupration de lexception
after throwing (RemoteException except ) :

call ( * Account.*(..) throws RemoteException ) {
System.out.println("Exception " + except );
}
73
Instanciation des aspects
Un seul objet aspect, cre au chargement de la classe.
Accessible par aspectOf()
Description
Un objet aspect cr pour chaque objet qui est l'objet courant
(this) d'un joint point captur par Pointcut
Idem pour target
Un objet aspect cr pour chaque flot de contrle des joint
points capturs par Pointcut
idem pour cflowbelow
Pointcut
aspect Id issingleton {...}
aspect Id perthis(Pointcut) {...}
aspect Id pertarget(Pointcut) {...}
aspect Id percflow(Pointcut) {...}
aspect Id percflowbelow(Pointcut) {...}
74
Instanciation des aspects

Application
public class Communicator {
public void print(String message) {
System.out.println(message);
}
public void print(String person, String message) {
System.out.println(person + ", " + message);
}
}
public class Test {
public static void main(String[] args) {
Communicator c1 = new Communicator();
Communicator c2 = new Communicator();
c1.print("Want to learn AspectJ?");
c2.print("Tom","how are you?");
}
}
75
Instanciation des aspects

Aspect
public aspect PerAspect {
//public aspect PerAspect perthis(printCall()) {
int count=0;
private pointcut printCall() :
execution(void Communicator.print(..));
before() : printCall() {
count++;
System.out.print("Hello ["+count+"]!");
}
}
76
Instanciation des aspects
public aspect PerAspect
perthis(printCall())
Hello [1] ! Want to learn AspectJ?
Hello [1] ! Tom, how are you?
public aspect PerAspect
Hello [1] ! Want to learn AspectJ?
Hello [2] ! Tom, how are you?
77
Plan
1. Introduction lAOP
2. Introduction AspectJ
3. Syntaxe AspectJ
4. Dveloppement logiciel avec AspectJ
5. Synthse et Rfrences
78
Compilateur AspectJ
Commande ajc

fichiers sources
Java et aspects
(.java)

fichiers archives
Java et aspects
(.jar)
systme compos
(.class ou .jar)
Compilateur
AspectJ
(ajc)
79
Browser AspectJ
(ajbrowser)
80
Synthse :
AOP en 2 phrases
Intrt de lAOP

Extension dun systme existant pour prise en compte


de nouvelles proprits (aspects) orthogonaux

Conception modulaire dun systme impliquant


plusieurs aspect (fonctionnels et orthogonaux)
81
Rfrences Web
Outils, articles et autres ressources relatives la programmation
par aspect :
http://aosd.net
AspectJ de Xerox, un logiciel libre de lAOP pour Java :
http://aspectj.org
Techniques AOP utilises dans dautres langages que Java. Voir
AspectC++, une extension de C++ pour lAOP :
http://www.aspectc.org/
Techniques AOP utilises dans les langages procduraux. Voir
AspectC, une extension de C pour lAOP :
http://www.cs.ubc.ca/labs/spl/projects/aspectc.html
82
Rfrences
bibliographiques
Aspect-Oriented Programming, Kiczales et. al., ECOOP1997
An Overview of AspectJ, Kiczales et. al., ECOOP2001
Getting Started with AspectJ, Kiczales et. al., CACM 44(10), Oct.
2001
Aspect-Oriented Programming with AspectJ, Ivan Kiselev,
SAMS 2002
Mastering AspectJ: Aspect-Oriented Programming in Java,
Joseph D. Gradecki, Nicholas Lesiecki, John Wiley & Sons 2003
AspectJ in Action, R. Laddad, Manning, 2003.