aop en .net

91
AOP en .NET Romain Verdier http://codingly.com ALT.NET Paris - Juin

Upload: romain-verdier

Post on 25-Jun-2015

3.157 views

Category:

Technology


2 download

DESCRIPTION

La Programmation Orientée Aspect en .NET.

TRANSCRIPT

Page 1: AOP en .NET

AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 2: AOP en .NET

Qui a déjà entendu parler de l’AOP ?

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 3: AOP en .NET

Qui a déjà au moins joué un peu avec l’AOP ?

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 4: AOP en .NET

Qui a déjà utilisé l’AOP dans des projets ?

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 5: AOP en .NET

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

Page 6: AOP en .NET

Qui veut prendre ma place ?

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 7: AOP en .NET

Romain Verdierhttp://codingly.comhttp://twitter.com/romainverdier

Romain Verdier http://codingly.comALT.NET Paris - Juin

Consultant FastConnecthttp://fastconnect.frhttp://blog.fastconnect.fr

Page 8: AOP en .NET

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

Page 9: AOP en .NET

1. Le problème

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 10: AOP en .NET

Machine-level codeStructural programming

Procedural programmingModular programming

Object Oriented Programming

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 11: AOP en .NET

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

Page 12: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

O RLY?

Page 13: AOP en .NET

Separation of Concerns(SoC)

Romain Verdier http://codingly.comALT.NET Paris - Juin

Single Responsability Principle(SRP)

Page 14: AOP en .NET

L’OOP ne permet pas toujours d’isoler certains « concerns »

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 15: AOP en .NET

Cross Cutting Concerns

Romain Verdier http://codingly.comALT.NET Paris - Juin

« Considérations Entrecroisées » ou « Préoccupations Transversales ». Haha.

Page 16: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 17: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Code métier

Transactions

Logging

Méthode

Page 18: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Peut-on faire mieux ?

Page 19: AOP en .NET

2. L’AOP, mais qu’est-ce ?

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 20: AOP en .NET

Plein de trucs.

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 21: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 22: AOP en .NET

On retiendra surtout :

Romain Verdier http://codingly.comALT.NET Paris - Juin

Aspect Oriented Programming

On parle aussi d’AOSD : Aspect Oriented Software Developement.

Page 23: AOP en .NET

Le but :

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 24: AOP en .NET

(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.

Page 25: AOP en .NET

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.

Page 26: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

L’AOP est donc un complément à l’OOP.

Page 27: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

What ? Where ? When ?

En AOP, comment définir un aspect ?

Page 28: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Aspect = Advice(s) + Pointcut(s)

Page 29: AOP en .NET

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.

Page 30: AOP en .NET

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.)

Page 31: AOP en .NET

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.

Page 32: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

(Vous l’attendiez, hein ?)

Page 33: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Identifier le cross cutting concern.

Page 34: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Ecrire l’aspect.

Ici, un seul greffon qui pourrait ressembler à quelque chose comme ça :

Page 35: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Choisir les points d’action.

Pointcut = « A l’entrée de chaque méthode »

Page 36: AOP en .NET

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…

Page 37: AOP en .NET

… choisir où appliquer les greffons ?

Romain Verdier http://codingly.comALT.NET Paris - Juin

Justement, comment les appliquer ?

Page 38: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

MéthodeCode métier

Transactions

Logging

OOP OOP + AOP

VS

Page 39: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Logging

Transactions

Code métier

Aspects

OOP + AOP

Pointcuts ?

Page 40: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Il va falloir tisser.

Page 41: AOP en .NET

Tisseur

Hourra !

Romain Verdier http://codingly.comALT.NET Paris - Juin

Logging

Transactions

Code métier

Aspects

OOP + AOP

Pointcuts

Page 42: AOP en .NET

3. C’est magique ou quoi ?

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 43: AOP en .NET

Non, il y a un truc.

Différentes techniques de tissage.

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 44: AOP en .NET

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

