POO / IHM Architecture Logicielle

Slides:



Advertisements
Présentations similaires
Sintaks : Tentative de guide de mise en œuvre Michel Hassenforder.
Advertisements

Evénements Java Beans Java RMI
Gestion des événements (suite)
Introspection et Réflexion Manipulation dynamique de code Java.
Rainbow - Arcad Composition de composants et IHMs composites 23/05/2002 Jeremy Fierstone / Equipe Rainbow / 1.
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
POO3 Introduction aux IHM et à la réflexivité Java
1 Spécificités de linformatique ambiante De nombreux services Des services métiers (apparition et disparition de fonctionnalités) Des services pour gérer.
Conception et evaluation d’ IHM Pourquoi. Comment
Patrons Observateur/MVC programmation évènementielle
Android View, onClick, Activity, Modèle Vue Contrôleur
Page 1 Les applets Jacques Lonchamp. Page 2 Présentation Une applet est téléchargée à partir dune machine distante qui fournit le code. Ce chargement.
(Classes prédéfinies – API Java)
F. Voisin : Introduction à Java 1 Introduction à Java - les interfaces - Frédéric VOISIN FIIFO - « Remise à Niveau »
MIKHAYLOVA Vera Exposé Java principe de fonctionnement Lundi 17 mai 2004 DEUG 1ère année Science du langage Paris III.
Modèles d’architecture
POO / IHM Architecture Logicielle
Design Pattern MVC En PHP5.
Chap. 1 Structures séquentielles : listes linéaires
بسم الله الرحمن الرحيم. Institut Supérieure des Etudes Technologiques de Kébili.
Introduction aux Session Beans
Page de garde Introduction aux Design Patterns ISIA, Mars 2003
Pattern État PowerPoint 2003, télécharger la visionneuse PowerPoint Viewer dernière édition si vous ne lavez pas…télécharger la visionneuse PowerPoint.
JavaBeans Réalise par: EL KHADRAOUY TARIK AOUTIL SAFOWAN.
Vuibert Systèmes dinformation et management des organisations 6 e édition R. Reix – B. Fallery – M. Kalika – F. Rowe Chapitre 1 : La notion de système.
Concepts de base : la Classe Pour faire une comparaison simple, une classe serait a priori, une structure C avec des variables et des fonctions.
Écouteurs de click d'une fenêtre
Réalisée par :Samira RAHALI
Langage Oriente Objet Cours 4.
Java : Modèle / Vues / Contrôleurs
Chaque use-case génère un ou des scénarios, traduits par des diagrammes objets, qui permettent d’introduire et/ou de compléter les diagrammes des catégories.
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Classes abstraites et Interfaces
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 5 – Héritage, Interfaces et Listes génériques.
Retour sur MVC. POO3 Introduction aux IHM et à la réflexivité Java Vos premiers pas en Swing.
Behavioral Design Patterns The Observer Pattern Roberto Demontis Sylvain Giroux.
Introduction au paradigme orienté-objet (suite)
Programmation concurrente
COURS DE PROGRAMMATION ORIENTEE OBJET :
Android View, onClick, Activity, Modèle Vue Contrôleur
Adaptée du cours de Richard Grin
Patrons de conceptions de créations
Objectifs À la fin de ce cours, vous serez capables de :
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
Propriétés. Propriétés ► Les propriétés peuvent être visibles dans les environnements de scripts ► Les propriétés peuvent être accédées par programmation.
11/04/ L'héritage Cours 7 Cours 7.
Programmation objet La base.
Cours 7 Classes locales Clonage Divers: tableaux.
Le contenu est basé aux transparents du 7 ème édition de «Software Engineering» de Ian Sommerville«Software Engineering» de Ian Sommerville B.Shishedjiev.
Interfaces graphiques. Composants d'interface utilisateur graphique (GUI) 1 Bibliothèques Awt et Swing Procédures communes pour l'utilisation de ces clases.
14 La gestion d’événements
« Validation Formelle de Systèmes Interactifs »
Tutorat en bio-informatique
Les classes présenté par: RAHMOUNE RIME / ZEKRI SELMA.
Présentation du framework JSF (Java Server Faces) dans le modèle événementiel MVCII
Le polymorphisme.
Behavioral Design Patterns The Observer Pattern. Intention Définir une dépendance de “1” à “n” entre des objets de telle sorte que lorsque l’état d’un.
La programmation par objets Principes et concepts Etude de Smalltalk.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Héritage Conception par Objet et programmation Java
Iup MIAGe 3° année Projet MIAGe Toulouse – Groupe 21 Charte graphique.
Interfaces Graphiques
 1) Il faut connaître le modèle et son fonctionnement  2) Définir le contrôle que l’on veut faire ouvrir, fermer, afficher, etc.) sur le modèle  3)
Chapitre 2 Rappels objet et Présentation des diagrammes UML
IHM Modèle d’architecture et liens avec les outils de production d’interface IHM Dirrigé par : Catherine RECANATI Présenté par : Youssef OUDGHIRI YOUSFI.
Chapitre 2 Rappels objet et Présentation des diagrammes UML
Introduction à la Programmation Orientée Objet
Transcription de la présentation:

POO / IHM Architecture Logicielle AM Dery-Pinna et Audrey Occello

Architecture Logicielle et IHM : Pourquoi ? •Organiser le code (rangement) Simplifier (diviser régner) •Organiser le travail Modifier (une partie) •Ré-utiliser Notions : modularité, évolutivité, flexibilité Séparation possible –Code pour IHM –Code «Métier» •Exemple –IHM différente pour une Gestion d’un stock de chaussures ou de bibelots ? –Linux sous gnome ou kde, le système change-t-il ? •Objectif : éviter de tout modifier si on change la partie fonctionnelle ou la partie IHM

Un problème classique

Des architectures logicielles Système interactif utilisateur Tous les modèles partent du principe : un système interactif comporte une partie interface et une partie application pure Cette dernière est souvent appelée noyau fonctionnel. Le noyau fonctionnel est considéré comme préexistant, et les modèles de systèmes interactifs décrivent essentiellement la partie interface, ainsi que ses relations avec les objets du domaine. La plupart des modèles identifient au moins trois types d'éléments : un ``coté utilisateur'‘ (présentations), un ``côté noyau fonctionnel'‘ (interfaces du noyau fonctionnel, abstractions, modèles), et des éléments articulatoires (contrôleurs, adaptateurs). http://tel.archives-ouvertes.fr/docs/00/04/82/79/HTML/2_2modelesinterface_referen.html

Des architectures logicielles : modèles à couches Seeheim utilisateur NF Premier modèle (groupe de travail à Seeheim en 1985) - destiné au traitement lexical des entrées et sorties dans les interfaces textuelles – a servi de base à beaucoup d'autres modèles. À défaut de donner des indications précises sur la façon dont doit être structuré et implémenté un système interactif, les modèles linguistiques identifient les couches logiques qui doivent y apparaître. La présentation est la couche en contact direct avec les entrées et sorties. Elle interprète les actions de l'utilisateur (dispositifs physiques) et génère les sorties (affichage) au niveau lexical. Le contrôleur de dialogue gère le séquencement de l'interaction en entrée et en sortie. Il maintient un état lui permettant de gérer les modes d'interaction et les enchaînements d'écrans. L'interface du noyau fonctionnel est la couche adaptative entre le système interactif et le noyau fonctionnel. Elle convertit les entrées en appels du noyau fonctionnel et les données abstraites de l'application en des objets présentables à l'utilisateur.

Des architectures logicielles : modèles à couches objets de présentation objets du domaine Le modèle Arch [1992] 5 composants et 3 types de données objets d'interaction objets du domaine Arch utilisateur Composant d'interaction - ensemble des widgets (objets interactifs) + communications avec les périphériques physiques – Composant de présentation - représentation logique des widgets indépendante de la plate-forme. Contrôleur de dialogue - responsable du séquencement des tâches et du maintien de la consistance entre les vues multiples. Adaptateur du domaine - responsable des tâches dépendantes du domaine qui ne font pas partie du noyau fonctionnel mais qui sont nécessaires à sa manipulation par l'utilisateur. Noyau fonctionnel représente la partie non interactive de l'application. Le composant d'interaction et le noyau fonctionnel constituent les deux pieds de l'arche. Les autres composants décrivent la partie de l'interface qui doit être implémentée pour faire le lien entre la partie purement fonctionnelle d'une application et les widgets et les événements de la boîte à outils.

Des architectures logicielles : modèles à agents utilisateur Le modèle MVC (Modèle, Vue, Contrôleur) Smalltalk [Goldberg and Robson, 1981]. Chacun des trois composantes de la triade MVC est un objet à part entière. les systèmes interactifs = une hiérarchie d'agents mais la hiérarchie elle-même n’est pas explicite Un agent MVC = un modèle, une ou plusieurs vues, et un ou plusieurs contrôleurs Le modèle = noyau fonctionnel de l'agent. (entier, chaîne de caractères ou objets) Le modèle notifie les vues à chaque fois que son état est modifié par le noyau ou par ses contrôleurs. La vue = maintient une représentation du modèle pour l'utilisateur, mise à jour à chaque notification d'état. Le contrôleur reçoit et interprète les événements utilisateur, les répercutant sur le modèle (modification de son état) ou sur la vue (retour instantané).

Des architectures logicielles : modèles à agents Modèle à agents PAC [Coutaz, 1987] hiérarchie d'agents explicite Présentation = structure et comportement en entrée et en sortie de l'agent pour l'utilisateur (fusion des composants vue et contrôleur de MVC) Abstraction = la partie sémantique de l'agent (équivalent modèle de MVC) Contrôle = consistance entre la présentation et l'abstraction, navigation dans la hiérarchie Le composant contrôle n'a pas d'existence explicite dans le modèle MVC. utilisteur PAC PAC/Amodeus = Arch + Pac avec hiérarchie PAC dans le contrôleur le modèle PAC peut être appliqué à plusieurs niveaux d'un système interactif. Une application interactive peut ainsi être décrite comme une hiérarchie d'agents disposés sur plusieurs couches d'abstractions PAC

Zoom : Architecture MVC •Smalltalk[Goldberg et Robson1979-1983] –Model : modélisation (données et comportement) –View: représentation manipulable de l'objet –Control : interprétation des entrées V s’abonne à M C s’abonne à V C modifie M et V

Exemple code complet ici : http://www.oracle.com/technetwork/articles/javase/index-142890.html

1 modèle – Plusieurs vues code complet ici : http://www.oracle.com/technetwork/articles/javase/index-142890.html

Synchronisation entre la vue et le modèle Se fait par l’utilisation du pattern Observer. Permet de générer des événements lors d’une modification du modèle et d’indiquer à la vue qu’il faut se mettre à jour Observable = le modèle Observers = les vues 12

Rappel sur Observer Observable

Motivation Un effet de bord fréquent de la partition d’un système en une collection de classes coopérantes est la nécessité de maintenir la consistance entre les objets reliés entre eux. On ne veut pas obtenir la consistance en liant étroitement les classes, parce que cela aurait comme effet de réduire leur réutilisabilité.

Moyen lorsque l’état d’un objet change, Définir une dépendance de “1” à “n” entre des objets telle que lorsque l’état d’un objet change, tous ses dépendants sont informés et mis à jour automatiquement

Quand l’appliquer Lorsqu’une abstraction possède deux aspects dont l’un dépend de l’autre. L’encapsulation de ces aspects dans des objets séparés permet de les varier et de les réutiliser indépendamment. Exemple : Modèle-Vue-Contrôleur Lorsqu’une modification à un objet exige la modification des autres, et que l’on ne sait pas a priori combien d’objets devront être modifiés. Exemple : Support pour la communication “broadcast” Lorsqu’un objet devrait être capable d’informer les autres objets sans faire d’hypothèses sur ce que sont ces objets,

Besoin d’événements Le pattern “Observer” décrit comment établir les relations entre les objets dépendants. Les objets-clés sont la source Peut avoir n’importe quel nombre d’observateurs dépendants Tous les observateurs sont informés lorsque l’état de la source change l’observateur. Chaque observateur demande à la source son état afin de se synchroniser

