IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

[Conception] invoquer une methode par son nom


Sujet :

Java

  1. #1
    Membre éclairé Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Par défaut [Conception] invoquer une methode par son nom
    Bonjour,
    Dans une application serveur, j'aimerai refactorer la partie qui gère les différentes commandes des applications clientes. En fait dés que le message est reçu, j'ai une suite de tests if/else imbriqués qui testent quelle est la commande et choisissent ensuite la methode appropriée pour traiter le message. Vu que j'ai pas mal de commandes différentes, je me dit qu'il faudrait un système plus rapide.
    Pour cela je voulais créer une table de hashage==> clé:commande/valeur:nom de la methode qui convient.
    Donc pour ça j'ai besoin de savoir comment invoquer une méthode par son nom.
    Aussi, pensez-vous que que c'est une bonne solution ?
    Merci !

  2. #2
    Membre éclairé
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Par défaut
    Effectivement tu as possibilité de faire quelque chose en utilisant la réflexivité. Jette un oeil à l'API de la classe java.lang.Class et notamment aux méthodes getMethod (si tu connais d'avance les paramètres). Sinon tu peux aussi parcourir le tableau retourné par getMethods() pour retrouver la méthode qui a le même nom. Une fois que tu as un objet Method, tu peux appeler invoke() dessus pour l'appeler.

  3. #3
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Citation Envoyé par orelero
    Pour cela je voulais créer une table de hashage==> clé:commande/valeur:nom de la methode qui convient.
    Donc pour ça j'ai besoin de savoir comment invoquer une méthode par son nom.
    Sinon, tu peux faire plus simple que la réflexivité, en passant par la définition d'une interface.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public interface Executor {
      void execute(Command command);
    }
     
    Executor executor1 = new Executor() {
      public void execute(Command command) {
        ...
      }
    };
    ...
     
    HashMap executors = new HashMap();
     
    executors.put("command1", executor1);
    executors.put("command2", executor2);
    ...
     
    Command command = request.getCommand();
    Executor executor = (Executor) executors.get(command.getName());
    if (executor != null) {
      executor.execute(command);
    }

  4. #4
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut
    A mon avis, cette dernière solution n'est pas plus simple que la réflexivité.
    Ca se fait en 1 ligne via l'API de réflexion et surtout, avec votre solution, si on ajoute une nouvelle méthode à la classe, il faut l'ajouter en conséquence dans la HashTable. L'introspection offerte par la réflexion dispense de ce travail.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Comme toujours avec les patterns et derives, cela depend de l'usage et de l'evolution future du programme. D'un cote on a un acces direct a la methode que l'on veut executer mais c'est "ecrit en dur" et on peut risquer de choper des NoSuchMethodException, IllegalAccess et autres (nottament en cas de faute de frappe puisque cela ne peut etre verifie a la compilation), etc... de l'autre c'est plus long a mettre en place mais apres on peut tres facilement reconfigurer la cible qui doit executer la commande appellee et l'interface garantie toujours que la methode appellee existe (bien qu'il soit possible de mettre un executor null dans la map par erreur)...

    50/50
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Membre éclairé Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Par défaut
    merci beaucoup pour vos réponses. Je penche plutôt pour la réflexion.

  7. #7
    Membre éclairé Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Par défaut
    Désolé, je déterre le sujet mais c'est en lisant ça que j'ai changé d'avis et passer par une inerface comme Hervé l'a conseillé :
    http://forum.java.sun.com/thread.jsp...sageID=3847442
    D'aprés eux l'appel d'une methode par réflexivité est assez longue comparé à un test conditionnel . Qu'est ce que vous en pensez ?
    Merci

  8. #8
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Oui c'est plus couteux evidemment... et de plus conceptuellement c'est faux car tu considére le code source comme des données de ton programme.

    Pour moi utiliser la réflexivité c'est dans 80% des cas un erreur de conception et on peut s'en passer aisement.

  9. #9
    Membre éclairé Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Par défaut
    en plus c'est difficilement compatible avec une obfuscation .
    Sinon la méthode de Hervé te semble toi aussi meilleur que les tests ? (niveau performance).

  10. #10
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut
    Citation Envoyé par thibaut
    ... et de plus conceptuellement c'est faux car tu considére le code source comme des données de ton programme. Pour moi utiliser la réflexivité c'est dans 80% des cas un erreur de conception et on peut s'en passer aisement.
    La différence entre une méta-classe et une classe est son niveau d'abstraction immédiatement supérieure. C'est une conception logicielle sur 2 niveaux, très propre. Mais comme tu l'as dis, ce n'est que ton avis.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 42
    Par défaut
    +1
    Faudra que l'on dise aux développeurs des Ide java proposant l'autocomplétion... que leur facon d'aller chercher les méthodes est un problème de conception... lol Je sais pas ce qu'ils répondront...

    Et moi aussi ce n'est que mon avis... (chacun le sien)...

  12. #12
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Citation Envoyé par Marnor
    +1
    Faudra que l'on dise aux développeurs des Ide java proposant l'autocomplétion... que leur facon d'aller chercher les méthodes est un problème de conception... lol Je sais pas ce qu'ils répondront...

    Et moi aussi ce n'est que mon avis... (chacun le sien)...
    Voilà pourquoi je dis 80% des cas...

  13. #13
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Octobre 2006
    Messages : 40
    Par défaut
    Mouerf je suis sceptique. Pour en rajouter une couche, va dire aux concepteurs des EJB qu'ils savent rien faire . Bref vous voyez un peu large dans vos pourcentages. J'ai du mal à saisir en quoi utiliser l'introspection est une source d'erreur de conception. Au niveau du développement je le vois mais au niveau conception, j'aimerais bien comprendre.

    Mais ce n'est que mon avis

  14. #14
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Ben le soucis c'est que si jamais tu fais du refactoring: tu changes le nom de ta classe tu la supprime ou tu changes le nom de la méthode, tu auras un erreur à l'execution et non à la compilation.

    Aprés tu fais ta vie, mais se retrouver avec une NoSuchMethodException en production ça fait un peu tache...

Discussions similaires

  1. [POI] Appeler une cellule par son nom
    Par Galak extra dans le forum Documents
    Réponses: 9
    Dernier message: 17/06/2008, 14h33
  2. [VB6] Appeler une procedure par son nom.
    Par kenn dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 24/05/2006, 09h29
  3. Accéder à une propriété par son nom
    Par Neilos dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/09/2005, 21h34
  4. [DLL] Acces a une methode par son index de maniere dynamique
    Par Clorish dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 11/03/2005, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo