TP7 Q2

Programmation Avancée

Modérateur : Douin

pellier
Messages : 37
Inscription : 30 oct. 2016 21:13

TP7 Q2

Message par pellier » 16 déc. 2016 17:43

Bonjour,

Je ne comprends pas le principe d'utiliser l'introspection pour ajouter un observer.
Je sens que je dis une énormité mais avec le code suivant cela fonctionne :

Code : Tout sélectionner

if(observable instanceof Observable && observer instanceof Observer){
          ((Observable)observable).addObserver((Observer)observer);
      }else{
          throw new NoSuchElementException();
      }
à quoi sert l'introspection dans cet exemple ?

pellier
Messages : 37
Inscription : 30 oct. 2016 21:13

Re: TP7 Q2

Message par pellier » 19 déc. 2016 15:42

Quelq'un pourrait me donner une piste s'il vous plait ?
peut-être la partie du cours qui y fait référence ?

Joris_Oziol
Messages : 52
Inscription : 15 oct. 2016 13:59

Re: TP7 Q2

Message par Joris_Oziol » 19 déc. 2016 17:05

p30 et p32 du cours introspection
ex

Code : Tout sélectionner

public static void lierObservableEtObserver(Object observable, Object observer) throws NoSuchElementException{

        try{
            String obs = observable.getClass().getName();
            Class cl = Class.forName(obs);
            Class[] types = new Class[] { Observer.class };
            Method m = cl.getMethod("addObserver", types );
            m.invoke(observable , new Object[]{observer});
        }catch(Exception e){
            throw new NoSuchElementException();
        }

    }

Joris_Oziol
Messages : 52
Inscription : 15 oct. 2016 13:59

Re: TP7 Q2

Message par Joris_Oziol » 19 déc. 2016 17:06

p33 et p 11 pour la q2.2 ;-)

pellier
Messages : 37
Inscription : 30 oct. 2016 21:13

Re: TP7 Q2

Message par pellier » 19 déc. 2016 18:30

Bonjour,

Merci pour ta réponse.
Encore une fois mon interrogation est moins sur le code en lui-même que sur la logique de ce code.
En gros et pour faire clair : oui ça fonctionne mais pourquoi faire ainsi ?
C'est la même question qui revient à tous les TPs…

Si je résume l'exemple gentiment donné par Joris :
1 - String obs = observable.getClass().getName();
2 - Class cl = Class.forName(obs);
3 - Class[] types = new Class[] { Observer.class };
4 - Method m = cl.getMethod("addObserver", types );
5 - m.invoke(observable , new Object[]{observer});

1 - d'après l'objet observable on obtient le nom de sa class
2 - d'après le nom de la class on obtient la class elle-même
3 - on récupère les types
4 - on cherche la méthode "addObserver" de cette class
5 - on invoke cette méthode sur l'objet observable

Pourquoi est-ce qu'on invoque pas directement la méthode addObserver sur l'objet observable ?
Pourquoi tout ce détour ?

ça me pose quand même un gros problème de pédagogie d'apprendre des méthodes sans en comprendre le sens

Joris_Oziol
Messages : 52
Inscription : 15 oct. 2016 13:59

Re: TP7 Q2

Message par Joris_Oziol » 19 déc. 2016 19:09

Pour utiliser l'introspection ...


Comme pour les autres TP d'autres moyens peuvent être employés pour résoudre le pb demandé, seulement on nous demande d'utiliser ce que l'on a vu en cours et de l'appliquer.
Si tu fais la synthèse de ce que l'on a vu tu verras que toutes ces méthodes de conception bien utilisées servent à créer un programme souple et "maintenançable" bref un programme durable dans le temps en encapsulant ce qui peut être modifié et en y appliquant les différentes actions sans toucher "à la base" même du programme.

pellier
Messages : 37
Inscription : 30 oct. 2016 21:13

Re: TP7 Q2

Message par pellier » 20 déc. 2016 11:11

Merci d'avoir pris le temps de répondre.

Oui c'est un peu ça utiliser l'introspection … pour utiliser l'introspection.
Je reste un peu perplexe mais bon tant pis c'est peut-être moi qui cherche trop la petite bête.

Bon courage pour ceux qui n'ont pas terminé.
et bonnes fêtes.

Répondre

Qui est en ligne ?

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