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

  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

  8. #8
    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 adiGuba
    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++
    Merci pour cette réponse, on s'approche à grand pas de mon problème, alors je me permets juste encore une petite question : J'ai fais comme vous avez dit, crée la ligne d'héritage classique : forme -> Polygone -> Carré,... mais des utilisateurs (méchants donc) peuvent modifier les attributs de formes et donc changer par exemple un cercle en polygone (Circularité = 0) Est ce que je suis obligé de passer par une destruction de mon cercle et l'instanciation d'un nouveau carré ? Si j'ai compris la réponse précédente j'ai pas le choix !

    Encore merci pour votre aide, un jour j'arriverai à programmer !

  9. #9
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Citation Envoyé par TTKiBosse
    mais des utilisateurs (méchants donc) peuvent modifier les attributs de formes et donc changer par exemple un cercle en polygone (Circularité = 0)


    là c'est pas un problème de polymorphisme, mais d'encapsulation!

    Un utilisateur NE DOIT PAS POUVOIR FAIRE CA!!

    C'est à la classe de vérifier les opérations que l'utilisateur essaie de faire, et de réagir en conséquence...

    Par exemple, si j'ai plusieurs classes Chauffeur, Voiture et Moteur, le Chauffeur ne doit pas pouvoir aller grailler directement dans le Moteur... imagine les dégats... comme dans la vie réelle, il y a des responsabilité différentes d'une classe à l'autre. Comme un chauffeur ne doit pas pouvoir accèder au moteur de sa voiture pour bidouiller le carbu ou les bougies, un utilisateur ne doit pas avoir un accès direct et illimité à tous les champs d'une Forme...

    Une règle de base en POO: "tous les champs d'une classe peuvent et doivent être privés"

    Une règle plus générale: "tout ce qui peut être privé, doit l'être"


  10. #10
    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 Pill_S


    là c'est pas un problème de polymorphisme, mais d'encapsulation!

    Un utilisateur NE DOIT PAS POUVOIR FAIRE CA!!

    C'est à la classe de vérifier les opérations que l'utilisateur essaie de faire, et de réagir en conséquence...

    Ok pour les règles de bases, mon problème est que, ce que tu me dis que l'utilisateur ne doit pas faire, est une exigence client. L'utilisateur doit pouvoir parametrer son cercle (modifier la circularité de son objet) et pour des valeurs spécifiques (ex circularité = 0) l'objet doit se comporter spécifiquement (comme un polygone dans l'exemple précédent). Alors bien entendu mes variables d'instance et tout le toutime sont privates, et j'ai encapsulé un maximum. Mais je n'ais toujours aucune idée de comment faire varier mon objet en lui donnant de nouvelles propriétés. Suis je obligé de créer un nouvel objet au passage des valeurs spécifiques ? Si vous avez d'autres idées je suis super preneur ....

    Merci a tous ceux qui ont pris et prendront le temps de me répondre.

  11. #11
    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
    Effectivement si tu utilises le polymorphisme, avec des classes Cercle, Polygone... au passage d'une valeur particulière (circularité 0 pour un cercle qui correspond en réalité à un polygone), tu vas devoir instancier un Polygone au lieu d'un cercle...

    Cependant, j'ai effectivement une autre idée à te soumettre: aller râler auprès de ta hiérarchie en expliquant (diplomatiquement) que leur conception est à revoir!
    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