~ / TIS3 / AL / tps / notification /
© 2015 - Renaud Blanch
Le but de ce TP est de mettre en pratique les principes d'architectures vus en cours : la séparation du noyau fonctionnel et de l'interface, l'indépendance du noyau fonctionnel, et le service de notification par le noyau fonctionnel pour permettre l'interaction en respectant les deux premiers principes.
Vous allez partir d'une application minimale fournie qui affiche dans une fenêtre la valeur d'un paramètre qui varie aléatoirement au cours du temps (dans un cas réel, il pourrait s'agir d'une grandeur physique mesurée par un capteur). Cette application ne respecte pas les principes désirés, il va donc s'agir de l'améliorer pas à pas.
Récupérez l'archive des sources de l'application et décompressez-la.
Créez un nouveau projet nommé Notifier
à partir de ces sources (New Java Project with Existing Sources) en ajoutant le répertoire téléchargé notifier.src
à ce projet.
Exécutez ce projet en choisissant comme classe principale notifier.MainWindow
et vérifiez que :
1) dans la fenêtre de sortie (output en bas de NetBeans) des valeurs sont affichées ; et
2) une petite fenêtre s'ouvre et affiche ces mêmes valeurs en même temps.
Lisez les deux fichiers sources, MainWindow.java
et Variable.java
et vérifiez que vous comprenez ce qu'ils font.
Quelle classe fait partie du noyau fonctionnel et quelle classe fait partie de l'interface utilisateur ?
Séparez ces classes en deux paquets, notification.fc
(pour functional core) et notification.ui
(pour user interface) sans vous soucier des dépendances pour l'instant.
Supprimez maintenant la dépendance du noyau fonctionnel envers l'interface en ajoutant une boucle sans fin à la méthode main
de la classe MainWindow
qui va chercher la valeur de la variable pour mettre à jour l'affichage.
Vérifiez à l'aide du profiler (Profile > Profile Project) que cette "solution" consomme 100% du temps processeur.
Corrigez ce problème en ajoutant un délais d'une seconde (Thread.sleep(1000)
) à chaque tour de boucle.
Vérifiez maintenant que cette solution affiche les valeurs avec du retard.
Ajoutez maintenant un mécanisme de notification pour garder l'indépendance du noyau fonctionnel tout en permettant une mise à jour instantanée de l'interface.
Pour cela, ajoutez au noyau fonctionnel une interface Callback
qui contiendra une unique méthode :
public interface Callback { public void valueChange(double value); }Ajoutez à la classe
Variable
une liste callbacks
d'instance de la classe Callback
, une méthode d'abonnement :
public void addCallback(Callback callback) { ... }et la notification aux abonnés dès que la valeur de la variable est modifiée.
Modifiez enfin la classe MainWindow
pour qu'elle implémente l'interface Callback
et qu'elle s'abonne à la variable dès qu'elle est crée.
Vérifiez que l'interface est bien mise à jour instantanément, sans consommer 100% du processeur, et en respectant les principes de séparation de d'indépendance du noyau fonctionnel.
Java fournit un mécanisme tout fait de fonctions de rappel par le biais des classes PropertyChangeSupport
, PropertyChangeListener
, et PropertyChangeEvent
du paquet java.beans
.
En vous aidant du tutoriel sur l'utilisation des propriétés, supprimez l'interface ad-hoc Callback
et remplacez son utilisation par l'utilisation de l'interface générique PropertyChangeListener
.
mise à jour : 23 février 2015