Génie logiciel
Grégory Bonnet
GREYC - Université de Caen Basse-Normandie
2014 - 2015
Programmation événementielle
Qu’est-ce que la programmation événementielle ?
Programmation séquentielle Paradigme de programmation dans lequel le déroulement des instructions du programme est toujours le même bien que les instructions elles-mêmes peuvent changer en fonction des embranchements.
Exemple Calculer les n premiers termes de la suite de Fibonacci.
Programmation événementielle Paradigme de programmation dans lequel le programme est principalement défini par ses réactions face à différents événements qui peuvent se produire.
Exemple Traitement de prise en charge d’une interface homme-machine.
Qu’est-ce qu’un événement ?
Un événement n’est pas un message
Message : appel d’une méthode particulière d’un objet particulier
Événement : signal envoyé dans l’environnement indépendamment des objets
Qui génèrent les événements ?
◮ les actions des utilisateurs (saisie au clavier ou clics de souris)
◮ le systèmes (tics d’horlogie)
◮ les objets (notifications)
Un événement est capté par les objets abonnés à ce type d’événement
Quelques exemples d’événements
Enfoncer les touches du clavier Une frappe sur le clavier génère un événement clavier contenant le code de la touche enfoncée.
Gestion de la souris Un utilisateur qui bouge ou clique avec la souris génère un événement souris contenant les coordonnées courantes de la souris et le bouton qui a été cliqué.
Actions sur un composant graphique Un composant graphique sur lequel un utilisateur clique génère un événement action auxquel l’application réagit en appellant le traitement associé au composant graphique.
Exception Un processus indépendant dont un opération produit une erreur peut avertir le reste de l’application en générant un événement exception.
Principes fondamentaux de programmation événementielle
Contenu d’un événement Un événement contient toutes les informations qui concernent l’action correspondante
◮ son type
◮ son émetteur
◮ des données (position d’un clic de souris par exemple)
Traitement des événements
◮ les composants interagissent entre eux et avec l’environnement
◮ les événements sont placés dans une file d’événements
◮ la boucle de gestion de l’environnement les transmet à un à un à des écouteurs
◮ les composants associés aux écouteurs agissent en réponse aux événements
Un exemple
Un programme avec une interface graphique
◮ un objet « interface graphique » composé d’objets « bouton »
◮ des écouteurs sont associés aux boutons
◮ le programme en boucle infinie attend des événements
◮ les écouteurs capturent les événements et lancent les traitements
Fonctionnement sous-jacent
◮ action de l’utilisateur sur l’interface graphique
◮ interruption matérielle
◮ récupération de l’interruption par le système
◮ construction de l’événement par le système
Publicité
◮ envoi d’un message contenant l’événement à l’application
◮ l’application réagit à l’événement ou non
Architecture Modèle - Vue - Contrôleur
Architecture d’une application munie d’une ou plusieurs interfaces utilisateur
◮ trois composants
◮ données et traitements, entrées et sorties et de la gestion des événements
◮ utilisée dans la conception de clients / serveurs et d’interfaces graphiques
Généralisation du motif observateur / observé
◮ les objets applicatifs (modèle)
◮ leurs représentations (vue)
◮ leurs interactions (contrôleur)
Pourquoi une nouvelle architure ?
Avantages
◮ patron de conception à part entière
◮ paradigme architectural
◮ découplage fort
◮ multiplicité des vues
◮ changement aisé d’interfaces
Inconvénients
◮ complexité de modélisation accrue
◮ dépendance forte de la vue et du contrôleur envers le modèle
◮ possibilité de mises à jours excessives
Écouteurs & notifications
Écouteur d’événement
◮ objet réagissant à un type d’événement particulier
◮ objet associé à un autre objet
◮ l’écouteur exécute une méthode à chaque fois qu’il reçoit un événement de ce type
Source
Écouteur
+ générer() : Événement
+ reagir(a : Événement)
Événement
De l’événement à la notification
L’implantation des événements passe généralement par la notification
◮ une notification est un signal envoyé par un objet à un ou plusieurs autres
◮ les destinataires sont des objets abonnés à la notification auprès de l’émetteur
◮ modèle publication / abonnement ou publish / subscribe
Les notifications peuvent porter des informations
◮ son type
◮ son émetteur
◮ état ou changement d’état de l’émetteur
◮ des données supplémentaires
Motif Observateur / Observé
◮ implantation à l’aide d’un motif observateur / observé
◮ un objet notifie ses observateurs lorsqu’il a changé
Publicité
◮ la réception d’une notification est un événement
« abstract » Observable
+ ajouter(Observateur) + supprimer(Observateur) + notifier()
« interface » Observateur
+ miseajour()
ClasseObservee
Observateur1
Processus d’attente
◮ un objet est un processus contrôlé par une méthode principale
◮ la méthode possède des points d’arrêts qui mettent le processus en sommeil
◮ la réception d’une notification réveille le processus qui réagit
Thread
+ run()
Événement
ObjetContrôlé
+ run()
Modèle - Vue - Contrôleur
Généralités
Côté applicatif : le modèle contient la logique de l’application
Côté visuel : les vues affichent à l’utilisateur des informations sur le modèle
Côté événementiel : le contrôleur agit à la demande de l’utilisateur sur le modèle
Utilisateur
est perçue par
utilise
Vue
agit sur
Contrôleur
met à jour
manipule
Modèle
Modèle
Cœur de l’application
◮ n’importe quelle classe ou quel paquetage
◮ indépendant de l’affichage et de la modification de ses données
◮ fournit des méthodes d’accès et de modification pour les données
Interactions
◮ le modèle peut être modifié sur ordre du contrôleur
◮ le modèle signale aux vues tout changement de contenu (événement)
◮ le modèle ignore comment il est affiché et qui lui a notifié un changement d’état
Vue
Interface avec l’utilisateur
◮ affiche les données et capte les actions de l’utilisateur ◮ ces actions sont transmises au contrôleur associé à la vue (événement) ◮ la vue et le modèle sont dans une relation observateur / observé ◮ le contrôleur joue un rôle d’écouteur pour les événements captés par la vue.
La vue se met à jour dès qu’elle reçoit un ordre de notification
1. du contrôleur 2. du modèle (elle le consulte alors pour se réafficher de manière adéquate)
Plusieurs vues pour même modèle ?
Publicité
◮ chaque vue est en général associée à un et un seul contrôleur
◮ une vue peut permettre à l’utilisateur de changer de vue
◮ une vue peut obtenir une vue supplémentaire sur le même modèle
◮ la vue instancie généralement son contrôleur,
Contrôleur
Écouteur de l’interface utilisateur
◮ le contrôleur reçoit des notifications de la vue
◮ il manipule alors le modèle en utilisant ses méthodes si besoin
◮ le modèle notifie en réponses les vues
◮ le contrôleur notifie la vue s’il n’est pas besoin de modifier le modèle
Le contrôleur reçoit les événements de l’interface utilisateur et les traduit
1. en changement dans la vue s’ils agisssent sur le côté visuel
Exemple : un clic sur la barre de défilement de la fenêtre graphique.
2. en changement dans le modèle s’ils agissent sur le contenu du modèle
Exemple : Une modification de la valeur d’un tableau affiché dans la fenêtre graphique
Présentation générale des interactions
Modèle
1. le modèle ne connaît ni les vues, ni les contrôleurs
2. ces deux éléments sont des observateurs par rapport au modèle
Vue
1. chaque vue est associée à un contrôleur qu’elle instancie
2. chaque vue est associée au modèle dont elle consulte et présente les données
Contrôleur
1. chaque contrôleur est associé à une vue dont il écoute les événements
2. chaque contrôleur connaît le modèle qu’il modifie en réponse à ses événements
Modèle UML de l’architecture MVC
Observé
Vue1
Observateur
Modèle
Contrôleur1
Observateur
Vue2
Observateur
Contrôleur2
Observateur
Conclusion
Conclusion
La programmation événementielle est un paradigme à part entière
◮ pas d’exécution linéaire du programme ◮ les objets génèrent des événements et réagissent à ces derniers ◮ très utile pour le développement d’interfaces graphiques ◮ implantation : modèle observateur / observé et processus d’attente
Une architecture événementielle
◮ la représentation logique d’une application (modèle) ◮ la représentation visuelle qu’on en donne (vue) ◮ les actions que l’utilisateur effectue (contrôleur)
Développement et maintenance simplifiés
◮ modularité dans la conception ◮ vue et contrôleur peuvent être développés indépendamment du modèle ◮ meilleure répartition des tâches entre développeurs (métiers ou ergonomie)