Structure

Mise en œuvre MVC en Java

Implémentations Java du pattern METHODE 1 Des listeners : ajouter des listeners, notifier les listeners avec des événements, réagir aux événements METHODE 2 Une classe et une interface : class Observable {... } et interface Observer dans le package java.util Un objet Observable doit être une instance de la classe qui dérive de la classe Observable Un objet observer doit être instance d’une classe qui implémente l’interface Observer void update(Observable o, Object arg);

Exemple d’application de MVC Exemple assez simple d’une application qui permet de modifier un volume. Plusieurs vues pour représenter le volume et après toutes modifications, toutes les vues devront être synchronisées. Conseils : il est important de faire différents packages pour les différentes préoccupations 21

Le modèle : la base public class VolumeModel { private int volume; public VolumeModel(){ super(); volume = 0; } public int getVolume() { return volume; public void setVolume(int volume) { this.volume = volume; 22

Pour la notification Pour permettre la notification de changement de volume, on utilise des listeners On crée donc un nouveau listener (VolumeListener) et un nouvel événement (VolumeChangeEvent) 23

Le listener et l’event import java.util.EventListener; public interface VolumeListener extends EventListener { public void volumeChanged(VolumeChangedEvent event); } import java.util.EventObject; public class VolumeChangedEvent extends EventObject{ private int newVolume; public VolumeChangedEvent(Object source, int newVolume){ super(source); this.newVolume = newVolume; } public int getNewVolume(){ return newVolume; 24

Implémentation du système d’écouteurs dans le modèle (1/2) import javax.swing.event.EventListenerList; public class VolumeModel { private int volume; private EventListenerList listeners; public VolumeModel(){ this(0); } public VolumeModel(int volume){ super(); this.volume = volume; listeners = new EventListenerList(); public int getVolume() { return volume; public void setVolume(int volume) { this.volume = volume; fireVolumeChanged(); } 25

Implémentation du système d’écouteurs dans le modèle (2/2) public void addVolumeListener(VolumeListener listener){ listeners.add(VolumeListener.class, listener); } public void removeVolumeListener(VolumeListener l){ listeners.remove(VolumeListener.class, l); public void fireVolumeChanged(){ VolumeChangedEvent evt = new VolumeChangedEvent(this, getVolume()); VolumeListener[] listenerList = (VolumeListener[]) listeners.getListeners(VolumeListener.class); for(VolumeListener listener : listenerList){ listener.volumeChanged(evt); 26

Ce que l’on a maintenant Le modèle est maintenant capable d’avertir tous ses écouteurs à chaque changement de volume En fonction de l’application, il est possible d’imaginer plusieurs listeners par modèles et d’autres événements dans les listeners (par exemple quand le volume dépasse certains seuils) Remarque : le modèle peut devenir très vite conséquent 27

Les vues Nous supposons 3 vues (dans le cadre du cours, nous n’en montrerons qu’ une) : Une vue permettant de modifier le volume avec un champ de texte et valider par un bouton Une vue permettant de modifier le volume à l’aide d’une jauge et valider par un bouton Une vue listant les différents volumes Toutes ces vues sont représentées par une JFrame 28

Vue abstraite Pour éviter d’être dépendant d’une vue, on va créer une classe abstraite représentant une vue de volume public abstract class VolumeView implements VolumeListener{ private VolumeController controller = null; public final VolumeController getController(){ return controller; } public void setController(VolumeController c){ return controller=c; public abstract void display(); public abstract void close(); 29

JFrameField (1/3) import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.NumberFormat; import javax.swing.*; import javax.swing.text.DefaultFormatter; public class JFrameFieldVolume extends VolumeView implements ActionListener{ private JFrame frame = null; private JPanel contentPane = null; private JFormattedTextField field = null; private JButton button = null; private NumberFormat format = null; public JFrameFieldVolume() { this(0); } public JFrameFieldVolume(int volume){ buildFrame(volume); 30

JFrameField (3/3) @Override public void close() { frame.dispose(); } … @Override public void close() { frame.dispose(); } public void display() { frame.setVisible(true); public void volumeChanged(VolumeChangedEvent event) { field.setValue(event.getNewVolume()); public void actionPerformed(ActionEvent arg0) { getController().notifyVolumeChanged(Integer.parseInt(field.getValue().toString())); 31

Le Contrôleur Manipulera des objets de type View et non directement une vue spécifique Swing Un seul contrôleur sera créé dans un soucis de simplicité puisque les 3 vues ont le même type d’interaction avec l’utilisateur. Dans le cas de vues interagissant différemment, il est fortement conseillé d’utiliser plusieurs contrôleurs 32

Contrôleur (1/2) public class VolumeController { public VolumeView fieldView = null; public VolumeView spinnerView = null; public VolumeView listView = null; private VolumeModel model = null; public VolumeController (VolumeModel model, VolumeView fieldView, VolumeView spinnerView, VolumeView listView){ this.model = model; fieldView = fieldView; spinnerView = spinnerView; listView = listView; addListenersToModel(); } private void addListenersToModel() { model.addVolumeListener(fieldView); model.addVolumeListener(spinnerView); model.addVolumeListener(listView); 33

Contrôleur (2/2) public void displayViews(){ fieldView.display(); spinnerView.display(); listView.display(); } public void closeViews(){ fieldView.close(); spinnerView.close(); listView.close(); public void notifyVolumeChanged(int volume){ model.setVolume(volume); 34

Client public class Main { public static void main(String[] args) { VolumeModel model = new VolumeModel(); VolumeView fieldView = new JFrameFieldVolume(model.getVolume()); VolumeView spinnerView = new JFrameSpinnerVolume(model.getVolume()); VolumeView listView = new JFrameListVolume(model.getVolume()); VolumeController controller = new VolumeController(model, fieldView, spinnerView, listView); fieldView.setController(controller); spinnerView.setController(controller); listView.setController(controller); controller.displayViews(); } 35

Conclusion MVC permet de : Changer une couche sans altérer les autres. Par exemple remplacer Swing par une autre bibliothèque graphique java sans porter atteinte aux autres couches. Idem pour le modèle Synchroniser les vues. Toutes les vues qui montrent la même chose sont synchronisées 36

Mise en garde La mise en œuvre de MVC dans une application n’est pas une tâche aisée : Introduit un niveau de complexité assez élevée Implique une bonne conception dès le départ Peut prendre du temps au développement En faire gagner lors de l’évolution de l’application Conseillée pour les moyennes et grandes applications amenées à être maintenues, étendues et pérennes 37

Vous avez compris MVC ? Un exemple simple

L’exemple du login 2 vues parmi d’autres IHM en Anglais IHM en français

Un modèle 3 variables d’instances Des méthodes log, password, check logCheck passwordCheck connect

Cas d’interaction Cas no 1 le bouton Log in implique la vérification login et password à partir des données saisies. Les données peuvent être modifiées jusqu’au moment de l’utilisation du bouton Action : connexion ou un message d’erreur

Cas d’interaction Cas no 2 le bouton Log in implique la vérification login password à partir des données saisies. Les données peuvent être modifiées jusqu’au moment de leur validation par un retour charriot Actions : connexion ou un message d’erreur Les champs de saisie sont bloqués après retour charriot

Cas d’interaction Cas no 3 : La saisie des données est validée au premier retour chariot Actions : vérification des données faite au fur et à mesure pour le login puis pour le password ce qui peut entrainer un message d’erreur connexion au moment par click sur le bouton

Questions Avez-vous d’autres exemples d’interactions ? Un autre modèle pourrait-il être implémenté ? Avez-vous d’autres exemples d’IHM (Vues) ? Quelle est la différence entre vue et interaction ? Quid de IHM ?

Questions Plusieurs IHM (Vues) peuvent elles interagir de la même façon ? Plusieurs IHM (Vues) peuvent elles interagir différemment ? Peut on changer la façon d’interagir sans modifier une vue (ou le modèle) ? Peut on changer de modèle sans modifier la vue (ou le modèle) ?