~ / TIS3 / AL / tps / notification /

Service du noyau fonctionnel : 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.

Mise en route

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.

Questions

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.

Bonus

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