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

Langage Java Discussion :

instanceof c'est mauvais?


Sujet :

Langage Java

  1. #21
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Je recadre un peu, puisque la discussion n'est pas sur le equals, mais sur le instanceof

    J'ai beau relire l'ensemble, je ne vois pas ce qui montre pourquoi il ne faut pas l'utiliser.

    On affirme mordicus que le polymorphisme est mieux ; peut-on préciser en quoi cela répond à la question ??

    Le seul cas présenté (avec ((A)o).method() ou ((B)o).method()) me parait tellement évident qu'il en devient non significatif ; quand au equals... c'est plutôt un problème de equals, il me semble.

    Alors ?

    (et merci d'éviter un énième cours sur le polymorphisme, je connais et l'utilise).

  2. #22
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut
    Le polymorphisme est sans doute mieux (à voir) quand il peut s'appliquer mais il y a quand même des cas où le polymorhpisme ne s'applique pas, quand on ne peut pas toucher à la classe de base par exemple.

    Par exemple, ListCellRenderer est utilisé pour dessiner les éléments d'une liste. Elle reçoit en paramètre un Object, il n'y a donc pas vraiment d'autre solution que le instanceof et downcast pour avoir des affichages un peu évolué. Ici, pas vraiment possible / pratique d'utiliser le polymorphisme.

  3. #23
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par NicoV
    Par exemple, ListCellRenderer est utilisé pour dessiner les éléments d'une liste. Elle reçoit en paramètre un Object, il n'y a donc pas vraiment d'autre solution que le instanceof et downcast pour avoir des affichages un peu évolué. Ici, pas vraiment possible / pratique d'utiliser le polymorphisme.
    Avec la généricité sur Swing, le problème serait réglé

  4. #24
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut
    Comment on fait çà simplement ? (pour utiliser un Swing générique)
    A mon avis, çà serait bien compliqué pour faire des choses toutes simples.
    En particulier, çà peut vouloir dire créer pleins d'interfaces supplémentaires et faire que de simples beans implémentent ces interfaces.

    Par exemple, le DefaultListCellRenderer permet actuellement de gérer les Icon et les Object (en utilisant toString()). Comment on fait-çà avec des génériques ?

  5. #25
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 55
    Par défaut
    Voici un exemple ou je pense qu'il faut utiliser instanceof (ou une autre structure du même style). Disons qu'on a une classe A et deux classes B et C qui héritent de A. Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class A {...}
    class B extends A {...}
    class C extends A {...}
    Disons que la classe C implémente une méthode X qui n'est pas implementée dans A ni B. Cette méthode est propre à la classe C.
    Disons que dans la classe A on a une méthode Y:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class A {
         public Y() {
              ArrayList liste = (array list contenant des objets de B et de C)
              for (A objet : liste) {
                  if (objet instanceof C)
                       ((C)objet).X()
                  ...
              }
         }
    }
    C'est peut-être un peu compliqué... Mais disons que si objet est un objet de type C, alors il faut appeler la méthode X.

  6. #26
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Je ne comprend pas pourquoi dans ton exemple, A a besoin de connaître l'existence de ses sous classes ?

    Ton exemple semble artificiel en fait Je trouve que la hiérarchie de classe est mauvaise dans ton cas

  7. #27
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 55
    Par défaut
    Comment la faire alors? Car A est une généralisation de B et de C, c'est-à-dire elle contient toutes les méthodes que B et C ont en commun...

  8. #28
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Déjà, A qui a une liste d'objet A, c'est pas super...

    Ensuite, pourquoi ne pas utiliser l'héritage pour appeler des méthodes sur B et C (qui aurait pu être abstraites dans A) ?

    Pour moi, A qui a besoin de connaître si une de ses sous classes est bien C pour pouvoir appliquer une méthode spécifique à C démontre une conception mauvaise.

  9. #29
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 55
    Par défaut
    Mais si tu mets la méthode X abstraite dans A. Alors tu dois l'implémenter dans B et C. Mais comme B n'a rien à faire avec la méthode X, la méthode sera vide dans B, et je ne pense pas que ça soit correct non plus...

  10. #30
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Explique moi pourquoi A aurait besoin d'appeler une méthode spécifique à une de ses sous classes ? (dans une liste qui contient un peu n'importe quoi, du A, du B, du C)

    Donnes moi un problème concret où ça arrive. A mon avis, ce cas n'arrive que lorsque la conception est mauvaise.

  11. #31
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 55
    Par défaut
    J'ai un système de donjons pour une sorte de RPG. J'ai une classe Dungeon qui est abstraite. En dessous, j'ai une classe CompositeDungeon qui hérite de Dungeon. Un CompositeDungeon est caractérisé par le fait qu'il sait contenir d'autres donjons. J'ai une autre classe BasicDungeon qui hérite aussi de Dungeon. Les BasicDungeon savent contenir des chambres (Squares). J'ai aussi les classes Shaft et Level qui héritent de BasicDungeon. Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    abstract class Dungeon {...}
    class CompositeDungeon extends Dungeon {...}
    abstract class BasicDungeon extends Dungeon {...}
    class Shaft extends BasicDungeon {...}
    class Level extends BasicDungeon {...}
    Dans la classe CompositeDungeon j'ai une méthode getShafts(). Celle-ci renvoie toutes Shafts que ce donjon contient. A noter qu'un CompositeDungeon sait aussi bien contenir des Shafts, des Levels et même des autres CompositeDungeon. Donc dans CompositeDungeon j'ai une collection de Dungeon et dans getShafts() il faut un moyen de savoir qu'un Dungeon est bien un Shaft pour le rajouter à la liste. Comprenez-vous?

  12. #32
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Attention, il ne faut pas abuser des liens est-un quand on aurait dû utiliser un lien a-un

    http://c.developpez.com/faq/cpp/?pag..._encapsulation

    Par exemple, level, ce n'est pas un donjon. Ca a un donjon, ça pourrait contenir d'autres choses (une prairie ou je ne sais quoi)

  13. #33
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 55
    Par défaut
    Mais si, Level est un donjon et CompositeDungeon aussi.

  14. #34
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Citation Envoyé par pongping
    Comprenez-vous?
    Ahem, non

    Quand c'est un pareil bordel mon conseil est de ne pas se fouler, d'être pragmatique, et d'utiliser instanceof de toutes façons cela ne peut pas être pire.

    Chemin (de ronde) faisant essaie d'exprimer les relations entre les objets que tu manipules (par exemple, comme le dit millie, en regardant leur rôle) (tiens, dit millie c'est joli) (tiens dit millie c'est joli c'est joli) (bon, merci) ; peut être verras-tu mieux alors comment s'organisent leurs collections.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/05/2010, 11h39
  2. Coef et position, mauvais positionnement, est ce important ?
    Par alicia1984 dans le forum Droit du travail
    Réponses: 2
    Dernier message: 12/03/2010, 21h02
  3. instanceof ou mauvais polymorphisme ?
    Par Djakisback dans le forum Langage
    Réponses: 45
    Dernier message: 12/11/2007, 17h18
  4. [W3C] Les tableaux c'est si mauvais que ca ?
    Par ShinJava dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 03/03/2006, 14h17

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