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

Logging Java Discussion :

Polymorphisme & Design


Sujet :

Logging Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 15
    Par défaut Polymorphisme & Design
    Bonjour à tous,

    J'ai lu dans un document très bien : Joseph Bergin sur le coding Patterns (partie Polymorphism Before Selection ), que pour les languages de PO, il est préférable d'utiliser le polymorphisme aux structures conditionnelles (de type if ou switch).

    Je suis très interressé par ce design qui je suis sur me permettrai une meilleur gestion de mon code. Mais je ne sais pas très bien comment employer ce design. J'en appel donc a vos bons coeurs. Si vous avez déja testé, et que vous avez un peu de temps pour m'expliquer je vous en remercie par avance.

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Le polymorphisme est une des bases des langages de POO. Tu trouveras les explications dont tu as besoin en introduction de nombreux tutoriels.

    Voici le code le plus connu montrant comment fonctionne le polymorphisme: tu vérifieras que sans le moindre test, nous avons 3 animaux (de la classe "Animal") qui ont un comportement différent

    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
    23
     
    class Animal {
       public String parler() { return "parle"; }
    }
     
    class Chien extends Animal() {
       public String parler() { return "aboie"; }
    }
     
    class Chat extends Animal() {
       public String parler() { return "miaule"; }
    }
     
    class Test {
       public static void main(String[] args) {
          Animal a = new Chien();
          Animal b = new Chat();
          Animal c = new Animal();
          System.out.println(a.parle());
          System.out.println(b.parle());
          System.out.println(c.parle());
       }
    }
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 15
    Par défaut
    Citation Envoyé par CyberChouan
    Le polymorphisme est une des bases des langages de POO. Tu trouveras les explications dont tu as besoin en introduction de nombreux tutoriels.

    Voici le code le plus connu montrant comment fonctionne le polymorphisme: tu vérifieras que sans le moindre test, nous avons 3 animaux (de la classe "Animal") qui ont un comportement différent
    Arggg je me suis pas bien fait comprendre... ou alors je suis vraiment pas en forme ce matin et j'ai rien compris à ce que j'ai lu dans l'article précédemment cité (Ce qui est possible)

    j'ai bien compris le polymorphisme. Et si j'ai besoin d'un chat, je suis pas obliger de coder le code commun rassemblé sous la classe animal. Mais ma question est plutot sur comment profiter au mieux du polymorphisme pour éviter les structures conditionnelles.

    Par exemple est il possible de rendre un objet métamorphosable? Si j'instancie un animal (à partir de la class animal), et si il a un cou > à 2m(int taillecou = 3m) alors cet animal devient une giraffe (une sorte de cast).

  4. #4
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Citation Envoyé par TTKiBosse
    Par exemple est il possible de rendre un objet métamorphosable? Si j'instancie un animal (à partir de la class animal), et si il a un cou > à 2m(int taillecou = 3m) alors cet animal devient une giraffe (une sorte de cast).
    Non, il n'est pas possible de modifier le type d'un objet. Celui-ci est fixé à l'instanciation. Et si tu instancie un animal, tu ne peux pas le transformer en chat ni en chien.

    En revanche, si tu instancies un chat ou un chien, celui-ci est automatiquement un animal et hérite donc de ses méthodes.

    Maintenant, sur le fait d'éviter de faire des tests, le code que je t'ai donné montre comment on fait cela. Quelque soit l'animal que tu récupères (chien, chat...), animal.parler() te renverra le crie de l'animal.
    Et cela sans avoir à faire le test "si (animal estun chien) { ... } si c'est un chat { ... } sinon { ... }"

    Autre exemple. Tu veux dessiner des formes géométriques:
    - Tu crée une classe FormeGeom, qui a une méthode dessine.
    - Tu crées des classes qui en héritent (carré, triangle, rectangle, hexagone...) et redéfinissent la méthode dessine pour afficher correctement la forme
    - Si tu as une FormeGeom fg, fg.dessine() affichera automatiquement le bon dessin, sans que tu aies à tester si celle-ci est un carré, un triangle, autre chose... C'est java qui connait le type réel de ta forme et qui choisira automatiquement la bonne méthode de dessin
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 15
    Par défaut
    Citation Envoyé par CyberChouan
    Non, il n'est pas possible de modifier le type d'un objet. Celui-ci est fixé à l'instanciation. Et si tu instancie un animal, tu ne peux pas le transformer en chat ni en chien.
    Qu'en est-il de "caster" les objets ???

    Citation Envoyé par CyberChouan
    Autre exemple. Tu veux dessiner des formes géométriques:
    - Tu crée une classe FormeGeom, qui a une méthode dessine.
    - Tu crées des classes qui en héritent (carré, triangle, rectangle, hexagone...) et redéfinissent la méthode dessine pour afficher correctement la forme
    - Si tu as une FormeGeom fg, fg.dessine() affichera automatiquement le bon dessin, sans que tu aies à tester si celle-ci est un carré, un triangle, autre chose... C'est java qui connait le type réel de ta forme et qui choisira automatiquement la bonne méthode de dessin
    Le problème que je me pose serais plutot le suivant :
    J'ai crée (instancié) une forme . Parmis les attributs de cette forme il est définit dans la classe le nombre de point qui la compose et la nature de la courbe qui reli ces points (droite, courbe, pointillée,...) Je cherche a savoir si au sein meme de l'objet, en fonction des attributs (si 4 points et nature droite) je peux transformer (caster) cette instance en un objet qui étends la classe forme (par exemple un polygone rectangle).

    merci pour ta persévérance dans tes explications...

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par TTKiBosse
    Qu'en est-il de "caster" les objets ???
    Le fait de caster un objet ne change en rien son type réel, mais seulement son type déclaré...

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Animal animal = new Chien();
    Ici on fait un upcast (cast implicite vers une type parent), et animal est une référence de type Animal qui représente en réalité un type Chien.
    Ce type de cast est totalement sécurisé puisque le compilateur peut vérifier la cohérence de l'ensemble (c-a-d qu'il vérifie que le type à droite de l'affectation hérite de celui de gauche).

    Et à l'inverse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Chien chien = (Chien) animal;
    Ici on fait un downcast (que l'on nomme simplement cast), c'est à dire que l'on redescend dans l'arbre d'héritage. Ce type de cast n'est pas sécurisé et peut provoquer des ClassCastException si les types sont incompatible (comprendre : si animal n'est pas un Chien), d'où la présence du " (Chien) " qui rappelle le problème potentiel...


    Citation Envoyé par TTKiBosse
    Le problème que je me pose serais plutot le suivant :
    J'ai crée (instancié) une forme . Parmis les attributs de cette forme il est définit dans la classe le nombre de point qui la compose et la nature de la courbe qui reli ces points (droite, courbe, pointillée,...) Je cherche a savoir si au sein meme de l'objet, en fonction des attributs (si 4 points et nature droite) je peux transformer (caster) cette instance en un objet qui étends la classe forme (par exemple un polygone rectangle).
    Non : un cast ne change pas le type de l'objet !

    Tu prend le problème à l'envers : tu devrais avoir une classe forme qui définit des éléments de base (par exemple l' origine de la forme) ainsi que ses méthodes (par exemple "dessiner()").
    Ensuite chacune de tes formes est représenté par une classe fille qui implémente correctement la méthode dessiner()...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Forme forme1 = new Rectangle(0, 0, 50, 80);
    Forme forme2 = new Cercle (0, 0, 120);
     
    forme1.dessiner(); // dessinera un rectangle de 50*80 à la position (0,0)
    forme2.dessiner(); // dessinera un cercle de rayon 120 à la position (0,0)
    Bref on retrouve bien ce qui est dit dans l'article : il n'y a pas de condition du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (nbpoint==4 && typeLigne=DROITE) {
       // dessiner un rectangle
    } else if (nbpoint==3 && typeLigne==CERCLE) {
       // dessiner un cercle
    }
    Et chaque classe s'occupe elle même de ce qui lui est spécifique...

    a++

  7. #7
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Pour répondre à ta question, non, tu ne peux pas caster ton objet forme en autre chose.

    La droite est un type particulier de forme (comme le chat est un type particulier d'animal). Donc on peut caster un chat en animal (on perd des spécificité), ou une droite en forme, mais pas l'inverse.

    Pouvoir caster une forme en droite, ça signifie que toutes les formes sont des droites, ce qui est évidemment faux.

    Pour ton problème, ce dont tu as besoin, c'est d'une factory: une classe statique qui va prendre tes données, les analyser, et instancier un objet du bon type.

    Voici un exemple de factory pour les animaux, pour que tu comprennes le principe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class AnimalFactory {
     
       public static Animal createAnimal(int nbPattes, boolean cornes, boolean masculin) {
          if(nbPattes == 2) { return new Oiseau(); }
          if(nbPattes == 4) {
             if(cornes && masculin) { return new Taureau(); }
             if(&& cornes) { return new Vache(); }
             if(masculin) { return new Chien(); }
             return new Chatte();
          }
          return new Animal();
       }
    }
    EDIT: grillé
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [power designer et Sybase] trigger
    Par mr_qno dans le forum Sybase
    Réponses: 4
    Dernier message: 12/07/2006, 18h32
  2. Réponses: 3
    Dernier message: 09/02/2003, 01h09
  3. Désigner une variable avec une variable?
    Par littleman dans le forum Paradox
    Réponses: 4
    Dernier message: 12/08/2002, 11h21

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