Tp1Observer Question2.1

Conception de logiciels Intranet : patrons et canevas

Modérateurs : Douin, graffion

GANKAMA
Messages : 54
Inscription : 26 oct. 2017 16:51

Tp1Observer Question2.1

Message par GANKAMA » 18 févr. 2018 16:13

Bonjour à tous,

Je bloque sur la question 2.1 Ma classe sensor ressemble à ceci:

public void setValue(int value){
this.value = value;
setChanged();
notifySensorObserver();
}

public void notifySensorObserver(){
me=new MessageEvent(this, String.valueOf(this.getValue() ));
for(SensorObserver so:SensorObservers){
so.update(this,(Object)me);
}

}
et dans SensorObserver j'ai ceci:

public void update(Observable observable, Object arg){
this.arg=arg;
System.out.println("Valeur fournit par le capteur: "+((Sensor)observable).getValue());
}

Sauf que la classe TestsALireEtAValider me donne cette erreur:

getArg() == null ???
---
junit.framework.AssertionFailedError: getArg() == null ???
at question2.TestsALireEtAValider.testUnObservateurUnCapteur(TestsALireEtAValider.java:23)

J'en conclu que l'encapsulation de la valeur ne s'est pas réalisé.Je dois donc avoir un soucis à ce niveau : me=new MessageEvent(this, String.valueOf(this.getValue() ));

Quelqu'un peut il m'aider à résoudre cette erreur.



Cordialement.

julien_24
Messages : 38
Inscription : 17 oct. 2017 13:41

Re: Tp1Observer Question2.1

Message par julien_24 » 18 févr. 2018 21:58

Bonsoir GANKAMA,

Essai d'enlever le cast (Object) que tu fais quand tu appelles la methode update.

Tu maintiens une liste se SensorObserver on dirait. Regarde aussi peut etre du cote de cette liste.

julien

STB
Messages : 23
Inscription : 22 févr. 2017 19:44

Re: Tp1Observer Question2.1

Message par STB » 19 févr. 2018 14:04

Bonjour,

tu ne dois pas créer de méthode notifySensorObserver(), mais utiliser dans setValue() la méthode notifyObservers(), qui existe déjà dans la classe Observable.

Stéphane

GANKAMA
Messages : 54
Inscription : 26 oct. 2017 16:51

Re: Tp1Observer Question2.1

Message par GANKAMA » 19 févr. 2018 22:05

Merci pour vos réponses.

Voila ce j'ai maintenant:

public void notifyObservers(){
me=new MessageEvent(this, String.valueOf(this.getValue() ));
//System.out.println("Valeur fournit par le capteur: "+me.getMessage());
for(SensorObserver so:SensorObservers){
so.update(this,me);
}

}

et


public void update(Observable observable, Object arg){
this.arg=arg;
System.out.println("Valeur fournit par le capteur: "+((Sensor)observable).getValue());
System.out.println("Valeur fournit par le capteur: "+((MessageEvent)arg).getMessage());
}

et j'ai toujours la même erreur (mon arg est toujours null !!!)

Cordialement.

julien_24
Messages : 38
Inscription : 17 oct. 2017 13:41

Re: Tp1Observer Question2.1

Message par julien_24 » 20 févr. 2018 1:13

Bonsoir GANKAMA,

Ton deuxieme System.out.. te donne null comme valeur?

Sinon comme t'as dit Stephane, tu n'es pas obligé de maintenir une liste de SensorObserver et d'appeler sur chacun la méthode update.

La methode notifyObservers(Object arg) de la classe Observable notifiera tous les observateurs inscrits (addObserver()), tu n'as pas besoin de la redéfinir, juste de l'appeler a l'interieur de la methode setValeur(). Cette méthode (notifyObservers()) une fois appelé se charge d'appeler sur chaque Observateur inscrit la methode update.

Par contre, personnellement, je ne vois pas ce qui bloque dans ton code, cela devrait fonctionner.

julien

julien_24
Messages : 38
Inscription : 17 oct. 2017 13:41

Re: Tp1Observer Question2.1

Message par julien_24 » 20 févr. 2018 1:28

Re,

Ah oui, petit detail, si tu veux tout faire a la main, il faut que tu redéfinisses la methode addObserver(Obserser observer) dans ta classe Sensor, et le corps de cette méthode doit ajouter l'observer en paramètre à la liste que tu maintiens, il faudra dans ce cas que tu vérifies avant d'insérer que l'observer est pas déjà présent, sinon il sera notifié plusieurs fois.

julien

STB
Messages : 23
Inscription : 22 févr. 2017 19:44

Re: Tp1Observer Question2.1

Message par STB » 20 févr. 2018 12:51

notifyObservers ne doit pas être redéfinie
Dans setValue, la méthode notifyObservers contient new MessageEvent(...) comme argument et rien d'autre.

Stéphane

GANKAMA
Messages : 54
Inscription : 26 oct. 2017 16:51

Re: Tp1Observer Question2.1

Message par GANKAMA » 20 févr. 2018 21:22

Bonsoir,

Merci beaucoup à STB et julien_24,Vous m'avez bien aidé dans la comprehension du pattern Observer.
Juste une dernière question sur la question 2.2:
j'ai complété la classe PersistentObserver et voici ma methode de teste pour cette classe:

public void testUnObservateurUnCapteurPersistent() throws Exception{

question2.PersistentObserver so2 = new question2.PersistentObserver("persitentObserver.ser");
question2.Sensor sensor2 = new question2.Sensor("sensor2");
sensor2.addObserver(so2);
sensor2.setValue(7744);
assertTrue(" getArg() == null ???", so2.getArg() != null);
assertTrue(" getArg() erroné ???", getValue(so2.getArg()).equals("7744"));

}

Comment la complété pour tester que la sérialisation s'est effectivement bien réalisée?

Cordialement.

julien_24
Messages : 38
Inscription : 17 oct. 2017 13:41

Re: Tp1Observer Question2.1

Message par julien_24 » 21 févr. 2018 12:41

Bonjour,

Tu peux aller relire le fichier afin de récupérer l'objet MessageEvent que tu es allé écrire et vérifier que tu retrouves bien le bon message encapsulé à l'intérieur.

julien

Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité