aop en .net
DESCRIPTION
La Programmation Orientée Aspect en .NET.TRANSCRIPT
AOP en .NET
Romain Verdier http://codingly.comALT.NET Paris - Juin
Qui a déjà entendu parler de l’AOP ?
Romain Verdier http://codingly.comALT.NET Paris - Juin
Qui a déjà au moins joué un peu avec l’AOP ?
Romain Verdier http://codingly.comALT.NET Paris - Juin
Qui a déjà utilisé l’AOP dans des projets ?
Romain Verdier http://codingly.comALT.NET Paris - Juin
Qui a une idée vague de ce que sont les principes et les mécanismes de l’AOP ?
Romain Verdier http://codingly.comALT.NET Paris - Juin
Qui veut prendre ma place ?
Romain Verdier http://codingly.comALT.NET Paris - Juin
Romain Verdierhttp://codingly.comhttp://twitter.com/romainverdier
Romain Verdier http://codingly.comALT.NET Paris - Juin
Consultant FastConnecthttp://fastconnect.frhttp://blog.fastconnect.fr
1. Le problèmeOu pourquoi nous aurions besoin de l’AOP
2. L’AOP, mais qu’est-ce ?Introduction : le principe de l’AOP
3. C’est magique ou quoi ?Démystification de l’AOP, les techniques, les méthodes
4. Et donc, en .NET ?Les outils qui existent et qui sont utilisés
5. Bullshit ! Un exemple, peut-être ?
Romain Verdier http://codingly.comALT.NET Paris - Juin
1. Le problème
Romain Verdier http://codingly.comALT.NET Paris - Juin
Machine-level codeStructural programming
Procedural programmingModular programming
Object Oriented Programming
Romain Verdier http://codingly.comALT.NET Paris - Juin
L’OOP permet aujourd’hui d’atteindre un bon niveau d’abstraction, et
autorise une modularité assez fine.
Romain Verdier http://codingly.comALT.NET Paris - Juin
Romain Verdier http://codingly.comALT.NET Paris - Juin
O RLY?
Separation of Concerns(SoC)
Romain Verdier http://codingly.comALT.NET Paris - Juin
Single Responsability Principle(SRP)
L’OOP ne permet pas toujours d’isoler certains « concerns »
Romain Verdier http://codingly.comALT.NET Paris - Juin
Cross Cutting Concerns
Romain Verdier http://codingly.comALT.NET Paris - Juin
« Considérations Entrecroisées » ou « Préoccupations Transversales ». Haha.
Romain Verdier http://codingly.comALT.NET Paris - Juin
Romain Verdier http://codingly.comALT.NET Paris - Juin
Code métier
Transactions
Logging
Méthode
Romain Verdier http://codingly.comALT.NET Paris - Juin
Peut-on faire mieux ?
2. L’AOP, mais qu’est-ce ?
Romain Verdier http://codingly.comALT.NET Paris - Juin
Plein de trucs.
Romain Verdier http://codingly.comALT.NET Paris - Juin
Romain Verdier http://codingly.comALT.NET Paris - Juin
On retiendra surtout :
Romain Verdier http://codingly.comALT.NET Paris - Juin
Aspect Oriented Programming
On parle aussi d’AOSD : Aspect Oriented Software Developement.
Le but :
Romain Verdier http://codingly.comALT.NET Paris - Juin
(Eliminer les spaghettis !)
Romain Verdier http://codingly.comALT.NET Paris - Juin
Permettre l’isolation des Cross Cutting Concerns, ces aspects
transverses qu’il est impossible de factoriser convenablement grâce à
l’OOP.
Oui, mais comment ?
Romain Verdier http://codingly.comALT.NET Paris - Juin
En mettant la notion d’aspect transverse au premier plan, et en offrant un complément à l’OOP.
Romain Verdier http://codingly.comALT.NET Paris - Juin
L’AOP est donc un complément à l’OOP.
Romain Verdier http://codingly.comALT.NET Paris - Juin
What ? Where ? When ?
En AOP, comment définir un aspect ?
Romain Verdier http://codingly.comALT.NET Paris - Juin
Aspect = Advice(s) + Pointcut(s)
Romain Verdier http://codingly.comALT.NET Paris - Juin
Advice (Greffon)
What.
Pièce de code constituant tout ou une partie de la logique de
l’aspect.
Romain Verdier http://codingly.comALT.NET Paris - Juin
Pointcut (Point d’action)
Point de branchement, endroit du programme où placer une greffe. Il s’agit forcément d’un
point de jonction.
Where. (When.)
Romain Verdier http://codingly.comALT.NET Paris - Juin
Joinpoint (Point de jonction)
Point valide de branchement dans le programme. Il y en a de
différents types.
Romain Verdier http://codingly.comALT.NET Paris - Juin
(Vous l’attendiez, hein ?)
Romain Verdier http://codingly.comALT.NET Paris - Juin
Identifier le cross cutting concern.
Romain Verdier http://codingly.comALT.NET Paris - Juin
Ecrire l’aspect.
Ici, un seul greffon qui pourrait ressembler à quelque chose comme ça :
Romain Verdier http://codingly.comALT.NET Paris - Juin
Choisir les points d’action.
Pointcut = « A l’entrée de chaque méthode »
En résumé, l’AOP consiste à :
Romain Verdier http://codingly.comALT.NET Paris - Juin
• Identifier les « cross cutting concerns »
• Ecrire un ou plusieurs greffons – les advices – qui représentent l’aspect et qui permettent d’encapsuler la « préoccupation transverse ».
• Choisir où appliquer ces greffons – les pointcuts…
… choisir où appliquer les greffons ?
Romain Verdier http://codingly.comALT.NET Paris - Juin
Justement, comment les appliquer ?
Romain Verdier http://codingly.comALT.NET Paris - Juin
MéthodeCode métier
Transactions
Logging
OOP OOP + AOP
VS
Romain Verdier http://codingly.comALT.NET Paris - Juin
Logging
Transactions
Code métier
Aspects
OOP + AOP
Pointcuts ?
Romain Verdier http://codingly.comALT.NET Paris - Juin
Il va falloir tisser.
Tisseur
Hourra !
Romain Verdier http://codingly.comALT.NET Paris - Juin
Logging
Transactions
Code métier
Aspects
OOP + AOP
Pointcuts
3. C’est magique ou quoi ?
Romain Verdier http://codingly.comALT.NET Paris - Juin
Non, il y a un truc.
Différentes techniques de tissage.
Romain Verdier http://codingly.comALT.NET Paris - Juin
Mais avant tout, il faut un moyen de décrire les aspects :
greffons et points d’action.
Romain Verdier http://codingly.comALT.NET Paris - Juin
Romain Verdier http://codingly.comALT.NET Paris - Juin
Un nouveau langage de programmation, une surcouche ou une extension à un langage
existant.
1 2 3 4
Romain Verdier http://codingly.comALT.NET Paris - Juin
Utilisation d’attributs, ou d’annotations : profiter du
support des métadonnées d’un langage.
21 3 4
Romain Verdier http://codingly.comALT.NET Paris - Juin
Fichier de configuration/définition. TXT,
XML, DSL, etc.
321 4
Romain Verdier http://codingly.comALT.NET Paris - Juin
API classique. Définir comment appliquer les aspects par code.
42 31
Romain Verdier http://codingly.comALT.NET Paris - Juin
Revenons au tissage
Aux techniques de tissage
Romain Verdier http://codingly.comALT.NET Paris - Juin
Tissage (Weaving) :
Insertion des greffons dans le programme à instrumenter, aux
points d’action définis.
Romain Verdier http://codingly.comALT.NET Paris - Juin
2 ½ types de tissage• Tissage statique
Compile-time weaving
• Tissage dynamiqueRuntime weaving
• (Tissage hybride)Compile-time + Runtime weaving
Romain Verdier http://codingly.comALT.NET Paris - Juin
Tissage statique.
Le tissage à lieu avant la compilation, durant la compilation, ou juste après la
compilation.
Mais avant l’exécution du programme.
1 2 3
Romain Verdier http://codingly.comALT.NET Paris - Juin
Avoir son propre compilateur.
1 2 3
Romain Verdier http://codingly.comALT.NET Paris - Juin
Modifier le code source.
1 2 3
Pré-compilation
Romain Verdier http://codingly.comALT.NET Paris - Juin
Modifier le bytecode.
CIL, Java bytecode
1 2 3
Romain Verdier http://codingly.comALT.NET Paris - Juin
Tissage dynamique.
Le tissage à lieu durant l’exécution du programme.
21 3
Romain Verdier http://codingly.comALT.NET Paris - Juin
Les techniques dépendent fortement de la plateforme.
Aujourd’hui, c’est .NET.
21 3
Romain Verdier http://codingly.comALT.NET Paris - Juin
Utiliser l’infrastructure de .NET Remoting
RealProxy, TransparentProxy, MarshalByRefObject, ContextBoundObject
21 3
Romain Verdier http://codingly.comALT.NET Paris - Juin
Génération dynamique de types à la volée. (Proxying)
Proxies via SRE
21 3
Romain Verdier http://codingly.comALT.NET Paris - Juin
Sciences occultes : Profiling API, Debugging API
21 3
Romain Verdier http://codingly.comALT.NET Paris - Juin
(Tissage
Deux autres catégories.
Hybride)31 2
Romain Verdier http://codingly.comALT.NET Paris - Juin
Tissage statique au chargement: Le tissage sur le bytecode a lieu juste avant le chargement de l’assembly.
31 2
Romain Verdier http://codingly.comALT.NET Paris - Juin
Instrumentation statique(Join points)
+Injection dynamique
(Advices)
31 2
4. Et donc, en .NET ?
Romain Verdier http://codingly.comALT.NET Paris - Juin
Romain Verdier http://codingly.comALT.NET Paris - Juin
Une myriade* d’outils.
* 10 000
Romain Verdier http://codingly.comALT.NET Paris - Juin
Mais peu* sont vivants, matures, utilisables, utilisés, etc.
* 3 < n < 6
Romain Verdier http://codingly.comALT.NET Paris - Juin
Cependant, l’AOP n’est pas, ou plus, un fantasme en .NET.
Romain Verdier http://codingly.comALT.NET Paris - Juin
Pour commencer : l’interception dynamique.
Romain Verdier http://codingly.comALT.NET Paris - Juin
Attention, l’interception, ce n’est pas vraiment de l’AOP.
Romain Verdier http://codingly.comALT.NET Paris - Juin
Avant :
Service
Après :
Client ServiceProxy
J’fais ce que je veux.
Client
Romain Verdier http://codingly.comALT.NET Paris - Juin
Proxies .NET Remoting
• RealProxy, TransparentProxy• MarshalByRefObject, ContextBoundObject• Contraignant• Lourd, performances• BCL• (Policy Injection Application Block)
Romain Verdier http://codingly.comALT.NET Paris - Juin
Castle.DynamicProxy
• System.Reflection.Emit• Très mature, très utilisé• Simple• (Castle.Windsor)
Romain Verdier http://codingly.comALT.NET Paris - Juin
Linfu.DynamicProxy
• System.Reflection.Emit• Lightweight• Performant• A la mode, commence à remplacer Castle.DP2• Simple
Romain Verdier http://codingly.comALT.NET Paris - Juin
IoC + Interception = AOP ?
Romain Verdier http://codingly.comALT.NET Paris - Juin
Spring.NET
• Conteneur IoC• Spring.Aop• Interception dynamique• Assez riche• Mature• System.Reflection.Emit
Romain Verdier http://codingly.comALT.NET Paris - Juin
Tissage Statique
Romain Verdier http://codingly.comALT.NET Paris - Juin
Linfu.AOP
• Tissage Hybride• Simple• Utilise Mono.Cecil• Jeune• Supporte mal le debug
Romain Verdier http://codingly.comALT.NET Paris - Juin
PostSharp (PostSharp.Laos)
• Plateforme complète• Full static weaving• Supporte le Load-time weaving• Très riche, mature• Plutôt « easy »• (Commercial)
Romain Verdier http://codingly.comALT.NET Paris - Juin
Mais encore :
5. Bullshit !
Romain Verdier http://codingly.comALT.NET Paris - Juin
Romain Verdier http://codingly.comALT.NET Paris - Juin
Romain Verdier http://codingly.comALT.NET Paris - Juin
Interception dynamique
• Real/Transparent Proxy• Castle.DynamicProxy• Linfu.DynamicProxy
code;
Romain Verdier http://codingly.comALT.NET Paris - Juin
Tissage statique
• PostSharp.Laos
• Linfu.AOP
code;
Romain Verdier http://codingly.comALT.NET Paris - Juin
Romain Verdier http://codingly.comALT.NET Paris - Juin
Conteneurs IoC & Interception
• Spring.NET• (Castle.Windsor)• (Etc.)
code;
Romain Verdier http://codingly.comALT.NET Paris - Juin
A la main ?
• System.Reflection.Emit
• Mono.Cecil
code;
Romain Verdier http://codingly.comALT.NET Paris - Juin
Romain Verdier http://codingly.comALT.NET Paris - Juin
Pas de conclusion.
Romain Verdier http://codingly.comALT.NET Paris - Juin
Pour mieux débattre ?
Romain Verdier http://codingly.comALT.NET Paris - Juin
k thx bye.
Francehttp://www.altnetfr.orghttp://groups.google.com/group/parisaltnet
Photos
http://www.flickr.com/photos/kaztor/2974815584/http://www.flickr.com/photos/fdecomite/1655939589/http://www.flickr.com/photos/mytripsmypics/551019306/http://www.flickr.com/photos/st3f4n/143623934/http://www.flickr.com/photos/artsyscience/51311029/http://www.flickr.com/photos/wonderlane/298818505/http://www.flickr.com/photos/juliaanderson/2769018395/http://www.flickr.com/photos/putupyourdukes/3583539544/http://www.flickr.com/photos/jokofoto/809920021/http://www.flickr.com/photos/freakdiver/1390893431/ http://www.flickr.com/photos/strelitzia/259744405/http://www.flickr.com/photos/shoves/427382857/http://www.flickr.com/photos/isimmer/1033139937/http://www.flickr.com/photos/jbevain/314035471/http://www.flickr.com/photos/lamiacucina/3608223128/http://imgur.com/fhxDb.jpg
Romain Verdier http://codingly.comALT.NET Paris - Juin