La programmation par aspect (AOP) avec.net et J2EE par Thomas GIL

Dimension: px
Commencer à balayer dès la page:

Download "La programmation par aspect (AOP) avec.net et J2EE par Thomas GIL (thomas.gil@valtech.fr)"

Transcription

1 1 sur 15 26/02/ :19 La programmation par aspect (AOP) avec.net et J2EE par Thomas GIL Introduction Programmation fonctionnelle, structurée, orientée objet... Ces dernières décennies ont été riches en rebondissements et en mutations des modes de conception et de programmation. Et pour être honnête, la dernière marche (vers l'objet) s'inscrit dans la durée, tant le pas conceptuel à franchir est important. Cela n'empêche pas les passionnés, les veilleurs technologiques, de se demander : "et après"? Que reste-t-il à inventer, que peut-on encore améliorer dans notre mode de conception / programmation? Eh bien pour nous, la prochaine grande mutation sera celle de la programmation orientée Aspect (AOP). Cet article est tout d'abord une introduction aux idées et motivations qui ont mené à la programmation orientée aspect. Après avoir posé le contexte et introduit quelques définitions, nous pourrons nous enquérir des projets et des outils disponibles; cela passera, dans la tradition des comparatifs DotNetGuru, par un panorama sélectif des environnements C# /.NET et Java / J2EE. A l'issue de ce dossier illustrés par de nombreux exemples, nous descendrons d'un niveau conceptuel pour nous intéresser aux outils élémentaires qui permettent de générer et d'analyser du code Java / C#. Ceci dans le double objectif de vous donner les moyens de mettre à profit ces outils sur vos propres projets, et, qui sait, peut-être de développer votre propre "tisseur d'aspects" (nous y reviendrons plus loin). Motivations et définition de la programmation orientée aspect (AOP) A quoi aspire l'aop? Tout est parti d'un constat simple : quel que soit le mode de développement que nous adoptions, nous ne parvenons jamais à ne pas écrire de code redondant. Vous pouvez être un développeur ou un concepteur hors pair, que ce soit en programmation procédurale, fonctionnelle, par contrainte, par prédicat, par règles, ou encore en programmation orientée objet, il existera toujours une situation dans laquelle il faudra écrire des choses répétitives pour gérer certains besoins récurrents. Pour ne citer que des exemples tirés du monde Objet, demandons-nous comment nous pourrions gérer les besoins suivants sans écrire deux fois la même ligne de code : faire appel à un framework de log dans de nombreuses méthodes gérer une liste d'abonnés pour implémenter le Design Pattern "Observer" (quoique les event.net offrent une réponse partielle à ce besoin) implémenter le chargement dynamique d'objets mappés en base de données, lorsque nous réalisons nous-mêmes la couche d'accès aux données (sans outil de génération) gérer un cache objet efficace, dont chaque objet se souvient de son état : propre ou sale (dirty), c'est-à-dire modifié et devant être synchronisé par rapport à la source des données originelle faire porter à des objets différents des méthodes communes (signature et corps) quand une relation d'héritage entre leurs classes est impossible (héritage simple) ou qu'elle n'a aucun sens (règle "est-un" et principe d'inversion de Liskov) L'objectif de la programmation orientée aspects est donc de nous fournir une technique apte à factoriser ce que les autres nous obligent à répéter à travers le code de nos projets. Le type de problème visé par l'aop L'exemple suivant, connu comme le loup blanc dans le monde de l'aop Java, illustre bien le problème : dans le code du moteur de Servlets/JSP Tomcat, certains besoins techniques sont très localisés (lecture des fichiers de config, et donc parsing XML), d'autres sont répartis sur peu de classes (traitement des requêtes HTTP, et donc expressions régulières), mais il en est qui se retrouvent dans quasiment tout le code (appel au framework de log, pour diagnostiquer et journaliser les problèmes survenus en fonction de leur gravité, ainsi que pour rendre compte des requêtes traitées par le serveur). Figure A : Répartition du code de gestion de certains besoins dans le serveur Web Tomcat

2 2 sur 15 26/02/ :19 Si par malheur (pour le projet Tomcat) le framework de log était amené à évoluer, il faudrait procéder à de nombreuses modifications, réparties sur la quasi-totalité du code. On peut imaginer deux solutions à cette situation de crise : si la modification du framework de log se limite au renommage de certaines méthodes, appliquer un refactoring suffit (la plupart des IDE Java proposent le renommage cohérent des classes, méthodes, attributs à travers tout un projet. VisualStudio.NET quant à lui, est très en retard sur cet aspect); si le changement est plus important (nécessité de positionner un niveau d'erreur en fonction d'une l'exception levée...), il vaudra mieux développer un aspect, développé une seule fois, centralisé, mais qui s'appliquera à tous les endroits nécessaires. L'AOP se cantonne-t-elle aux langages orientés Objet? Non, car le problème que nous venons de soulever n'est pas nouveau. Il existait déjà lorsque nous développions en langage procédural; c'était même pire puisque nous n'avions même pas accès à l'héritage. Il est donc tout à fait licite de songer à utiliser l'aop en langage C, Cobol... Et certains l'ont fait : les équipes de développement du système d'exploitation libre FreeBSD; le système est bien entendu écrit en C, et l'aop a été introduit pour gérer de manière uniforme le problème du chargement pro-actif des informations (pre-fetching). L'outil employé s'appelle bien entendu AspectC, il est lui-même en phase de ré-implémentation... par les équipes en question, emballées par les perspectives offertes et qui souhaitent enrichir l'outil afin d'implémenter d'autres aspect dans leur système. Définition de l'aop Pour résumer, la programmation par aspects est une technique novatrice permettant de mettre en facteur certaines responsabilités dont la réalisation est a priori dispersée à travers un système, fût-il orienté objet. A noter : un synonyme de AOP, que vous rencontrerez immanquablement lors de vos tribulations sur le Web : AOSD pour Aspect Oriented Software Developpement. Le site de référence dans ce domaine est d'ailleurs : Et dès la première page, on retrouve une définition de l'aop: Aspect-oriented software development is a new technology for separation of concerns (SOC) in software development. The techniques of AOSD make it possible to modularize crosscutting aspects of a system. Implémentations concrètes de l'aop Il existe en réalité deux approches permettant d'implémenter le beau concept que représente l'aop. La première consiste à dire qu'il faut absolument séparer le code des aspect du code sur lequel nous voulons les appliquer (appelé code de base). Un langage tiers permet d'établir les relations exactes qui existent entre le code de base et les aspects. Flexible et très puissante, cette approche est parfois jugée un peu trop "magique" : le développeur d'une classe particulière sera étonné de la voir se comporter différemment de ce qu'il y a véritablement écrit, et se posera donc sans cesse la question "quel aspect s'applique à ma classe?", d'où la nécessité d'outils efficaces de gestion de la traçabilité. Cette orientation est suivie par les projets du type AspectJ, et comme ce projet est très moteur, elle a le vent en poupe. L'autre option serait de dire qu'il faut tout d'abord développer les aspects, certes, mais qu'il est ensuite nécessaire de "marquer" le code en utilisant une construction syntaxique adaptée. L'avantage que procure cette technique est d'expliciter dans le code la relation avec les aspects : du coup, le développeur n'est pas sans cesse en train de se demander "dois-je implémenter cela, ou un aspect s'en chargera-t-il?" : il voit les aspects auxquels il fait appel (ce qui n'ôte pas le besoin de comprendre leur sémantique). Cette seconde approche est suivie par Microsoft avec l'intégration en standard des Attributes.NET, et par certains outils de génération de code du type XDoclet en Java (mais est-ce toujours de l'aop, me demanderez-vous... le débat fait déjà rage sur le Web). Les sections suivantes vont s'efforcer de présenter ces deux techniques, en donnant des exemples d'implémentation dans les deux mondes, Java / J2EE et C# /.NET. Attributes.NET et intercepteurs Exemple d'attribute standard [Dans tout l'article, n'en déplaise à la loi Toubon, nous conserverons le mot anglais Attribute pour ne pas porter à confusion avec la notion d'attribut de classe ou d'instance, ces deux concepts n'ayant rien à voir.] La quasi-totalité des développeurs.net, quel que soit le langage choisi, a déjà manipulé les Attributes.NET : il s'agit de ces petits marqueurs que l'on place en en-tête d'une déclaration (de méthode, de classe, d'attribut, de namespace...) et qui permet de donner à cette déclaration une sémantique enrichie. L'exemple le plus simple est celui de la compilation conditionnelle : il suffit de préfixer la déclaration d'une méthode par l'attribute [Conditional("VAR_DE_PRECOMPIL")] pour que le compilateur rende conditionnel l'appel à cette méthode, en fonction de la présence de la VAR_DE_PRECOMPIL. Un petit exemple pour nous rafraîchir la mémoire : #define DEBUG using System; using System.Diagnostics;

3 3 sur 15 26/02/ :19 public class TestConditional { [Conditional("DEBUG")] public static void AfficherTrace(string msg) { Console.WriteLine(msg); public static void Main() { AfficherTrace("Entrée dans la méthode Main()"); TestConditional.cs Nous avons fait apparaître la définition de la variable DEBUG dans le code pour plus la clarté de l'exemple, mais bien entendu, c'est au niveau des propriétés du projet (ou des options de ligne de commande du compilateur) que nous le ferions sur un véritable projet. De cette manière, on pourrait choisir de manière globale le mode de compilation du projet et n'exécuter, en mode RELEASE, que le code qui soit absolument nécessaire. On peut dire que ceci constitue notre premier Aspect : un comportement récurrent et cohérent (exécuter ou ne pas exécuter une méthode) est ainsi appliqué à l'ensemble des méthodes repérées par l'attribute [Conditional]. Remarque : pour ceux qui découvrent l'attribute [Conditional] il va de soi que les méthodes pouvant ainsi être marquées doivent renvoyer void, et n'avoir aucun effet de bord; sans cela, leur compilation conditionnelle aurait un impact sur le déroulement nominal du programme. Définition d'attributes personnalisés Enrichir la sémantique des éléments de syntaxe.net est séduisant; il serait regrettable que cette faculté soit réservée au framework.net lui-même! Rassurez-vous, ce n'est pas le cas : nous pouvons tous développer nos propres Attributes, et les associer à tout type d'éléments du langage (quel que soit le langage.net). Comment faire? C'est très simple : un Attribute est... une classe qui hérite de System.Attribute. Par exemple, imaginons que nous souhaitions "marquer" certaines classes d'un modèle objet comme étant persistantes en base de données. Commençons par définir l'attribute PersistanceAutomatique : [System.AttributeUsage( System.AttributeTargets.Class)] public class PersistanceAutomatiqueAttribute : System.Attribute{ private bool lazyloading; private string nommapping; public PersistanceAutomatiqueAttribute (string nommapping){this.nommapping = nommapping; public string NomMapping{get{return nommapping; public bool LazyLoading{get{ return lazyloading;set{ lazyloading = value; PersistanceAutomatiqueAttribute.cs La règle veut que nous suffixions ce genre de classe par le mot Attribute de manière à ne pas confondre les classes d'attributes et les classes "normales". Et les compilateurs.net s'attendent eux aussi à ce que vos Attributes soient nommés comme cela. D'autre part, vous aurez noté que la classe PersistanceAutomatiqueAttribute est elle-même marquée par un Attribute standard, AttributeUsage. Cela permet au compilateur de vérifier que notre Attribute ne sera utilisé que sur les éléments de langage pour lesquels il a été prévu; dans notre exemple, nous avons limité l'applicabilité de PersistanceAutomatiqueAttribute aux classes. Il sera donc illégal (et le compilateur nous le fera savoir) de l'appliquer à une méthode, une structure, ou un namespace. Bien. Notre Attribute étant développé, appliquons-le à une classe métier (un CaddieVirtuel par exemple, pour ne pas perturber nos habitudes) : [PersistanceAutomatique("CaddieVirtuel", LazyLoading = true )] public class CaddieVirtuel { //... CaddieVirtuel.cs La syntaxe entre crochets ressemble étrangement à l'appel du constructeur de notre PersistanceAutomatiqueAttribute. C'est effectivement ce qui se passe, du moins pour le premier paramètre. Le second, vous l'aurez deviné, correspond à l'invocation du setter de la propriété LazyLoading. Deux questions viennent dès lors à l'esprit : Où sont stockées ces informations, que l'on passe en paramètre aux Attributes? A quel moment est invoqué le constructeur de notre Attribute? Répondre à la première question est trivial, il suffit de visualiser le contenu de l'assembly portant la définition de notre classe CaddieVirtuel avec l'utilitaire ILDASM.exe : Figure B : Contenu d'une assembly dont les classes sont marquées par des Attributes

4 4 sur 15 26/02/ :19 La valeur tronquée, sur la droite de la figure B, correspond à la chaîne "CaddieVirtuel" placée entre crochets dans le code C#. Les informations passées en paramètre aux Attributes sont donc bien stockées dans l'assembly qui fait appel à ces Attributes. Et pour savoir à quel instant sera réellement invoqué le constructeur de PersistanceAutomatiqueAttribute, nous vous proposons d'ajouter un simple System.Console.WriteLine("Dans le constructeur de PersistanceAutomatiqueAttribute");. Puis nous allons faire deux essais : le premier se contente d'instancier la classe CaddieVirtuel : public class GestionnairePersistance{ public static void Main(string[] args) { CaddieVirtuel cad = new CaddieVirtuel(); GestionnairePersistance.cs Résultat? Rien, la console n'a absolument rien affiché. Le constructeur de notre PersistanceAutomatiqueAttribute n'a donc pas été appelé. Deuxième essai : tentons de lire les méta-données de la classe CaddieVirtuel. Il suffit pour cela d'avoir recours à la réflexion.net : public class GestionnairePersistance{ public static void Main(string[] args) { CaddieVirtuel cad = new CaddieVirtuel(); foreach (System.Attribute a in cad.gettype().getcustomattributes(true)) { if (a is PersistanceAutomatiqueAttribute){ PersistanceAutomatiqueAttribute paa = a as PersistanceAutomatiqueAttribute; System.Console.WriteLine(paa.NomMapping); System.Console.WriteLine(paa.LazyLoading); GestionnairePersistance.cs Cette fois, le résultat est plus parlant : Figure C : Resultat obtenu par réflexion sur une classe marquée par PersistanceAutomatiqueAttribute Le constructeur d'un Attribute personnalisé est donc invoqué lors de la lecture de celui-ci. Conclusion : les Attributes permettent de repérer des emplacements particuliers dans le code.net et d'associer à ce repérage des méta-données (stockées dans l'assembly). Mais le comportement par défaut d'un Attribute est... de ne rien faire jusqu'au moment où l'on s'intéresse à lui. Ce mécanisme peut donc être utile (il permet aux classes utilisant la réflexion de prendre connaissance des méta-données) mais tout à fait insuffisant pour implémenter de véritables Aspects : en effet, comment installer du code avant et après l'invocation de méthodes sur une classe? Comment ajouter une méthode à une classe? Cela semble impossible... En tous cas, il nous manque un élément pour y parvenir. Intercepteurs.NET Souvenez-vous des articles publiés par Sami Jaber concernant le framework.net Remoting. Il était question de clients et de serveurs, de proxy et de skeletton, de channels, de messages et de MessageSink. Nous allons nous appuyer sur une partie de cette infrastructure pour placer un intercepteur entre notre objet métier et son client. Sans entrer dans les détails (que vous trouverez en suivant ce lien), il nous suffit de comprendre que : lorsqu'on invoque une méthode sur un objet "normal", l'invocation est directe, sans intermédiaire (et du coup très efficace, mais inadaptée à l'installation d'aspects) lorsqu'on invoque une méthode sur une objet héritant de System.ContextBoundObject, l'invocation est "réifiée en objet" (ou "marshallée"), c'est-à-dire qu'elle est transformée en un objet de type IMessage (ce marshalling est opéré par un couple d'objets du framework.net : le proxy transparent et le proxy réél); ce message passe ensuite par un ou plusieurs MessageSink qui peuvent décider de déclencher du code avant le transfert du message au suivant, ou après avoir reçu le message de retour. Dans un langage de Patterns, nous dirions que les MessageSink forment une chaîne de responsabilités. Dans cette chaîne, chacun peut déclencher du code lors de l'interception des messages, avant de les transférer au suivant dans la chaîne, jusqu'à atteindre l'objet cible lui-même. Mais on peut également imaginer d'empêcher la propagation d'un message de manière à interdire l'invocation d'une méthode à certaines classes, ou encore à tout client qui n'aurait pas initialisé correctement un certain contexte de sécurité. Le schéma

5 5 sur 15 26/02/ :19 suivant tente de récapituler cette séquence d'actions de manière plus graphique : Figure C : Infrastructure d'interception.net Il suffirait donc d'installer un MessageSink personnalisé en amont de chaque objet métier de manière à pouvoir déclencher du code avant, après l'invocation de méthodes (ou même d'accès aux attributs des objets en question). Cette technique est très puissante... et nous vous proposons de vous la faire toucher du doigt sur un exemple simple : un intercepteur qui va compter le nombre d'accès (invocation de méthodes, lecture / écriture d'attributs) à une classe cible. Commençons par développer une classe qui implémente l'interface IMessageSink : ce sera notre intercepteur, c'est lui qui appliquera notre aspect avant ou après l'invocation de méthodes ou l'accès aux attributs des objets cibles. using System; using System.Runtime.Remoting.Activation; using System.Runtime.Remoting.Contexts; using System.Runtime.Remoting.Messaging; // Notre intercepteur public class DNGAspectCompteur : IMessageSink{ private int nbhits; private IMessageSink suivant; public DNGAspectCompteur(IMessageSink suivant){ this.suivant = suivant; public IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink msgsink) { throw new Exception("Pas implémenté"); public IMessageSink NextSink { get{ throw new Exception("Pas implémenté"); public IMessage SyncProcessMessage(IMessage msg) { IMessage resultat = null; nbhits++; // On pourrait placer du code avant invocationresultat = suivant.syncprocessmessage(msg); // On pourrait placer du code après invocationreturn resultat; ~DNGAspectCompteur() { Console.WriteLine ("Nombre total d'accès à l'objet : {0", nbhits); DNGAspectCompteur.cs L'objet cible, quant à lui, n'a pas de complexité particulière à ceci près qu'il doit hériter de ContextBoundObject: using System; [DNGCompteur] public class DNGObservable : ContextBoundObject{ public int i = 5; public void Test(){ Console.WriteLine("dans test"); public static void Main(){ DNGObservable o = new DNGObservable(); o.i = 4; o.test(); o.i = 5; DNGObservable.cs Et comme vous l'avez deviné, c'est par l'application de l'attribute [DNGCompteur] que l'on associe l'intercepteur DNGAspectCompteur à la classe DNGObservable. Justement, c'est la partie la plus épineuse; l'attribute DNGCompteur est un peu particulier : il doit être déclenché automatiquement (pas question ici d'attendre que quelqu'un vienne lire l'attribute par introspection!), ce qui est possible à deux conditions : 1. L'Attribute doit hériter de ContextAttribute au lieu de Attribute

6 6 sur 15 26/02/ :19 2. L'objet visé doit hériter de ContextBoundObject, sans quoi notre Attribute ne serait pas sollicité automatiquement Sans vous faire languir davantage, voici le code nécessaire à l'association de l'attribute [DNGCompteur] à l'intercepteur DNGAspectCompteur : using System; using System.Runtime.Remoting.Activation; using System.Runtime.Remoting.Contexts; using System.Runtime.Remoting.Messaging; // Factory d'intercepteurs public class DNGAspectCompteurProperty : IContextProperty, IContributeObjectSink{ public IMessageSink GetObjectSink (System.MarshalByRefObject o, IMessageSink next) { return new DNGAspectCompteur(next); public void Freeze(Context ctx){ public bool IsNewContextOK(Context ctx){return true; public string Name{get{return "dngproperty"; // Installe la factory d'intercepteurs dans l'infrastructure d'interception.net [AttributeUsage(AttributeTargets.Class)] public class DNGCompteurAttribute : ContextAttribute { public DNGCompteurAttribute() : base("dngcontext"){ public override void GetPropertiesForNewContext(IConstructionCallMessage ccm) { ccm.contextproperties.add(new DNGAspectCompteurProperty ()); DNGObservable.cs Pour mieux comprendre ce qui précède, mettons-nous à la place du CLR, et partons de la méthode Main: Lors de l'instanciation de la classe métier DNGObservable, le CLR initialise un contexte dédié du fait que cet objet hérite de ContextBoundObject; Il parcourt immédiatement la liste des Attributes de la classe DNGObservable, à la recherche de ceux qui héritent de ContextAttribute. Il trouve notre [DNGCompteur], instancie la classe DNGCompteurAttribute associée, et invoque la méthode GetPropertiesForNewContext sur cette instance La méthode GetPropertiesForNewContext instancie à son tour une propriété de type DNGAspectCompteurProperty et l'associe au contexte de l'objet DNGObservable. Le rôle de cette propriété sera celui de fabrique d'intercepteurs : c'est à cet objet que l'infrastructure.net demandera d'instancier notre MessageSink. Une fois ces initialisations faites, nous nous retrouvons dans la méthode Main : L'instruction o.i = 4; invite l'infrastructure.net (proxy transparent et proxy réel) à invoquer la méthode GetObjectSink de la propriété précédemment associée au contexte de o. Cette méthode instancie enfin notre intercepteur DNGAspectCompteur, et le place dans la chaîne de responsabilité des MessageSink. Toute la tuyauterie est dorénavant en place. L'instruction o.i = 4; est traitée par la chaîne suivante : proxy transparent, proxy réel, DNGAspectCompteur, puis l'objet cible. Plus précisément, c'est la méthode SyncProcessMessage de DNGAspectCompteur qui sera invoquée dans cette chaîne, et c'est donc le bon endroit pour incrémenter le nombre de "hits" sur l'objet o. Les instructions suivantes o.test(); et o.i = 5; accèdent à l'objet cible via la même chaîne de responsabilité, et incrémentent donc elles aussi le nombre de hits Avant de terminer notre application, le CLR invoque l'ensemble des finaliseurs, dont ~DNGAspectCompteur, dans lequel nous en avons profité pour imprimer le nombre de hits total sur l'objet. Sans surprise, le résultat est 3 dans notre exemple. Par souci de simplicité, nous n'avons pas osé mentionner la possibilité d'invoquer les méthodes de l'objet cible de manière asynchrone... mais comme vous avez pu le lire dans le code, réagir à ces invocations ne serait pas différent de ce que nous avons présenté ci-dessus. Attributes et intercepteurs = Aspect? Ce que l'on appelle Aspect (et nous reviendrons précisément sur cette terminologie dans la présentation de AspectJ ci-dessous) correspond à l'application d'un ensemble de Conseils (enrichissements de code) à un ensemble d'éléments du code de base (typiquement à un ensemble de classes). Adopter la technique des ContextAttributes pour installer les intercepteurs MessageSink permet de répondre à une partie du problème : l'affectation (dans le code) des aspects aux éléments de syntaxe à enrichir. Mais il faut encore à faire le lien entre les MessageSink et le code supplémentaire à déclencher avant ou après les accès aux objets cibles (les Conseils). Sur ce point, plusieurs idées viennent à l'esprit : Soit on développe les Conseils sous forme de MessageSink, ce qui n'est pas trop contraignant car il suffit de redéfinir la méthode SyncProcessMessage. Mais cette approche est assez fermée : pour ajouter de nouvelles fonctionnalités aux conseils, il nous faudra modifier le code du MessageSink, le recompiler, et relancer l'application pour qu'il soit rechargé. Soit le MessageSink n'est finalement qu'un contrôleur, qui ira chercher dans un fichier de configuration (XML, bien entendu) le nom de la (ou des) classe associée à un Aspect particulier; il suffit ensuite de se mettre d'accord sur le nom de la méthode à déclencher sur les classes en question, et d'imposer cette règle en obligeant les classes à

7 7 sur 15 26/02/ :19 implémenter une interface commune. Cette approche est séduisante car elle permet d'ajouter des Conseils sans modifier le code du MessageSink contrôleur, et elle permet également de procéder à ces ajouts à chaud, en cours de fonctionnement de nos applications. C'est de cette manière que procède l'outil CLAW, dont le développement est malheureusement interrompu. Vous trouverez les raisons de cet arrêt prématuré sur le weblog du développeur de l'outil, John Lam. Notre point de vue L'utilisation d'attributes et de MessageSink est assez simple à mettre en oeuvre, séduisante, et très intégrée au framework.net. Mais elle pose tout de même quelques problèmes, dont trois très sérieux : l'insertion d'intermédiaires capables d'intercepter chaque invocation de méthode peut sembler lourde. En effet, les performances globales de l'application vont s'en ressentir. Pour se faire une idée, c'est un peu la manière de faire de la plupart des serveurs d'application EJB dans le monde Java / J2EE... Souple, robuste, évolutif, mais pas forcément très efficace. Mais ce paramètre n'est pas nécessairement primordial pour toutes les applications. le second problème est plus gênant : les objets sur lesquels nous souhaitons installer un MessageSink doivent hériter de ContextBoundObject. Or cette classe hérite de... MarshalByRefObject. Ce qui signifie que dans une application distribuée par.net Remoting, tous les objets sur lesquels nous aurons apposé un Aspect par ce biais seront passés par référence, et non par valeur. Cela a un impact non négligeable sur l'architecture de ladite application, ainsi que sur ses performances globales. le dernier souci que nous rencontrons est lié au précédent : nos objets métier doivent hériter de ContextBoundObject. Or.NET impose un héritage simple de classes... Nous voilà donc bloqués? Pas tout à fait : pour limiter le problème, il faudrait que tous les objets de plus haut niveau dans la hiérarchie d'héritage des objets métier soient des enfants de ContextBoundObject. Mais conceptuellement, c'est très dérangeant car cela introduit une adhérence du modèle des objets métier vis-à-vis d'une infrastructure technique! Un véritable sacrilège! Moralité, en l'état, cette technique est envisageable pour des applications "standalone" pour associer des Aspects aux objets passés par référence dans une application.net Remoting à condition d'accepter la pollution du modèle objet par l'héritage de la classe ContextBoundObject à supposer que l'ajout de [nombreux] intermédiaires ne dégrade pas trop les performances des l'applications visées A notre avis, ce n'est donc, malheureusement, pas la meilleure technique pour implémenter l'aop en.net. Nous avons toutefois tenu à vous l'expliquer en détail à la fois par curiosité, et pour que vous perceviez bien les raisons de notre préférence pour la philosophie des outils du type AspectJ, présentée plus loin. XDoclet Java Rassurez-vous, l'objectif ici n'est certainement pas de faire une présentation de l'outil bien connu du monde Java et permettant de générer du code et des descripteurs de déploiement relatifs aux EJB, Servlets et JSP (entre autres). Pour cela, nous vous renvoyons sur le site officiel de XDoclet. Non, nous voulions simplement attirer votre attention sur le fait que l'approche par Doclet en Java est voisine de l'utilisation d'attributes en.net, du moins dans la syntaxe. Sur la page d'accueil de XDoclet, on nous parle d'ailleurs de programmation orientée Attribute... Rappel sur le fonctionnement des Doclets Pour ceux qui n'auraient pas vu de code Java depuis longtemps, souvenez-vous : il est possible de placer, en en-tête des déclaration de packages, classes, méthodes et attributs des commentaires un peu spéciaux appelés "commentaires JavaDoc". Comme leur nom l'indique, ces commentaires étaient initialement destinés à la génération automatique de documentation (au format HTML). Mais rien n'empêche de s'appuyer sur le même mécanisme pour générer d'autres types de fichiers, dont du code; il suffit pour cela de : définir de nouveaux mots-clé (qui seront repérés par le à placer dans les commentaires JavaDoc développer une classe Java (une Doclet) capable d'interpréter ces nouveaux mots-clé et de produire quelque chose d'utile Le reste, c'est-à-dire le parcours du code Java à la recherche des commentaires JavaDoc, est complètement automatique grâce à l'outil éponyme : javadoc.exe. Et c'est une option de ligne de commande qui lui indique quelle Doclet utiliser pour faire l'interprétation des commentaires spéciaux. Exemple de développement d'ejb avec XDoclet Non outillé, le développement d'enterprise JavaBeans est lourd et fastidieux. Il faut en effet produire de nombreux fichiers (classes Java et fichiers de configuration XML), à travers lesquelles on trouve beaucoup de redondances : la classe du Bean lui-même (l'implémentation de l'objet métier) l'interface métier distante du Bean (décrivant l'ensemble des méthodes et accesseurs invocables par RMI) l'interface métier locale du Bean (décrivant l'ensemble des méthodes et accesseurs invocables au sein même du serveur d'applications) l'interface locale de la fabrique du Bean (la Home dans la terminologie EJB) l'interface distante de la fabrique du Bean le descripteur de déploiement standard ejb-jar.xml

8 8 sur 15 26/02/ :19 et souvent, un descripteur de déploiement propriétaire (jboss.xml, weblogic-jar.xml...) la (ou les) classe DTO (Data Transfer Object, jadis appelée Value Object) qui permettra de passer des informations par valeur entre le serveur d'ejb et ses clients L'époque héroïque où il fallait produire ces fichiers manuellement est définitivement révolue. Aujourd'hui, la majorité des développeurs d'ejb utilisent soit un outil de génération de code basé sur UML (Together Control Center par exemple), soit la XDoclet. Nous ne pouvons pas résister au plaisir de vous montrer un petit exemple de classe Java enrichie des tags JavaDoc nécessaire à la génération de tous les fichiers connexes; cet exemple est extrait d'un petit projet de gestion de cours dans une société de formation... : package beans; import java.util.collection; import javax.ejb.*; import javax.naming.initialcontext; import util.xhome; /** type="cmp" view-type="local" primkey-field = "id" * schema="course" name="course" local-jndi-name="beans/course" signature = "java.util.collection findall()" signature = "beans.courselocal findbycode(java.lang.string code)" * query = "SELECT OBJECT(c) FROM Course c WHERE c.code =?1" class = "java.lang.integer" */ public abstract class CourseBean implements EntityBean {/** public abstract Integer getid(); public abstract void setid(integer id); /** public abstract String getcode(); /* public abstract void setcode(string code); /** public abstract int getduration(); /* public abstract void setduration(int duration); /** public abstract String getdurationunit(); /* public abstract void setdurationunit(string durationunit); /** public abstract String getlabratio(); /* public abstract void setlabratio(string labratio); /** public abstract String getlanguage(); /* public abstract void setlanguage(string language); /** public abstract String gettitle(); /* public abstract void settitle(string title); name="course-objectives" * role-name="course-has-objectives" * target-ejb="objective" public abstract Collection getobjectives(); /* public abstract void setobjectives(collection objectives); */ public Integer ejbcreate() throws CreateException { setid(xhome.getnewpk("course")); return null; public void ejbpostcreate() { public void setentitycontext(entitycontext context) { public void unsetentitycontext() { public void ejbremove() { public void ejbload() { public void ejbstore() { public void ejbactivate() { public void ejbpassivate() { CourseBean.cs Vous nous direz : "quel est le rapport avec la programmation orientée Aspects?" A priori pas grand chose. Mais à y regarder de plus prêt, le principe est assez proche de l'utilisation des Attributes et des intercepteurs.net :

9 9 sur 15 26/02/ :19 On repère dans le code les méthodes et les classes à "enrichir" L'interception des invocations et la réalisation de l'enrichissement est fait par les classes générées par la XDoclet, qui s'insèrent dans l'infrastructure d'interception des EJB : les interfaces générées transforment notre simple classe en EJB, et les descripteurs de déploiement recueillent toute la configuration technique (dans notre exemple, la requête de recherche d'un cours par son code, ainsi que la définition d'une relation entre le cours et ses objectifs pédagogiques, qui sont représentés par un autre EJB). L'idée était à notre avis suffisamment voisine pour mériter d'être mentionnée dans un article concernant l'aop. AspectJ Changeons de démarche : après avoir vu comment utiliser les Attributes ou les commentaires JavaDoc pour décorer du code en vue de l'enrichir grâce à des intercepteurs intelligents, nous allons nous intéresser à AspectJ dont la philosophie prône la séparation complète entre le code "de base" et les aspects. Introduction AspectJ est un projet assez ambitieux, qui vise à définir et appliquer des aspects très précis sur des classes Java. Ce projet a longtemps existé de manière autonome, mais sont son support est aujourd'hui assuré par la communauté eclipse.org. C'est donc sur ce site que l'on pourra télécharger les dernières versions de AspectJ, ainsi qu'un plug-in permettant de manipuler cet outil depuis Eclipse. AspectJ n'est pas le seul produit d'aop disponible dans le monde Java, comme vous pouvez le voir sur ce recensement d'outils. Toutefois, c'est certainement le plus avancé, et celui qui remporte le plus grand nombre de suffrages; ses définitions sont bien acceptées par les acteurs du domaine de l'aop, et sont reprises par les autres outils du même acabit (que nous verrons plus tard, dans le monde.net). Aussi nous proposons-nous de vous offrir un petit glossaire : Terme anglais Advice Joinpoint Pointcut Aspect Terme français retenu par DNG Conseil Evénement Java Points d'interception Aspect Définition Fragment de code (Java pour AspectJ) qui est voué à être inséré dans les classes du code "de base". Techniquement parlant, on peut associer un conseil à un ensemble des points d'une zone d'interception (cf définitions suivantes). Identification d'un endroit dans le "code de base" où l'on pourra insérer des Conseils. En fait d'endroit, il vaut mieux se représenter les Joinpoints comme des moments, ou des événements particuliers; par exemple, le moment où un constructeur ou une méthode est appelé, un attribut accédé... Un point d'interception est un enrichissement des événements Java : il permet par exemple d'identifier l'invocation d'une méthode particulière, sur l'instance d'une classe bien précise... AspectJ permet d'utiliser des caractères génériques (* et..) pour identifier un ensemble de points d'interception de manière concise. Il est également possible de définir des "pointcuts utilisateur", c'est-à-dire de libeller un regroupement de points d'interception de manière à simplifier l'application d'un conseil à plusieurs endroits du code de base. Un aspect est une unité de regroupement de : définitions de points d'interceptions nommés associations de points d'interceptions (nommés ou anonymes) à des conseils introduction d'attributs ou de méthodes dans les classes cibles (du code "de base") Chaque aspect est stocké dans un fichier éponyme (d'extension.java), et se place dans un package standard. Cela ressemble donc étrangement à une classe, à ceci près que le mot clé est, bien entendu, aspect{. Weaver Tisseur Compilateur permettant d'appliquer les aspects au "code de base" Le principe de fonctionnement d'aspectj est très simple : quasiment tout se passe à la compilation du projet. L'ordre de compilation est le suivant : Le tisseur AspectJ recherche l'ensemble des définitions d'aspects à travers le projet, et les compile. Plus précisément, il pré-compile chaque aspect en une classe Java standard, qui est à son tour compilée en bytecode. Si tous les aspects sont exempts d'erreur de compilation, ils sont appliqués aux classes de base. En pratique, cela revient à identifier tous les points d'interception dans le code source des classes ciblées, et à y insérer le code des conseils associés. A noter que l'on peut tout à fait associer plusieurs conseils à un même point d'interception. L'insertion de code ne se fait pas dans le source lui-même, heureusement, mais sur une copie temporaire. Il n'y a donc pas de pollution du code par les aspects ni de problème de suppression d'un aspect précédemment appliqué. Une fois le code Java modifié, il est compilé en bytecode comme d'habitude. Au runtime, on exécute donc le bytecode, compilé après application des aspects. A priori, rien n'est spécifique à AspectJ dans le code que nous exécutons et il est donc inutile de placer quoi que ce soit sur le CLASSPATH. En pratique, lorsque nous développerons des Conseils un peu subtils (qui ont recours à l'introspection pour savoir sur quel élément de syntaxe ils agissent), il faudra tout de même ajouter une toute petite bibliothèque, aspectjrt.jar, qui ne mesure que 29 Ko. Mode de travail

10 10 sur 15 26/02/ :19 On peut tout à fait utiliser le tisseur AspectJ en ligne de commande, et développer les aspects avec n'importe quel éditeur de texte. Ce sera la technique préférée des afficionados de Vi, (X)Emacs, UltraEdit ou NEdit. Autre technique : AspectJ est livré avec un navigateur graphique d'aspects, dont voici une petite copie d'écran (ne faites pas attention au code de l'aspect visualisé, nous allons y revenir par la suite). Figure D : AspectJ Browser Mais le plus simple est certainement de se reposer sur le Plug-In AspectJ développé spécifiquement pour Eclipse. Celui-ci permet de : créer un projet AspectJ ajouter un ensemble d'aspects au projet générer un fichier de configuration (.lst) qui référence l'ensemble des aspects que le tisseur devra prendre en compte et lancer la compilation par un simple clic droit sur le fichier.lst. A l'usage, nous avons trouvé ce plug-in tout à fait stable, et très bien intégré aux convention de l'ide Eclipse. Par exemple, une erreur de compilation d'un aspect apparaît sous forme d'une petite bulle rouge dans la marge et dans la liste des tâches, exactement comme une erreur de compilation Java traditionnelle. Exemple itératif Pour illustrer cette présentation d'aspectj, nous vous proposons d'écrire l'aspect qui comptera le nombre d'accès à une instance de classe Java, comme nous l'avions fait dans la section Attributes et intercepteurs.net. 1. Accès aux méthodes Commençons par créer un aspect nommé DNGCompteur. Ajoutons à cet aspect un point d'interception nommé (pointcut) qui identifie l'ensemble des endroits où nous souhaitons déclencher du code. package org.dng.aop.aspects; public aspect DNGCompteur { pointcut invocationmethodes(): call(* org.dng.aop..*.*(..)) &&!within(dngcompteur); before(): invocationmethodes() { System.out.println("Avant l'acces a une methode"); DNGCompteur.java La traduction littérale de cet aspect est la suivante : juste avant (before()) chaque appel d'une méthode (call()) sur une instance de classe se trouvant dans le package org.dng.aop ou n'importe lequel de ses sous-packages (org.dng.aop..*.*), à l'exception d'invocations qui se produiraient dans l'aspect DNGComteur lui-même (!within(dngcompteur)), nous voulons invoquer le Conseil System.out.println("Avant l'acces a une methode");. Nous avons placé la contrainte!within(dngcompteur) pour éviter toute invocation de méthode récursive... L'encart suivant nous montre le code "de base" sur lequel nous allons appliquer l'aspect précédent : package org.dng.aop.base; public class Observable { private int valeur;

11 11 sur 15 26/02/ :19 public void test(){ System.out.println("Dans la methode test de Observable"); public int getvaleur() { return valeur; public void setvaleur(int valeur) { this.valeur = valeur; /******/ public class Test { public static void main(string[] args) { Observable obs = new Observable(); obs.test(); System.out.println( obs.getvaleur() ); Observable.java et Test.java Vous notez que ce code est complètement naïf : il ne se doute pas de ce qui va lui arriver. Pourtant, après application de l'aspect DNGCompteur, le résultat du lancement de la méthode Test.main donne le résultat suivant : Figure E.1 : Compteur d'accès Le problème de notre Conseil est qu'il est incapable de nous dire quelle méthode va être appelée. Pour cela, il doit faire appel à une introspection un peu spéciale, qui passe par un objet "magique" fourni par AspectJ : la représentation du JoinPoint. Nous modifions notre aspect : package org.dng.aop.aspects; public aspect DNGCompteur { pointcut invocationmethodes(): call(* org.dng.aop..*.*(..)) &&!within(dngcompteur); before(): invocationmethodes() { System.out.println("Avant l'acces a une methode\n\t" + thisjoinpoint); DNGCompteur.java Ce qui donne : Figure E.2 : Compteur d'accès 2. Accès aux attributs De la même manière, nous pourrions placer un Conseil sur l'accès aux attributs. Vous connaissez le principe : package org.dng.aop.aspects; public aspect DNGCompteur { pointcut sollicitationquelconque(): (call(* org.dng.aop..*.*(..)) get(* org.dng.aop..*)) &&!within(dngcompteur); before(): sollicitationquelconque() { System.out.println ("Avant l'acces a : \n\t " + thisjoinpoint); DNGCompteur.java Et sans surprise, le résultat comptabilise également l'accès aux attributs de l'objet Observable (en lecture uniquement, grâce à

12 12 sur 15 26/02/ :19 get()) : Figure E.3 : Compteur d'accès 3. Ajout d'un attribut et d'un getter pour le compteur Pour le moment, nous n'avons fait que réagir à l'invocation de méthodes et à l'accès aux attributs. Comment enrichir notre exemple pour comptabiliser le nombre d'accès opérés sur un objet particulier (ici l'objet Observable)? Vous me direz : "s'il y a un objet qui doit porter cette responsabilité, c'est bien l'objet Observable lui-même". Tout à fait d'accord. Mais il n'a pas été prévu pour cela... Qu'à cela ne tienne : nous allons utiliser une nouvelle facette de AspectJ, appelée l'introduction, et qui va nous permettre d'ajouter un nouvel attribut à la classe Observable, ainsi qu'un getter pour lire et afficher la valeur de cet attribut en fin de programme. package org.dng.aop.aspects; public aspect DNGCompteur { private int org.dng.aop.base.observable.compteurhits; public int org.dng.aop.base.observable.getcompteurhits(){ return compteurhits; pointcut sollicitationquelconque(): (call(* org.dng.aop..*.*(..)) get(* org.dng.aop..*)) &&!within(dngcompteur); before(): sollicitationquelconque() { System.out.println ("Avant l'acces a : \n\t " + thisjoinpoint); DNGCompteur.java Par pure curiosité, nous avons voulu jeter un oeil aux types de modifications opérées dans le code de la classe Observable. Pour cela, il suffit de la décompiler par jad. Le résultat parle de lui-même : // Decompiled by Jad v1.5.7f. Copyright 2000 Pavel Kouznetsov. // Source File Name: Observable.java package org.dng.aop.base; import java.io.printstream; import org.aspectj.runtime.reflect.factory; import org.dng.aop.aspects.dngcompteur; public class Observable{ public Observable(){ DNGCompteur.ajc$interFieldInit$org_dng_aop_aspects_DNGCompteur$org_dng_aop_base_Observable$compteurHits(this); public void test(){ System.out.println("Dans la methode test de Observable"); public int getvaleur(){ Observable observable = this; Object aobj[]; org.aspectj.lang.joinpoint joinpoint = Factory.makeJP(ajc$tjp_0, this, observable, aobj = new Object[0]); DNGCompteur.ajc$perSingletonInstance.ajc$before$org_dng_aop_aspects_DNGCompteur$154(joinpoint); return observable.valeur; public void setvaleur(int arg0){ valeur = arg0; public int getcompteurhits(){ private int valeur; public int ajc$interfield$org_dng_aop_aspects_dngcompteur$compteurhits; public static final org.aspectj.lang.joinpoint.staticpart ajc$tjp_0; static { Factory factory = new Factory("Observable.java", Class.forName("org.dng.aop.base.Observable")); ajc$tjp_0 = factory.makesjp("field-get", factory.makefieldsig("2-valeurorg.dng.aop.base.observable-int-"), 11); Observable.jad, décompilée après application de l'aspect DNGCompteur On voit bien que l'aspect DNGCompteur est utilisée pour insérer les Conseils (nommés "DNGCOmpteur.ajc $

13 13 sur 15 26/02/ :19 interelement_syntaxique $ CLASSE_DE_BASE $ METHODE_DE_BASE"), mais que l'attribut lui-même est bien situé dans la classe Observable. 4. Incrémentation du compteur et récupération de la valeur finale Il ne nous reste plus qu'à utiliser ce nouvel attribut inséré dans la classe Observable, et à l'incrémenter d'une unité dans notre Conseil. Il faut pour cela déclarer l'instance de la classe Observable sur laquelle nous voulons avoir accès à l'attribut compteurhits dans le pointcut, sans quoi cet élément serait inaccessible au conseil associé : package org.dng.aop.aspects; public aspect DNGCompteur { private int org.dng.aop.base.observable.compteurhits; public int org.dng.aop.base.observable.getcompteurhits(){ return compteurhits; pointcut sollicitationquelconque(org.dng.aop.base.observable o): (call(* org.dng.aop..*.*(..)) get(* org.dng.aop..*)) &&!within(dngcompteur) && target (o); before(org.dng.aop.base.observable o): sollicitationquelconque(o) { o.compteurhits++; System.out.println("Nombre hits : "+o.compteurhits); DNGCompteur.java Le résultat ne nous surprend plus : Figure E.4 : Compteur d'accès Il est toutefois intéressant de noter que dans le code "de base", l'attribut compteurhits et son accesseur deviennent accessibles! Ce qui fait qu'il est légal dans la classe Test d'invoquer obs.getcompteurhits(), alors que cette méthode n'a pas été déclarée dans la classe Observable! Faisons le point AspectJ est un produit très simple à prendre en main, et à la fois très puissant. Après ce petit exemple d'utilisation, nous pouvons nous demander pour quels types de besoins concrets nous pourrions l'utiliser : L'exemple le plus couramment cité est celui de l'invocation d'un framework de log. En effet, il devient très simple d'invoquer une méthode de log pour tracer l'exécution de méthodes d'une application. Les statistiques sur l'usage du logging dans Tomcat, dont nous avons reproduit le rapport en début d'article, sont assez parlantes : invoquer le framework "à la main", c'est-à-dire en tant que développeur dans le code, n'est absolument pas maintenable. Alors qu'en appliquant un Aspect suffisamment précis, cela peut se résumer à quelques lignes de code centralisées au lieu de milliers de lignes éparpillées. Une autre pratique récurrente dans le monde de l'aop est d'implémenter le pattern Observable-Observer sous forme d'aspect. En effet, gérer une liste d'abonnés, offrir des méthodes d'abonnement et de désabonnement... est un besoin récurrent, mais que l'on ne peut guère factoriser dans une classe mère car celle-ci serait purement technique. Et l'héritage simple deviendrait une contrainte gênante. Alors qu'appliquer un aspect pour ajouter les méthodes et les attributs nécessaire à cette gestion de l'abonnement-désabonnement-publication à un ensemble de classes est trivial. Rendre un objet distribué devient également très simple : en Java, il suffit à un objet d'implémenter l'interface java.rmi.remote pour être exportable par la méthode PortableRemoteObject.exportObject(). Or le modèle d'introduction d'aspectj nous permet justement de modifier la liste des interfaces implémentées par une classe... Le reste tombe sous le sens : on pourrait tirer parti des aspects pour implémenter des services techniques tels que la gestion de la sécurité, les transactions... on est en train de ré-inventer la notion de serveur d'application EJB, mais sans la lourdeur impliquée par un développement EJB! Les adeptes de la programmation par contrat auront déjà pensé à insérer en début et fin de méthodes des pré- et post-conditions, ainsi que la vérification d'invariants de classe... Les exemples sont multiples, et vous trouverez certainement des applications novatrices de l'aop sur vos propres projets! AspectC#, Weave.NET, [AspectDNG?] Le problème La question qui brûle les lèvres est bien sûr : "existe-t-il un équivalent à AspectJ dans le monde.net "? La réponse, malheureusement, est négative. Quelques projets d'étude ont vu le jour, certes, tels que Weave.NET et AspectC#, mais ces projets sont à l'état d'ébauche. Le plus avancé semble être AspectC#, qui est issu d'une thèse d'étudiant très intéressante à lire ici, et repris par Donal

14 14 sur 15 26/02/ :19 Lafferty; AspectC# est librement téléchargeable et se présente sous la forme d'un tisseur (AspectCSharp.exe) et d'un fichier de configuration XML pour associer les aspects au code de base. Mais ce produit est limité : il n'offre pas de Joinpoint sur les accès aux attributs par exemple, ni rien qui soit adapté aux delegates, aux structures, aux Attributes... Il est actuellement en version alpha, et sa page Web n'est guère confiante quant aux évolutions à venir ou au support de cet outil. Bref, nous sommes loin de la richesse, du support et de la pérennité de AspectJ. Nous éprouvons donc une certaine frustration : à l'aube d'une ère nouvelle du développement logiciel, une technique séduisante, l'aop, semble vouloir percer, et nous nous trouvons dans l'incapacité de l'expérimenter pour cause d'absence de l'outillage adéquat sur la plate-forme.net. La proposition DotNetGuru souhaite négocier le virage de l'aop sur.net dès aujourd'hui, et vous faire profiter du mouvement. Sami et moi avons donc l'envie de développer notre propre tisseur d'aspects (appelons-le AspectDNG), et de placer son code sous la licence LGPL. Mais comme vous le savez, cela n'a pas été le rôle de DotNetGuru jusqu'à présent de développer des outils sur.net. Nous sommes donc à votre entière écoute, pour déterminer si les conditions suivantes sont réunies : êtes-vous intéressés par l'aop? êtes-vous prêts à vous investir et devenir au moins les beta-testeurs d'aspectdng, voire les contributeurs de cet outil? pensez-vous que DotNetGuru doive jouer ce rôle de développeur sur l'aop.net? Ou devons-nous laisser ce soin à l'éditeur Microsoft ou à d'autres communautés Open Source? La question est posée, chers lecteurs... la balle est dans votre camp. Notre désir est de répondre au mieux à vos attentes, aussi est-ce à vous de nous dire si ce projet aurait pour vous plus ou moins de valeur ajoutée que les articles que nous pourrions écrire en lieu et place du développement d'aspect.dng. La décision sera prise dans quelques temps, en fonction du sentiment recueilli dans les commentaires de cet article. C'est donc un mode de prise de décision démocratique que nous vous proposons, à l'image duquel nous aimerions voir le monde évoluer... Outils de génération de code Pour tous ceux qui seraient intéressées par... la création d'un tisseur.net (décidément...) ou par la génération de code spécifique à un projet, à supposer que les outils de génération de code.net (tels que OlyMars ou DTM par exemple) ne répondent pas à vos besoins... nous vous proposons un panorama rapide des diverses techniques offertes par la plate-forme.net dans ce domaine. Emit System.Reflection.Emit est une interface de programmation standard du framework.net permettant de générer du code MS IL à la volée. C'est un outil très utile si vous souhaitez créer un compilateur (un compilateur PHP en MSIL par exemple...), mais il s'avère de bien trop bas niveau dans le cadre de la génération ou de la manipulation de code. CodeDOM System.CodeDom est une autre interface standard, de bien plus haut niveau, dont l'objectif est de représenter un arbre syntaxique abstrait (un AST) sous forme d'objets.net. Comme son nom l'indique, CodeDom est au code.net ce que le DOM est à un document XML. Le gros avantage de CodeDom est d'être complètement abstrait, indépendant de toute syntaxe des langages de programmation. Cette représentation mémoire pourra ensuite être transformée en un fichier C#, VB.NET, ou tout autre langage.net à condition de disposer du générateur de code correspondant. Un petit exemple nous permettra de nous faire une idée du niveau d'abstraction de CodeDom : using System; using System.CodeDom; using System.CodeDom.Compiler; public class CodeDom { public static void Main(string[] args){ // Unité de compilation ou de génération codecodecompileunit ccu = new CodeCompileUnit(); // Nouveau namespacecodenamespace ns = new CodeNamespace("DngNamespace"); ccu.namespaces.add(ns); // Nouvelle classe CodeTypeDeclaration c = new CodeTypeDeclaration("DngClass"); ns.types.add(c); c.isclass = true; // Nouvelle méthode CodeEntryPointMethod m = new CodeEntryPointMethod(); c.members.add(m); // Première manière d'ajouter une instruction CodeMethodInvokeExpression expr = new CodeMethodInvokeExpression ( new CodeTypeReferenceExpression("System.Console"), "WriteLine", new CodePrimitiveExpression("Hello World!") ); m.statements.add(new CodeExpressionStatement(expr)); // Seconde manière, quasiment équivalents m.statements.add(new CodeSnippetStatement("System.Console.WriteLine(\"Hello\");")); // Génération de codecodedomprovider comp;

15 15 sur 15 26/02/ :19 // C# comp = new Microsoft.CSharp.CSharpCodeProvider(); comp.creategenerator().generatecodefromcompileunit (ccu, Console.Out, new CodeGeneratorOptions()); // VB.NET comp = new Microsoft.VisualBasic.VBCodeProvider(); comp.creategenerator().generatecodefromcompileunit (ccu, Console.Out, new CodeGeneratorOptions()); DNGCompteur.java Le résultat de ce petit programme semble satisfaisant : C# namespace AO namespace DngNamespace { public class DngClass { public static void Main() { System.Console.WriteLine("Hello World!"); System.Console.WriteLine("Hello"); VB Option Strict Off Option Explicit On Namespace DngNamespace Public Class DngClass Public Shared Sub Main() System.Console.WriteLine("Hello World!") System.Console.WriteLine("Hello"); End Sub End Class End Namespace Code généré par System.CodeDom Mais à y regarder de plus près, l'utilisation d'une ligne de code littérale dans notre programme de génération s'est avérée fatale à la génération de VB.NET. En effet, le point-virgule en fin d'instruction ne respecte pas la syntaxe VB.NET. Nous voilà mis en garde : si nous souhaitons véritablement générer du code multi-langage avec CodeDom, il faudra prendre soin de passer par les classes d'abstraction fournies plutôt que de générer directement du texte dans une "snippet". CodeDom nous a paru séduisant pour produire du code. Aussi pensions-nous avoir trouvé l'outil adéquat au développement d'un tisseur d'aspects! Nous avons donc cherché à faire l'opération inverse : lire du code (C# ou VB.NET) pour créer automatiquement un arbre CodeDom en mémoire. Il se trouve justement que l'objet CodeDomProvider dispose d'une méthode CreateParser(). Eh bien c'est un piège : cette méthode, dans le framework standard, renvoie toujours null (que ce soit pour C# ou pour VB.NET). Microsoft ne fournit en standard l'implémentation d'aucun parseur de code source. Qu'à cela ne tienne : quelqu'un d'autre doit l'avoir développé pour les besoins d'un projet... On trouve en effet une implémentation Open Source d'un parseur C# générant un arbre CodeDom : CS CODEDOM (disponible sur et sur Cette implémentation s'appuie d'ailleurs sur MCS, le parseur C# du projet Mono... Bref, CodeDom est prometteur, mais il lui manque un ensemble de parseurs pour les langages.net usuels : C#, VB.NET, MC++, JScript.NET et J#. Conclusion La programmation orientée aspect est une technique orthogonale aux autres modes de programmation (objet, procédurale...) et s'utilise en complément. Notre sentiment est qu'elle est promise à un avenir radieux, car elle permet de résoudre de manière simple et élégante des problèmes insolubles en son absence et qui portent atteinte à la maintenabilité du code des projets importants. Factoriser les besoins techniques récurrents et les appliquer de manière générique à un ensemble d'éléments d'un projet est une méthode naturelle. Aujourd'hui, elle est parfaitement outillée dans le monde Java, et en passe de l'être sur.net. Il ne reste plus qu'à acquérir le réflexe des aspects, de la même manière que nous avons acquis celui de l'objet. Nous sommes persuadés que le bon usage des aspects (pourtant si simples) prendra du temps. Il sera facilité, comme l'a été celui de l'objet, par la formalisation et l'apprentissage de nouveaux Design Patterns... Auteur : Thomas GIL Copyright Janvier 2003 Ressources Dossiers du feu magazine Developpeur Référence sur l'aop : Site de l'aop : (Et surtout n'allez pas faire comme moi, n'est PAS le site officiel de l'aop, tout comme n'est pas le site officiel du serveur JSP : Jakarta Tomcat)

Java Licence professionnelle CISI 2009-2010

Java Licence professionnelle CISI 2009-2010 Java Licence professionnelle CISI 2009-2010 Cours 10 : Type générique (c) http://manu.e3b.org/java/tutoriels/avance/generique.pdf 1 Introduction La programmation générique - nouveauté la plus significative

Plus en détail

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère L'héritage et le polymorphisme en Java Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère En java, toutes les classes sont dérivée de la

Plus en détail

Plan. Environnement Client/Serveur. Cours 6 Rappels Java (suite) Appel de méthode à distance. Utilité. static

Plan. Environnement Client/Serveur. Cours 6 Rappels Java (suite) Appel de méthode à distance. Utilité. static Plan Environnement Client/Serveur Cours 6 Rappels Java (suite) Appel de méthode à distance kn@lri.fr http://www.lri.fr/~kn 1 Rappels sur les systèmes d'exploitations / Communication par mémoire partagée

Plus en détail

Mise en œuvre des serveurs d application

Mise en œuvre des serveurs d application Nancy-Université Mise en œuvre des serveurs d application UE 203d Master 1 IST-IE Printemps 2008 Master 1 IST-IE : Mise en œuvre des serveurs d application 1/54 Ces transparents, ainsi que les énoncés

Plus en détail

L héritage Encore un petit topo des familles. Je pense qu'avec ce genre de chapitre, ce n'est pas du luxe...

L héritage Encore un petit topo des familles. Je pense qu'avec ce genre de chapitre, ce n'est pas du luxe... L héritage Encore un petit topo des familles. Je pense qu'avec ce genre de chapitre, ce n'est pas du luxe... Une classe hérite d'une autre classe par le biais du mot clé extends. Une classe ne peut hériter

Plus en détail

Symfony 2. 1.Définition de symfony 2. 2.Installation. 3.Structure. 4.Symfony et les commandes

Symfony 2. 1.Définition de symfony 2. 2.Installation. 3.Structure. 4.Symfony et les commandes Symfony 2 Sommaire : 1.Définition de symfony 2 2.Installation 3.Structure 4.Symfony et les commandes 5.Le fonctionnement : le routeur (les url), les bundles, twig(templates) 6.L architecture de symfony2

Plus en détail

Licence d'informatique 2004-2005 Examen Programmation orientée objet Juin 2005

Licence d'informatique 2004-2005 Examen Programmation orientée objet Juin 2005 Licence d'informatique 2004-2005 Examen Programmation orientée objet Juin 2005 Durée de l'épreuve : 2 heures TRÈS IMPORTANT : respectez l'ordre des questions. La lisibilité sera un critère important pour

Plus en détail

Développement de Servlets et JSP avec Eclipse

Développement de Servlets et JSP avec Eclipse Développement de Servlets et JSP avec Eclipse Sommaire 1 Mise en place o 1.1 Installation de Galileo o 1.2 Association de Galileo avec une installation de Tomcat o 1.3 Pilotage des serveurs 2 Développement

Plus en détail

ERRATA - MAGASIN VIRTUEL

ERRATA - MAGASIN VIRTUEL ERRATA - MAGASIN VIRTUEL 1 28 juillet 2005 Entre mars et juillet 2005, un certain nombre d'articles sont parus sur [http://tahe.developpez.com]. Ils avaient pour but de présenter le framework Spring aussi

Plus en détail

Précis de vocabulaire Orienté Objet

Précis de vocabulaire Orienté Objet Dernière Mise à jour : Mars 2007 Précis de vocabulaire Orienté Objet 1 Questions Expliquer et donner un exemple pour chacun des concepts suivants 1. Qu'est-ce qu'un objet? 2. Qu'est-ce qu'une classe? 3.

Plus en détail

Le Framework.Net. Introduction. Pourquoi.Net?

Le Framework.Net. Introduction. Pourquoi.Net? Introduction. Pourquoi.Net? Le Framework.Net Cela fait une dizaine d'années que le monde du développement est bouleversé d'une part par la programmation objet et d'autre part par les applications web.

Plus en détail

SQL Server Management Studio Express

SQL Server Management Studio Express SQL Server Management Studio Express L'outil de gestion gratuit des bases Microsoft SQL Suite à mon précédent article, Microsoft a mis à disposition du public d'un outil gratuit de gestion des bases de

Plus en détail

TD1. Installation de Symfony 2 et Netbeans

TD1. Installation de Symfony 2 et Netbeans I - Introduction : TD1 Installation de Symfony 2 et Netbeans L objet de ce TP est d installer l environnement de travail. Nous commençons par définir des notions de base nécessaires pour comprendre la

Plus en détail

Scub Foundation. Socle technique Java Open Source http://www.scub-foundation.org

Scub Foundation. Socle technique Java Open Source http://www.scub-foundation.org Scub Foundation Socle technique Java Open Source http://www.scub-foundation.org Présentation de Scub Présentation de Scub Scub est une société de service en informatique qui a pour but de fournir du conseil

Plus en détail

DA MOTA Anthony - Comparaison de technologies : PhoneGap VS Cordova

DA MOTA Anthony - Comparaison de technologies : PhoneGap VS Cordova DA MOTA Anthony - Comparaison de technologies : PhoneGap VS Cordova I. Introduction Dans une période où la plasticité peut aider à réduire les coûts de développement de projets comme des applications mobile,

Plus en détail

PG208, Projet n 3 : Serveur HTTP évolué

PG208, Projet n 3 : Serveur HTTP évolué PG208, Projet n 3 : Serveur HTTP évolué Bertrand LE GAL, Serge BOUTER et Clément VUCHENER Filière électronique 2 eme année - Année universitaire 2011-2012 1 Introduction 1.1 Objectif du projet L objectif

Plus en détail

Architecture N-Tier. Ces données peuvent être saisies interactivement via l interface ou lues depuis un disque. Application

Architecture N-Tier. Ces données peuvent être saisies interactivement via l interface ou lues depuis un disque. Application Architecture Multi-Tier Traditionnellement une application informatique est un programme exécutable sur une machine qui représente la logique de traitement des données manipulées par l application. Ces

Plus en détail

Reporting Services - Administration

Reporting Services - Administration Reporting Services - Administration Comment administrer SQL Server Reporting Services Cet article a pour but de présenter comment gérer le serveur depuis le "portail" de Reporting Services. Nous verrons

Plus en détail

La réplication sous SQL Server 2005

La réplication sous SQL Server 2005 La réplication sous SQL Server 2005 Mettre en place la réplication sur SQL Server 2005 La réplication des bases de données est une problématique classique dans les systèmes d'information. En effet, dans

Plus en détail

Applications Réparties TD 3 Web Services.NET

Applications Réparties TD 3 Web Services.NET Ce TD vous enseignera les bases de l'utilisation des Web Services en.net avec Visual Studio.NET 1 Introduction Vos applications.net, quelles soient Windows Forms ou Web Forms, peuvent avoir recours, dans

Plus en détail

Microsoft Application Center Test

Microsoft Application Center Test Microsoft Application Center Test L'outil de Test de performance des Sites Web Avec Visual Studio.NET, il est fourni une petite application qui permet de valider la performance de son site Internet ou

Plus en détail

AOP Tools Comparison

AOP Tools Comparison Comparaison des outils de développement AOP en Java basée sur l'article de Mik Kersten. Fabrice Bodmer & Timothée Maret Université de Fribourg, Juin 2006 Plan 1. Introduction 2. Présentation des outils

Plus en détail

JAVA PROGRAMMATION. Programme. 1. Java, HTML et World Wide Web

JAVA PROGRAMMATION. Programme. 1. Java, HTML et World Wide Web PROGRAMMATION PUBLIC Professionnels informatiques qui souhaitent développer des applications et «applets» Java DUREE 4 jours 28 heures OBJECTIF Créer divers «applets» à intégrer dans un site Web dynamique,

Plus en détail

TP6 EJB : Création d'un EJB3 Entité

TP6 EJB : Création d'un EJB3 Entité TP6 EJB : Création d'un EJB3 Entité Objis : nous allons vous faire aimer JAVA - www.objis.com 1 Table des matières Formation EJB - TP 'Développement EJB3 entity avec Eclipse' Propriété du document...3

Plus en détail

Spring IDE. Mise en œuvre. Eclipse

Spring IDE. Mise en œuvre. Eclipse A Spring IDE Bien que Spring mette à disposition d intéressants mécanismes afin d améliorer l architecture des applications Java EE en se fondant sur l injection de dépendances et la programmation orientée

Plus en détail

1. Installation d'un serveur d'application JBoss:

1. Installation d'un serveur d'application JBoss: EPITA Ala Eddine BEN SALEM App-Ing2 J2EE T.P. 4 EJB3, Serveur d'application JBoss 1. Installation d'un serveur d'application JBoss: télécharger l'archive du serveur JBoss à l'adresse: http://sourceforge.net/projects/jboss/files/jboss/jboss-5.0.0.ga/jboss-5.0.0.ga.zip/download

Plus en détail

Le.NET Compact Framework Windows Mobile

Le.NET Compact Framework Windows Mobile Le.NET Compact Framework Windows Mobile HEROGUEL Quentin 2 Le.NET Compact Framework Windows Mobile Sommaire 1 Le.NET Compact Framework... 3 1.1 Vue d ensemble rapide de l architecture du.net Compact Framework...

Plus en détail

WINDOWS SERVER 2003 ADMINISTRATION A DISTANCE

WINDOWS SERVER 2003 ADMINISTRATION A DISTANCE 1. Introduction WINDOWS SERVER 2003 ADMINISTRATION A DISTANCE En règle générale, les administrateurs ne travaillent pas en salle serveurs. Et cette dernière peut se trouver n'importe où dans le bâtiment.

Plus en détail

STAGE2 STAGIAIRE / NIKOLAOS TSOLAKIS. 16/02/2015 : choix des outils nécessités pour l application : Didier Kolb, le maitre de stage

STAGE2 STAGIAIRE / NIKOLAOS TSOLAKIS. 16/02/2015 : choix des outils nécessités pour l application : Didier Kolb, le maitre de stage STAGE2 STAGIAIRE / NIKOLAOS TSOLAKIS 16/02/2015 : choix des outils nécessités pour l application : Didier Kolb, le maitre de stage m invite à faire une étude sur les outils qui seraient utilisés. Sites

Plus en détail

Chapitre 2. Classes et objets

Chapitre 2. Classes et objets Chapitre 2: Classes et Objets 1/10 Chapitre 2 Classes et objets Chapitre 2: Classes et Objets 2/10 Approche Orientée Objet Idée de base de A.O.O. repose sur l'observation de la façon dont nous procédons

Plus en détail

Applications orientées données (NSY135)

Applications orientées données (NSY135) Applications orientées données (NSY135) 2 Applications Web Dynamiques Auteurs: Raphaël Fournier-S niehotta et Philippe Rigaux (philippe.rigaux@cnam.fr,fournier@cnam.fr) Département d informatique Conservatoire

Plus en détail

Java 7 Les fondamentaux du langage Java

Java 7 Les fondamentaux du langage Java 184 Java 7 Les fondamentaux du langage Java 1.1 Les bibliothèques graphiques Le langage Java propose deux bibliothèques dédiées à la conception d'interfaces graphiques. La bibliothèque AWT et la bibliothèque

Plus en détail

Visual Studio.NET et Visual SourceSafe - Part 3

Visual Studio.NET et Visual SourceSafe - Part 3 Visual Studio.NET et Visual SourceSafe - Part 3 VSS et VS.NET en développement collaboratif Dans cette partie, nous verrons comment mettre en place une base SourceSafe sur un serveur afin que plusieurs

Plus en détail

Votre première application Android - Introduction aux Interfac. utilisateur

Votre première application Android - Introduction aux Interfac. utilisateur Votre première application Android - Introduction aux Interfaces graphiques utilisateur frederic.guinand@univ-lehavre.fr 2014-2015 Plan Analyse d une app Android : visite guidée Introduction aux interfaces

Plus en détail

Créer un rapport pour Reporting Services

Créer un rapport pour Reporting Services Créer un rapport pour Reporting Services Comment créer des rapports pour SSRS Maintenant que nous avons vu que la version de SQL Server 2005 Express Edition with Advanced Services intègre SQL Server Reporting

Plus en détail

Formation Gestion concours Version 2011.1.2 du 3 février 2011

Formation Gestion concours Version 2011.1.2 du 3 février 2011 Formation Gestion concours Version 2011.1.2 du 3 février 2011 PROGRAMME - Présentation du logiciel - Installation du logiciel, identification des éléments du logiciel - Récupération des licenciés de la

Plus en détail

Cahier de charges (Source : "Java EE - Guide de développement d'applications web en Java" par Jérôme Lafosse) Module. Site Web dynamique JSP / Servlet

Cahier de charges (Source : Java EE - Guide de développement d'applications web en Java par Jérôme Lafosse) Module. Site Web dynamique JSP / Servlet Cahier de charges (Source : "Java EE - Guide de développement d'applications web en Java" par Jérôme Lafosse) Module Site Web dynamique JSP / Servlet Sujet : betaboutique Soutenance le 04 / 01 /2013 &

Plus en détail

WordPress : Guide à l édition

WordPress : Guide à l édition WordPress : Guide à l édition WordPress : Guide à l édition... 1 Présentation... 2 1. Accès au site... 2 2. Le tableau de bord... 2 3. Editez les contenus... 4 Quelle est la différence entre les pages

Plus en détail

S. Laporte C# mode console DAIGL TS1

S. Laporte C# mode console DAIGL TS1 Bases du langage C# I. C# en mode console (mode texte) Avantages par rapport au mode graphique (Application Windows): - C'est un mode plus proche de l'approche algorithmique (pas de notions de composants,

Plus en détail

Programmation récursive

Programmation récursive Année 2004-2005 F. Lévy IUT De Villetaneuse Dép t informatique Cours d'algorithmique 2 éme Année Cours 8 Programmation récursive 1. Qu'est-ce que la programmation récursive Définition : la programmation

Plus en détail

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2 Langage et Concepts de Programmation Objet Travaux Dirigés no2 Pôle Informatique École Nationale Supérieure des Mines de St-Etienne Vous trouverez plus de détails sur les concepts abordés lors de ce TD

Plus en détail

Guillaume SOLDERA (B guillaume.soldera@serli.fr) SERLI Informatique Bull OW2 Consortium. Comparatif Choco/Drools dans le cadre du projet JASMINe

Guillaume SOLDERA (B guillaume.soldera@serli.fr) SERLI Informatique Bull OW2 Consortium. Comparatif Choco/Drools dans le cadre du projet JASMINe Guillaume SOLDERA (B guillaume.soldera@serli.fr) SERLI Informatique Bull OW2 Consortium dans le cadre du projet JASMINe Avril 2008 Table des matières 1 Introduction 3 1.1 Rappel sur JASMINe.......................................

Plus en détail

Programmation Objet - Cours II

Programmation Objet - Cours II Programmation Objet - Cours II - Exercices - Page 1 Programmation Objet - Cours II Exercices Auteur : E.Thirion - Dernière mise à jour : 05/07/2015 Les exercices suivants sont en majorité des projets à

Plus en détail

JXDVDTek - UNE DVDTHEQUE EN JAVA ET XML

JXDVDTek - UNE DVDTHEQUE EN JAVA ET XML BALLOTE Nadia FRIULI Valerio GILARDI Mathieu IUT de Nice Licence Professionnelle des Métiers de l Informatique RAPPORT DU PROJET : JXDVDTek - UNE DVDTHEQUE EN JAVA ET XML Encadré par : M. CRESCENZO Pierre

Plus en détail

Explication des statistiques

Explication des statistiques Explication des statistiques Sources : http://www.eolas.fr/8-conseil/65-interpreter-vos-statistiques-webalizer.htm http://support.sherweb.com/faqdetails.php?idarticle=68 Un site web est un ensemble de

Plus en détail

Créer le modèle multidimensionnel

Créer le modèle multidimensionnel 231 Chapitre 6 Créer le modèle multidimensionnel 1. Présentation de SSAS multidimensionnel Créer le modèle multidimensionnel SSAS (SQL Server Analysis Services) multidimensionnel est un serveur de bases

Plus en détail

PROJET PERSONNALISÉ ENCADRÉ : N 6

PROJET PERSONNALISÉ ENCADRÉ : N 6 PROJET PERSONNALISÉ ENCADRÉ : N 6 Mise en place d un serveur AD Benjamin Dupuy BTS Service Informatique aux Organisations Option : Solutions d'infrastructure, systèmes et réseaux Epreuve E6 Parcours de

Plus en détail

Programmation PHP Septembre 2010

Programmation PHP Septembre 2010 IFT1147 Programmation Serveur Web avec PHP Plan La POO en PHP Lecture du chapitre 20. Programmation par objets Introduction à la POO Objets et classes Propriétés Méthodes Private Héritage Polymorphisme

Plus en détail

Chapitre 6 Héritage en Java

Chapitre 6 Héritage en Java Chapitre 6: Héritage 1/12 Chapitre 6 Héritage en Java Chapitre 6: Héritage 2/12 1. Généralités L'héritage est le troisième des paradigmes de la programmation orientée objet (le 1 er étant l'encapsulation,

Plus en détail

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web. ASTRIUM - Toulouse JEE Formation 2013 TP JEE Développement Web en Java Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web. Figure 1 Architecture

Plus en détail

Programmation Avancée pour le Web

Programmation Avancée pour le Web L3 Informatique Option : ISIL Programmation Avancée pour le Web RAMDANI Med U Bouira 1 Contenu du module Introduction aux applications Web Rappels sur les sites Web Conception d une application Web Notion

Plus en détail

6.1 Une classe simple pour représenter des comptes bancaires

6.1 Une classe simple pour représenter des comptes bancaires Chapitre 6 Héritage Ce chapitre du cours traite de concepts relatifs à la programmation objet (hiérarchie de classe, héritage, extension, masquage) et sera illustré par un exemple de représentation de

Plus en détail

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

INTRODUCTION A JAVA. Fichier en langage machine Exécutable INTRODUCTION A JAVA JAVA est un langage orienté-objet pur. Il ressemble beaucoup à C++ au niveau de la syntaxe. En revanche, ces deux langages sont très différents dans leur structure (organisation du

Plus en détail

Manuel Utilisateur. Création de site web

Manuel Utilisateur. Création de site web Manuel Utilisateur Création de site web Auteur : Logica Version : 1.3 Droit d auteur Ce texte est disponible sous contrat Creative Commons Paternité - Pas d'utilisation Commerciale - Partage des Conditions

Plus en détail

0- Le langage C++ 1- Du langage C au langage C++ 2- Quelques éléments sur le langage. 3- Organisation du cours

0- Le langage C++ 1- Du langage C au langage C++ 2- Quelques éléments sur le langage. 3- Organisation du cours 0- Le langage C++ 1- Du langage C au langage C++ 2- Quelques éléments sur le langage 3- Organisation du cours Le présent cours constitue une introduction pour situer le langage C++, beaucoup des concepts

Plus en détail

Fonctionnalités de développement

Fonctionnalités de développement 163 Chapitre 5 Fonctionnalités de développement 1. Optimisation des applications ASP.NET Fonctionnalités de développement 1.1 Présentation de ASP.NET ASP.NET est un ensemble de technologies créé par Microsoft

Plus en détail

Manuel Utilisateur. Boticely

Manuel Utilisateur. Boticely Manuel Utilisateur Boticely Auteur : Logica Version : 1.4 Droit d auteur Ce texte est disponible sous contrat Creative Commons Paternité - Pas d'utilisation Commerciale - Partage des Conditions Initiales

Plus en détail

TP SPRING. https ://lipn.univ-paris13.fr/ fortier/enseignement/spring/tp/

TP SPRING. https ://lipn.univ-paris13.fr/ fortier/enseignement/spring/tp/ Institut Galilée Année 2015-2016 TP SPRING Programmation et Logiciels sûrs Master 2 PLS Résumé L objectif de ce TP est d être capable de réaliser une application Java de gestion de location de véhicules,voiture

Plus en détail

Introduction au débogage avec Eclipse

Introduction au débogage avec Eclipse Introduction au débogage avec Eclipse C. Pain-Barre et H. Garreta IUT INFO Année 2006-2007 1 Notion de debogage Tout développeur est confronté un jour à un programme qui plante pour une raison apparemment

Plus en détail

Présentation. Logistique. Résumé de la 1e Partie. Mise en place du système

Présentation. Logistique. Résumé de la 1e Partie. Mise en place du système Présentation Diapo01 Je m appelle Michel Canneddu. Je développe avec 4D depuis 1987 et j exerce en tant qu indépendant depuis 1990. Avant de commencer, je tiens à remercier mes parrains Jean-Pierre MILLIET,

Plus en détail

Généralités sur le Langage Java et éléments syntaxiques.

Généralités sur le Langage Java et éléments syntaxiques. Généralités sur le Langage Java et éléments syntaxiques. Généralités sur le Langage Java et éléments syntaxiques....1 Introduction...1 Genéralité sur le langage Java....1 Syntaxe de base du Langage...

Plus en détail

E-LECLERC LEVALUATION DU SITE WEB. A. Evaluation «subjective» du site web. 1. Choix du site web. 2. Présentation le site A P I 0 8 1 1 / 0 3 / 2 0 1 4

E-LECLERC LEVALUATION DU SITE WEB. A. Evaluation «subjective» du site web. 1. Choix du site web. 2. Présentation le site A P I 0 8 1 1 / 0 3 / 2 0 1 4 LEVALUATION DU SITE WEB E-LECLERC A P I 0 8 1 1 / 0 3 / 2 0 1 4 A. Evaluation «subjective» du site web 1. Choix du site web J ai choisi de réaliser l évaluation «subjective» sur le site web : www.e-leclerc.com,

Plus en détail

Mémento professeur du réseau pédagogique

Mémento professeur du réseau pédagogique Mémento professeur du réseau pédagogique 1. Accéder au réseau pédagogique Il suffit quand on vous demande votre nom d utilisateur et votre mot de passe de renseigner ceux-ci. Votre nom d utilisateur est

Plus en détail

La comptabilisation dans la ligne Crésus Le module de comptabilisation

La comptabilisation dans la ligne Crésus Le module de comptabilisation Note La comptabilisation dans la ligne Crésus Le module de comptabilisation Ce document présente le fonctionnement du module de comptabilisation qui prend la relève entre les programmes de facturation

Plus en détail

Systeme d'exploitation

Systeme d'exploitation Introduction au dévellopement de Methodes Natives Partie I : appelle de methodes C++ sous windows Auteur: Frank Sauvage. 1 \ introduction aux methodes natives : Les methodes natives sont des methodes devellopées

Plus en détail

Programmation orientée objet dans VFP QUELQUES CONCEPTS FONDAMENTAUX ET LEURS APPLICATIONS DANS VFP

Programmation orientée objet dans VFP QUELQUES CONCEPTS FONDAMENTAUX ET LEURS APPLICATIONS DANS VFP Programmation orientée objet dans VFP QUELQUES CONCEPTS FONDAMENTAUX ET LEURS APPLICATIONS DANS VFP Avertissement : qui suis-je? d où viens-je? 30 années de développement de progiciels de gestion dans

Plus en détail

FORMATION GEDIWEB SUPPORT

FORMATION GEDIWEB SUPPORT FORMATION GEDIWEB SUPPORT GEDIWEB : LES EDITIONS 2010 AVERTISSEMENT GEDIDOC et GEDIWEB sont des marques déposées MEDIAL : produits commercialisés sous licence d'utilisation. Ce document est la propriété

Plus en détail

Ala Eddine BEN SALEM. T.P. 2 Servlet

Ala Eddine BEN SALEM. T.P. 2 Servlet EPITA Ala Eddine BEN SALEM App-Ing2 J2EE T.P. 2 Servlet 1. Création d'un projet Web: A l'aide d'eclipse, créer un nouveau projet «sampleservlet» avec comme environnement d'exécution le serveur Tomcat installé

Plus en détail

Note explicative pour la réalisation des TPs avec le Serveur Web IIS 7

Note explicative pour la réalisation des TPs avec le Serveur Web IIS 7 Note explicative pour la réalisation des TPs avec le Serveur Web IIS 7 Installation du service IIS Fermer toutes les applications ouvertes (par précaution) Ouvrir le panneau de configuration, Programmes,

Plus en détail

DÉMARRAGE RAPIDE. Présentation et installation de NetStorage

DÉMARRAGE RAPIDE. Présentation et installation de NetStorage Novell NetStorage www.novell.com DÉMARRAGE RAPIDE Présentation et installation de NetStorage Novell NetStorage est une fonction de NetWare 6 qui permet d'accéder facilement, via Internet, au système de

Plus en détail

Cours n 1 : Informations de base.

Cours n 1 : Informations de base. Cours n 1 : Informations de base. Objectifs : Connaître les éléments de base du C#. Difficultés : Aucune, hormis beaucoup d éléments fondamentaux. Présentation : C# est une langage dit de "haut niveau".

Plus en détail

Trier les ventes (sales order) avec Vtiger CRM

Trier les ventes (sales order) avec Vtiger CRM Trier les ventes (sales order) avec Vtiger CRM Dans l'activité d'une entreprise, on peut avoir besoin d'un outil pour trier les ventes, ce afin de réaliser un certain nombre de statistiques sur ces ventes,

Plus en détail

Ecole Nationale Supérieure des Télécommunications Les outils XML

Ecole Nationale Supérieure des Télécommunications Les outils XML Ecole Nationale Supérieure des Télécommunications Les outils XML Page 1 sur 13 SOMMAIRE 1 Introduction 3 2 Parseur XML et processeur XSLT 4 2.1 Le Parseur XML v2 4 2.1.1 Les API DOM et SAX 4 2.1.2 Le parseur

Plus en détail

Tutoriel : Réaliser un site multilingues

Tutoriel : Réaliser un site multilingues Tutoriel : Réaliser un site multilingues INDEX : 1. Introduction 2. Détecter la langue 3. Gérer les langues avec PHP a. Usage de variables b. Traduction à la volée (passage de fonction) 4. Gérer les langues

Plus en détail

Gestion des documents associés

Gestion des documents associés Gestion des documents associés Gestion des documents associés 1 Introduction 1.1 1.2 Introduction 4 Principe des deux modes de gestion des documents 5 2 Les pièces jointes ArcGIS 2.1 2.2 2.3 2.4 2.5 2.6

Plus en détail

Procédures et fonctions

Procédures et fonctions Chapitre 5 Procédures et fonctions 5.1 Introduction Considérons le programme suivant, dont le but est d inverser les éléments d un tableau : public class InversionTableau1 { int t[]= {8, 2, 1, 23; Terminal.ecrireStringln("Tableau

Plus en détail

LES INJECTIONS SQL. Que20. 08 novembre 2015

LES INJECTIONS SQL. Que20. 08 novembre 2015 LES INJECTIONS SQL Que20 08 novembre 2015 Table des matières 1 Introduction 5 2 Qu est-ce qu une injection SQL? 7 3 Premier cas : injection SQL sur une chaîne de caractères 9 3.1 Comment s en protéger?..............................

Plus en détail

Sujet de veille technologique : Les langages de développement et leurs évolutions

Sujet de veille technologique : Les langages de développement et leurs évolutions 2014 Sujet de veille technologique : Les langages de développement et leurs évolutions Charly Rivière IIA SOMMAIRE : SOMMAIRE :... 0 1. Pourquoi ce sujet?... 2 2. Qu est-ce qu un langage de développement...

Plus en détail

GRAILS L'ARCHITECTURE GRAILS

GRAILS L'ARCHITECTURE GRAILS GRAILS L'ARCHITECTURE GRAILS Grails est un serveur d'application web basé sur le langage Groovy, et le framework Spring. Il est édité par la société : SpringSource. Une application Grails se décompose

Plus en détail

Fonctionnement du Site Web Dynamique:

Fonctionnement du Site Web Dynamique: Fonctionnement du Site Web Dynamique: Site Web Dynamique: Un site Web dynamique est en faite un site Web dont les pages qu'il contient peuvent être générées dynamiquement, c'est à dire à la demande de

Plus en détail

Introduction pratique au Développement orienté Modèle Pierre Parrend, Mars 2005

Introduction pratique au Développement orienté Modèle Pierre Parrend, Mars 2005 MDA : Un Tutoriel Introduction pratique au Développement orienté Modèle Pierre Parrend, Mars 2005 1 Sommaire Table des matières 1 Sommaire 1 2 Introduction 2 2.1 A qui s adresse ce tutoriel......................

Plus en détail

Personnaliser et adapter SPIP Développeur SPIP

Personnaliser et adapter SPIP Développeur SPIP Personnaliser et adapter SPIP Développeur SPIP En Théorie Le fonctionnement de SPIP Qu est ce que SPIP? SPIP (Système de Publication pour l Internet Partagé) est un logiciel libre destiné à la production

Plus en détail

ED : Construction d'interfaces graphiques en Java

ED : Construction d'interfaces graphiques en Java ED : Construction d'interfaces graphiques en Java Le but de cet exercice est d'écrire un code Java de la construction de l'interface graphique et de la réaction des actions de l'utilisateur sur une application

Plus en détail

Reporting Services et SharePoint

Reporting Services et SharePoint Reporting Services et SharePoint Utiliser SharePoint comme source de données Dans un précédent article, nous avons pu apprendre comment créer un rapport utilisant une source de données XML La question

Plus en détail

TP1. Outils Java Eléments de correction

TP1. Outils Java Eléments de correction c sep. 2008, v2.1 Java TP1. Outils Java Eléments de correction Sébastien Jean Le but de ce TP, sur une séance, est de se familiariser avec les outils de développement et de documentation Java fournis par

Plus en détail

Vtiger CRM - Prestashop Connector

Vtiger CRM - Prestashop Connector Vtiger CRM - Prestashop Connector Pour PRESTASHOP version 1.4.x Pour vtiger CRM version 5.1, 5.2.0 et 5.2.1 Introduction En tant que gestionnaire d'une boutique en ligne, vous cherchez constamment de meilleurs

Plus en détail

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting IUT Bordeaux 1 2005-2006 Département Informatique Licence Professionnelle ~ SI TD Objets distribués n 3 : Windows XP et Visual Studio.NET Introduction à.net Remoting Partie 1 : l'analyseur de performances

Plus en détail

Installation de Windows 2012 Serveur

Installation de Windows 2012 Serveur Installation de Windows 2012 Serveur Introduction Ce document n'explique pas les concepts, il se contente de décrire, avec copies d'écran, la méthode que j'utilise habituellement pour installer un Windows

Plus en détail

JVM. RMI - couche de référence. RMI - couche de transport TCP/IP

JVM. RMI - couche de référence. RMI - couche de transport TCP/IP Chapitre 9 Dans ce chapitre nous abordons le mécanisme RMI (Remote Method Invocation) permettant le développe ment des systèmes répartis. Nous expliquerons comment les classes d un serveur peuvent être

Plus en détail

Visual Studio.NET et Visual SourceSafe - PART 1. Visual Studio.NET et Visual SourceSafe

Visual Studio.NET et Visual SourceSafe - PART 1. Visual Studio.NET et Visual SourceSafe Visual Studio.NET et Visual SourceSafe - PART 1 Configuration de Microsoft Visual SourceSafe Comment gérer les sources de ses projets.net? Avec le développement de Solutions.NET et le travail en 'Extreme

Plus en détail

Programmer en JAVA. par Tama (tama@via.ecp.fr( tama@via.ecp.fr)

Programmer en JAVA. par Tama (tama@via.ecp.fr( tama@via.ecp.fr) Programmer en JAVA par Tama (tama@via.ecp.fr( tama@via.ecp.fr) Plan 1. Présentation de Java 2. Les bases du langage 3. Concepts avancés 4. Documentation 5. Index des mots-clés 6. Les erreurs fréquentes

Plus en détail

Installation du Serveur - Windows Server 2003

Installation du Serveur - Windows Server 2003 Installation du Serveur - Windows Server 2003 Nous allons commencer par l installation du serveur afin de remplir les conditions nécessaires et préparer celui-ci à l installation des services : Active

Plus en détail

Mise en place Active Directory / DHCP / DNS

Mise en place Active Directory / DHCP / DNS Mise en place Active Directory / DHCP / DNS Guillaume Genteuil Période : 2014 Contexte : L entreprise Diamond Info localisé en Martinique possède une cinquantaine de salariés. Basé sur une infrastructure

Plus en détail

SCOPIE 2007 (Pour Intégrer Elèves et profs depuis SCOnet)

SCOPIE 2007 (Pour Intégrer Elèves et profs depuis SCOnet) SCOPIE 2007 (Pour Intégrer Elèves et profs depuis SCOnet) Table des matièresscopie 2007 (Pour Intégrer les Elèves de SCOnet)...1 1. Récupération des données des élèves et des profs...1 1.1. Accès application

Plus en détail

Guide d'installation de Citrix EdgeSight pour test de charge. Citrix EdgeSight pour test de charge 3.8

Guide d'installation de Citrix EdgeSight pour test de charge. Citrix EdgeSight pour test de charge 3.8 Guide d'installation de Citrix EdgeSight pour test de charge Citrix EdgeSight pour test de charge 3.8 Copyright L'utilisation du produit documenté dans ce guide est soumise à l'acceptation préalable du

Plus en détail

Introduction aux exercices en Java

Introduction aux exercices en Java Introduction aux exercices en Java Avant de commencer les séries proprement dites, nous allons voir quelques informations utiles concernant le langage de programmation principal de ce cours d'informatique

Plus en détail

Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server

Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server Suite à mon précédent article concernant MSDE, je me suis rendu compte à partir des commentaires que de nombreux utilisateurs avaient des problèmes

Plus en détail