Architecture des applications



Documents pareils
Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Une introduction à la technologie EJB (2/3)

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

Alfstore workflow framework Spécification technique

Auto-évaluation Programmation en Java

Programmation par composants (1/3) Programmation par composants (2/3)

Application web de gestion de comptes en banques

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

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.

Information utiles. webpage : Google+ : digiusto/

Mise en œuvre des serveurs d application

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

Programmer en JAVA. par Tama

Programmation MacOSX / ios

Création d une application JEE

Web Tier : déploiement de servlets

TP1 : Initiation à Java et Eclipse

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

La base de données XML exist. A. Belaïd

Architecture Orientée Service, JSON et API REST

Projet de programmation (IK3) : TP n 1 Correction

Les frameworks au coeur des applications web

2 Chapitre 1 Introduction

Compte Rendu d intégration d application

Projet gestion d'objets dupliqués

OpenPaaS Le réseau social d'entreprise

Premiers Pas en Programmation Objet : les Classes et les Objets

Gestion distribuée (par sockets) de banque en Java

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Composants Logiciels. Le modèle de composant de CORBA. Plan

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Plateforme PAYZEN. Définition de Web-services

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

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

Dis papa, c est quoi un bus logiciel réparti?

Reporting Services - Administration

Java Naming and Directory Interface

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

OCL - Object Constraint Language

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Chapitre VI- La validation de la composition.

Cours 1: Java et les objets

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Cours en ligne Développement Java pour le web

Bases Java - Eclipse / Netbeans

Génie Logiciel avec Ada. 4 février 2013

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

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

RMI le langage Java XII-1 JMF

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

basée sur le cours de Bertrand Legal, maître de conférences à l ENSEIRB Olivier Augereau Formation UML

24/11/2011. Cours EJB/J2EE Copyright Michel Buffa. Plan du cours. EJB : les fondamentaux. Enterprise Java Bean. Enterprise Java Bean.

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

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

Apache Camel. Entreprise Integration Patterns. Raphaël Delaporte BreizhJUG

WEBSERVICES. Michael Fortier. Master Informatique 2ème année. A308, Université de Paris 13

Catalogue des formations Edition 2015

Héritage presque multiple en Java (1/2)

TD/TP PAC - Programmation n 3

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

Définition des Webservices Ordre de paiement par . Version 1.0

Remote Method Invocation (RMI)

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Projet Active Object

Auto-évaluation Aperçu de l architecture Java EE

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Paginer les données côté serveur, mettre en cache côté client

CQP Développeur Nouvelles Technologies (DNT)

Cours Master Recherche RI 7 Extraction et Intégration d'information du Web «Services Web»

4. Groupement d objets

Générer du code à partir d une description de haut niveau

Programmation Par Objets

Projet de Java Enterprise Edition

Création d un service web avec NetBeans 5.5 et SJAS 9

GOL502 Industries de services

Devenez un véritable développeur web en 3 mois!

Cedric Dumoulin (C) The Java EE 7 Tutorial

Design patterns. Design patterns - définition. Design patterns - avantages

Architecture JEE. Objectifs attendus. Serveurs d applications JEE. Architectures JEE Normes JEE. Systèmes distribués

Refonte front-office / back-office - Architecture & Conception -

Meta Object Facility. Plan

Introduction aux «Services Web»

D une part, elles ne peuvent faire table rase de la richesse contenue dans leur système d information.

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Business Process Execution Language

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Avertissement : ceci est un corrigé indicatif qui n engage que son auteur

Université de Bangui. Modélisons en UML

A DESTINATION DES SERVICES TIERS. Editeurs d applications et ressources pédagogiques connectées à l ENT

Débuter avec EXPRESS. Alain Plantec. 1 Schema 2

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

Vérifier la qualité de vos applications logicielle de manière continue

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Remote Method Invocation en Java (RMI)

Supervision et infrastructure - Accès aux applications JAVA. Document FAQ. Page: 1 / 9 Dernière mise à jour: 15/04/12 16:14

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

Transcription:

Architecture des applications Table des matières 1 Introduction 1 2 Les classes valeurs 2 2.1 Les Javaeans............................................. 2 2.2 Les différents types de Javaeans................................... 3 2.3 Où sont les traitements?....................................... 3 3 Les classes de service 4 3.1 Les services d accès aux données................................... 5 3.2 Les contrôleurs............................................. 5 3.3 Les vues................................................ 6 3.4 Les services métier........................................... 6 3.5 Les types de services.......................................... 6 4 Spécification d un service 7 4.1 Gestion des erreurs.......................................... 7 4.2 Les données manipulées........................................ 7 4.3 Un service pour les données...................................... 8 5 L implantation d un service 8 5.1 Factoriser l implantation........................................ 9 5.2 Le code d implantation........................................ 9 5.3 Un Javaean pour l implantation................................... 10 5.4 Les singletons............................................. 10 5.5 Tests unitaires............................................. 11 6 Injection de dépendances 11 6.1 Composant logiciel.......................................... 12 6.2 Inversion de contrôle......................................... 12 6.3 Paralléliser le développement..................................... 13 1 Introduction Une application c est des données (le modèle), des traitements (couches logicielles ou services), un intégrateur (point de démarrage) ou un environnement d exécution (serveur d applications). 1

2 Les classes valeurs Objectif : représenter les données manipulées par l application sans référence aux traitements. La définition des classes valeurs peut être obtenue par une phase de conception UML (diagramme de classes) ou par une méthode d analyse des données (modèle conceptuel des données). L écriture de ces classes peut être prise en charge par des outils automatiques (à partir de schémas UML, relationnels ou XML). 2.1 Les Javaeans En Java, les classes valeurs sont représentées par des Javaeans. Un Javaean est une classe qui respecte les contraintes suivantes : Chaque classe décrit une entité (les voitures, les commandes, les personnes, etc.). C est la notion de table en relationnel. Chaque instance décrit une entité particulière (une voiture, une commande, une personne, etc.). C est une ligne d une table. Une entité particulière est entièrement décrite par les propriétés de la classe (poids, nom, volume, couleur, propriétaire, etc.) deux méthodes publiques et optionnelles sont associées à chaque propriété : l une pour l accès (appelée getter) et l autre pour la modification (appelée setter). Il existe un constructeur publique sans argument. Plus d information sur les javaeans 1. Un exemple de Javaean : package fr.sample.beans; import java.util.set; public class Person { // properties private String name; private boolean student; private Set<Person> friends; // constructor public Person() { // getters public String getname() { return name; public boolean isstudent() { return student; public Set<Person> getfriends() { return friends; // setters public void setname(string name) { this.name = name; public void setstudent(boolean student) { this.student = student; public void setfriends(set<person> friends) { this.friends = friends; Vous pouvez noter la construction normalisée des noms de méthodes et l utilisation du changement de casse pour construire les identificateurs. Il faut également noter la forme particulière des getters quand la propriété est un booléen. Dernières remarques : 1. http://h.garreta.free.fr/ 2

Pour les collections, les interfaces sont à privilégier. L accès aux propriétés passe obligatoirement par les méthodes (l implantation est donc forcément privée). Les méthodes fixent le nom des propriétés (l anglais est à favoriser). Les environnements de développement offrent toujours des facilités pour rédiger les Javaeans. 2.2 Les différents types de Javaeans Suivant le contexte, nous pouvons avoir plusieurs Javaeans pour représenter une donnée : eans interface Nom : Age : Rue : Ville : Lecture class Form { String nom; String age; String rue; String ville; eans métier Table «personne» Table «adresse» Stockage class Personne { String nom; int age; Adresse adr; class Adresse { String rue; String ville; Validation 2.3 Où sont les traitements? Un exemple : comment implanter une méthode de sauvegarde? public class Person { public void save() { Pour implanter cette méthode nous devons avoir des informations sur la nature (DR, XML, etc.). et les paramètres (login, mot de passe, etc.) du système de persistance. Ces informations ne peuvent pas être représentées par une propriété du bean Person : - ce ne sont pas des données de l application, - ils seraient dupliquées dans chaque instance, Nous devons donc ajouter un paramètre à cette méthode : 3

public class Person { public void save(jdcparameters where) { Le paramètre where est obligatoire car il indique où effectuer la sauvegarde (classe JDCParameters ). Cette approche pose d autres problèmes : La définition du bean est polluée par des considérations techniques. Nous nous éloignons de l objectif des classes valeurs (représentation des données). La méthode de persistance est dupliquée dans chaque bean (très difficile à changer). Il est délicat d offrir plusieurs méthodes de sauvegarde. Nous avons créé une dépendance artificielle entre une donnée et sa manipulation. Nouveaux objectifs : - supprimer les dépendances entre données et traitements, - rassembler les traitements éparpillés, Solution : il faut ranger le code technique de sauvegarde dans une classe spécialisée qui va se charger de la sauvegarde de tous les beans : public class JDCStorage { public void save(person p) { Il peut exister plusieurs versions de cette classe ( JDCStorage, FileStorage, XmlStorage ) qui rendent le même service mais de manière différente. public class JDCStorage implements Storage { public class FileStorage implements Storage { Ces implantations partagent la même interface ou peuvent hériter de la même classe abstraite. Le partage d interfaces est une solution préférable. Nous venons de définir les classes de service. 3 Les classes de service Un service logiciel c est une spécification (en Java elle se traduit par une ou plusieurs interfaces), une ou plusieurs implantations (réalisées par une ou plusieurs classes de service qui agissent sur les données). 4

Les utilisateurs d un service travaillent à partir de la spécification (interface) et ignorent les détails de l implantation sous-jacente. Le rôle de la couche d intégration est de faire le lien entre les utilisateurs d une spécification et une implantation particulière. Une application doit être concue comme un ensemble de services construits les uns à partir des autres en vue de répondre aux spécifications détaillées. Javaeans Utilisateur A D SGDR C C Les services sont développés indépendamment et la couche d intégration va faire le lien entre A/C, A/D, /D, C/ et C/D. On peut classer les services en fonction de leur rôle. 3.1 Les services d accès aux données Javaeans A DAO SGDR Une couche DAO (Data Access Object) offrent plusieurs services : - centralisation des accès aux données, - simplification de l accès aux données, - abstraction du support de stockage, - travail sur les entités principales, 3.2 Les contrôleurs Application A Requêtes clientes Contrôleur 5

Un contrôleur assure : - l implantation du protocole d entrée, - le traitement et la validation des requêtes clientes, - l appel aux couches internes. Un contrôleur est un point d entrée d une couche logicielle. 3.3 Les vues Application Requêtes clientes Contrôleur A Réponses clientes Vues Les vues assurent : - l implantation du protocole de sortie, - la construction des résultats à partir des données, - l envoi de ces résultats. 3.4 Les services métier Contrôleur Vues Métier Métier A DAO Les services métier assurent les opérations de traitement des données métier. Caractéristiques : Ils sont indépendants d une source de données. Ils sont indépendants de la logique applicative (suite de requêtes clientes). Ils sont réutilisables. 3.5 Les types de services Les services peuvent : offrir des fonctions spécialisées (DAO, contrôleur, métier, etc.), simplifier un service trop complexe (facade), enrichir les fonctions d un service existant (decorator), rechercher un service (locator), se charger de l accès à un service (proxy), construire un service particulier (factory). 6

4 Spécification d un service Une spécification décrit «ce qui est fait» sans préciser «comment le faire». En Java, elle est exprimée par une ou plusieurs interfaces : package fr.sample.services.mailer; public interface IMailer { void sendmail(string subject, String body, String from, String to, String cc); Les interfaces d un service sont rangées dans un paquetage particulier. Ce n est peut-être pas la même personne qui va développer l interface et son implantation. 4.1 Gestion des erreurs Les erreurs émises ne doivent pas dévoiler les choix d implantation. package fr.sample.services.mailer; public interface IMailer { void sendmail(string subject, String body, String from, String to, String cc) throws MailerException; Pour éviter cette fuite d information, le paquetage doit regrouper l interface et la définition des exceptions du service : package fr.sample.services.mailer : IMailer.class MailerException.class 4.2 Les données manipulées Une spécification peut utiliser et définir les classes valeurs dont elle a besoin : package fr.sample.services.mailer; public interface IMailer { void sendmail(mail mail) throws MailerException; Le paquetage regroupe maintenant les interfaces, les javaeans et les exceptions. C est le cas le plus général. 7

package fr.sample.services.mailer : IMailer.class MailerException.class Mail.class 4.3 Un service pour les données La définition des données peut être vue comme un service. Le paquetage contient les Javaeans (classes) sans interface ni exception. On peut également définir les données par des interfaces : package fr.sample.service.values; import java.util.collection; public interface IPerson { // getters String getname(); boolean isstudent(); Collection<IPerson> getfriends(); // setters void setname(string name); void setstudent(boolean student); void setfriends(collection<iperson> friends); Dans ce cas, il faut également fournir un service de création des instances des Javaeans qui respectent l interface : package fr.sample.service.values; public interface IPersonFactory { IPerson newperson(); Nous obtenons une indépendance complète entre la définition des données, leur implantation et leur utilisation. 5 L implantation d un service Les classes d implantation doivent : respecter la lettre et l esprit de la spécification, regrouper les ressources dans un paquetage d implantation, offrir un moyen souple pour paramétrer leur fonctionnement, interagir avec son environnement. Attention : il est difficile d avoir plusieurs implantations interchangeables. Cet objectif est néanmoins important car il permet de découpler client et fournisseur de service et donc - de diminuer la complexité globale, - d améliorer la réutilisabilité du code d implantation. 8

5.1 Factoriser l implantation Si nous offrons plusieurs implantations d un même service, il est probable que certaines méthodes puissent partager leur définition. Pour ce faire, nous devons définir une classe d implantation abstraite qui va regrouper ce code commum : package fr.sample.imp.mailer; import fr.sample.services.mailer.imailer; import fr.sample.services.mailer.mail; import fr.sample.services.mailer.mailerexception; public abstract class AbstractMailer implements IMailer { protected void checkmail(mail m) throws MailerException { // check addresses, body and destination autres méthodes implantées 5.2 Le code d implantation Une première solution consiste à créer une classe d implantation dont le constructeur permet de récupérer les paramètres de fonctionnement : package fr.sample.imp.mailer; import fr.sample.services.mailer.*; public class SmtpMailer extends AbstractMailer implements IMailer { // SMTP server name final private String host; public SmtpMailer(String host) { super(); if (host == null) throw new NullPointerException(); this.host = host; public void sendmail(mail mailtosend) throws MailerException { checkmail(mailtosend); // send mail to the SMTP server son utilisation est simple : IMailer mailer = new SmtpMailer("mail.dil.univ-mrs.fr"); mailer.sendmail(mail); Mais 9

- les paramètres ne peuvent pas être changés, - ce service n est pas recyclable, - il est difficile de prévoir des valeurs par défaut, - si le nombre de paramètres est important, le constructeur est délicat à appeler. 5.3 Un Javaean pour l implantation Nous allons utiliser les getters et les setters pour gérer les paramètres et nous introduisons deux nouvelles méthodes d initialisation et de clôture. package fr.sample.imp.mailer; import fr.sample.services.mailer.*; public class JavaeanSmtpMailer extends AbstractMailer implements IMailer { // SMTP server name private String host = "localhost"; // getter and setter for parameters public String gethost() { return host; public void sethost(string host) { this.host = host; // initialize service and ressources public void init() { if (host == null) throw new IllegalStateException("no SMTP host"); // close service and ressources public void close() { public void sendmail(mail mailtosend) throws MailerException { son utilisation est un peu moins simple : JavaeanSmtpMailer mailer = new JavaeanSmtpMailer(); mailer.sethost("mail.dil.univ-mrs.fr"); mailer.init(); mailer.sendmail(mail); mailer.close(); Mais les paramètres peuvent être changés (il faut ensuite appeler init ), le service est totalement recyclable (plusieurs phases de paramétrage, init et close ), les valeurs par défaut sont possibles (par exemple localhost ). la partie initialisation qui est un peu moins simple n est réalisée qu une seule fois. C est le rôle du code d intégration. 5.4 Les singletons De nombreux services sont souvent implémentés par des singletons c est-à-dire des classes à instance unique. Dans un environnement Multi-Threads, il est primordial de prévoir des sections critiques qui protègent les ressources critiques (ressources extérieures ou propriétés de la classe d implantation). 10

Une autre solution consiste à créer une instance par client. Dans cette optique, il est nécessaire de mettre en place un service de création des instances (factory) qui lui, est un singleton. Si le service ne gère pas le multi-threading, c est le client qui doit le prévoir. Attention : les classes façades peuvent masquer le service réel et donc rendre inefficace les clauses synchronized. 5.5 Tests unitaires Une fois les services spécifiés, nous pouvons prévoir une campagne de tests. Cette étape de tests unitaires permet de vérifier - qu une implantation répond bien aux spécifications, - que deux implantations sont bien équivalentes, - la non-régression en cas de modification. La recherche d erreur est facilitée par le fait que les couches sont clairement isolées. Conseil 1 : les jeux de tests doivent être rédigés avant l implantation. Conseil 2 : Testez un service à chaque étape de son développement. Dans un deuxième temps, ces tests unitaires doivent être complétés par des tests d intégration. 6 Injection de dépendances Ce principe traite le délicat problème de la communication et de la dépendance entre service logiciel. Imaginons que nous ayons un service d envoi de mail par un utilisateur authentifié. L implantation de ce service nécessite le service Mailer. public class AuthMailer implements IAuthMailer { // a mailer JavaeanSmtpMailer mailer = new JavaeanSmtpMailer(); // init service public void init() { mailer.sethost("mail.dil.univ-mrs.fr"); mailer.init(); Dans cette version nous introduisons un dépendance involontaire avec une implantation particulière de IMailer et le nom du serveur de mail n est pas correctement paramétré. Pour régler ce problème, nous allons - remplacer l utilisation de JavaeanSmtpMailer par l interface IMailer, - traiter le mailer comme un paramètre, - préparer le mailer à l extérieur. Le code devient 11

public class AuthMailer implements IAuthMailer { // mailer parameter IMailer mailer; // init service public void init() { if (mailer == null) throw new IllegalStateException("no mailer"); // setter and getter public IMailer getmailer() { public void setmailer(imailer mailer) { Le code d intégration (programme principal) devient : // a SMTP mailer JavaeanSmtpMailer mailer = new JavaeanSmtpMailer(); mailer.sethost("mail.dil.univ-mrs.fr"); mailer.init(); // mailer for users AuthMailer am = new AuthMailer(); am.setmailer(mailer); am.init(); use am am.close(); mailer.close(); Nous pouvons changer la stratégie d envoi des mails sans modifier la couche AuthMailer. La partie intégration injecte dans le service utilisateur la référence vers le service utilisé. Initialiser une application revient à - créer les services logiciels, - injecter les dépendances et - appeler les méthodes d initialisation (callback). 6.1 Composant logiciel Nous venons de définir la notion de composant logiciel : C est une brique de base réutilisable. Les interfaces d entrée et de sortie sont clairement définies. Ce composant est déployé dans un environement (via le code d intégration, EJ, Spring, RMI, Servlet, Test JUnit). La création, la vie et l arrêt de ce composant correspondent à des évènements générés par l environnement et envoyés au composant via des callback (utilisation des annotations Java). 6.2 Inversion de contrôle L injection des dépendances peut aussi être vu comme une inversion de contrôle : 12

C utilise utilise A Sans injection de dépendances C A Cycle de développement : A, puis C implante I A implante IA Avec injection de dépendances C I IA A Cycle de développement : C, puis A Dans la deuxième approche nous décomposons un problème complexe (C) en problèmes plus simples ( puis A). 6.3 Paralléliser le développement Nous pouvons même paralléliser le développement des couches en prévoyant une implantation vide de chaque spécification (bouchon) et en suivant les étapes ci-dessous : - réaliser une implantation (par exemple de ), - lui fournir le bouchon A par injection de dépendances, - valider l implantation de. Nous devrons ensuite réaliser un test d intégration. Note : Cette démarche correspond bien aux méthodes agiles qui sont dirigées par les tests et qui préconisent une première implantation simple et juste puis une série d améliorations. 13