Page 45: AOP en .NET

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

Page 46: AOP en .NET

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

Page 47: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Fichier de configuration/définition. TXT,

XML, DSL, etc.

321 4

Page 48: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

API classique. Définir comment appliquer les aspects par code.

42 31

Page 49: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Revenons au tissage

Aux techniques de tissage

Page 50: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Tissage (Weaving) :

Insertion des greffons dans le programme à instrumenter, aux

points d’action définis.

Page 51: AOP en .NET

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

Page 52: AOP en .NET

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

Page 53: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Avoir son propre compilateur.

1 2 3

Page 54: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Modifier le code source.

1 2 3

Pré-compilation

Page 55: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Modifier le bytecode.

CIL, Java bytecode

1 2 3

Page 56: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Tissage dynamique.

Le tissage à lieu durant l’exécution du programme.

21 3

Page 57: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Les techniques dépendent fortement de la plateforme.

Aujourd’hui, c’est .NET.

21 3

Page 58: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Utiliser l’infrastructure de .NET Remoting

RealProxy, TransparentProxy, MarshalByRefObject, ContextBoundObject

21 3

Page 59: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Génération dynamique de types à la volée. (Proxying)

Proxies via SRE

21 3

Page 60: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Sciences occultes : Profiling API, Debugging API

21 3

Page 61: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

(Tissage

Deux autres catégories.

Hybride)31 2

Page 62: AOP en .NET

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

Page 63: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Instrumentation statique(Join points)

+Injection dynamique

(Advices)

31 2

Page 64: AOP en .NET

4. Et donc, en .NET ?

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 65: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Une myriade* d’outils.

* 10 000

Page 66: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Mais peu* sont vivants, matures, utilisables, utilisés, etc.

* 3 < n < 6

Page 67: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Cependant, l’AOP n’est pas, ou plus, un fantasme en .NET.

Page 68: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Pour commencer : l’interception dynamique.

Page 69: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Attention, l’interception, ce n’est pas vraiment de l’AOP.

Page 70: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Avant :

Service

Après :

Client ServiceProxy

J’fais ce que je veux.

Client

Page 71: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Proxies .NET Remoting

• RealProxy, TransparentProxy• MarshalByRefObject, ContextBoundObject• Contraignant• Lourd, performances• BCL• (Policy Injection Application Block)

Page 72: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Castle.DynamicProxy

• System.Reflection.Emit• Très mature, très utilisé• Simple• (Castle.Windsor)

Page 73: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Linfu.DynamicProxy

• System.Reflection.Emit• Lightweight• Performant• A la mode, commence à remplacer Castle.DP2• Simple

Page 74: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

IoC + Interception = AOP ?

Page 75: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Spring.NET

• Conteneur IoC• Spring.Aop• Interception dynamique• Assez riche• Mature• System.Reflection.Emit

Page 76: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Tissage Statique

Page 77: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Linfu.AOP

• Tissage Hybride• Simple• Utilise Mono.Cecil• Jeune• Supporte mal le debug

Page 78: AOP en .NET

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)

Page 79: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Mais encore :

Page 80: AOP en .NET

5. Bullshit !

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 81: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 82: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Interception dynamique

• Real/Transparent Proxy• Castle.DynamicProxy• Linfu.DynamicProxy

code;

Page 83: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Tissage statique

• PostSharp.Laos

• Linfu.AOP

code;

Page 84: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 85: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Conteneurs IoC & Interception

• Spring.NET• (Castle.Windsor)• (Etc.)

code;

Page 86: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

A la main ?

• System.Reflection.Emit

• Mono.Cecil

code;

Page 87: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Page 88: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Pas de conclusion.

Page 89: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

Pour mieux débattre ?

Page 90: AOP en .NET

Romain Verdier http://codingly.comALT.NET Paris - Juin

k thx bye.

Francehttp://www.altnetfr.orghttp://groups.google.com/group/parisaltnet

[email protected]

Page 91: AOP en .NET

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