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

C++ Discussion :

Probleme de conception


Sujet :

C++

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 545
    Points
    545
    Par défaut Probleme de conception
    Voici un petit pb de conception qui n'est pas forcément spécifique à C++.
    Je manipule plusieurs classes appelée WidgetX par l'intermédiare d'une interface IWidget dont elles dérivent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class Widget1 : public IWidget {...}
    class Widget2 : public IWidget {...}
    class Widget3 : public IWidget {...}
    ...
    Jusque ici rien de bien méchant.
    Mais voila, supposons que la classe Widget3 ait besoin d'une méthode publique spécifique, par exemple : getSpecific() que les autres Widget1 et Widget2 n'implémentent pas.
    Du coup, dans ce cas, quelle est la meilleure facon de procéder ?

    - J'imagine que le down casting IWidget -> Widget3 n'est pas fameux.
    - Ou bien, on pourrait écrire une méthode getSpecific() pour toutes les classes dérivées Widgetx et que l'on mettrait virtuelle pure dans IWidget mais qui ne ferait rien pour Widget1 et Widget2
    - Ou alors, on pourrait écrire :
    class Widget3 : public IWidget, SpecificWidget {...} et cross caster de IWidget vers SpecificWidget qui aurait la methode virtuelle pure getSpecific() mais ca parait lourd.
    - Enfin, je pourrais utiliser le pattern strategy, ie par exemple fournir un objet specifique du style SpecificWidgetBehavior dans le constructeur de Widget3, mais ensuite, comment acceder à cet objet à partir de l'interface IWidget car celle ci n'aurait pas l'utilité d'implémenter une méthode du style getBehavior() car WIdget1 et Widget2 n'en ont pas besoin ?

    Bref, je suis presque sur que tout le monde est plus ou moins confronte à cette situation, alors je suis sur que vos idées seront meilleurs que les miennes car je tourne un peu en rond ...

    Merci d'avance pour vos suggestions.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Points : 168
    Points
    168
    Par défaut
    Salut

    Tout d'abord, je me poserai la question suivante :
    getSpecific() a t elle une raison d'être dans IWidget ? Si oui, créer une méthode virtuelle (pas forcement pure, vu que Widget1 et Widget2 ne l'implémente pas).

    Je suppose que tu dois avoir tes widgets dans un conteneur de IWidget*, ce qui ne permet pas d'appeler des méthodes autres que IWidget. La solution d'héritage multiple ne t'apportera pas grand chose à mon avis.

    Le problème de conception est peut être en amont, c'est à dire : Pourquoi devoir appeler une méthode spécifique d'un widget ?

    Un peu plus d'info seraient le bienvenue (concrètement : explique nous ton IWidget, et la méthode spécifique).
    --
    Jérémie
    Jérémie

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Points : 379
    Points
    379
    Par défaut
    Citation Envoyé par jfouche Voir le message
    Tout d'abord, je me poserai la question suivante :
    getSpecific() a t elle une raison d'être dans IWidget ?
    A mon avis c'est bien là tout le fond du problème. Apparemment tu fais du polymorphisme, il faut te demander si la méthode getSpecific() a du sens pour un objet IWidget.

  4. #4
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    C'est un problème classique que j'avais eu il y a tout juste un an. Voir mon post Downcasting : violation de principes orientés objets ?
    La solution en cas de conception valable, c'est le pattern visiteur.

    Bonne continuation,

    Poukill

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Je plussoie la réponse de Poukil. Si à un moment t'as besoin de downcaster c'est que t'as probablement besoin d'un pattern visiteur. Ou ton service n'est pas au bon niveau. Pour le coup, il faudrait peut être que tu précises un peu plus le contexte.

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 545
    Points
    545
    Par défaut
    Merci pour vos réponses, je vais étudier le Pattern Visiteur.

  7. #7
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 545
    Points
    545
    Par défaut
    Je viens d'etudier le pattern visiteur, il est tres puissant mais j'ai resolu le probleme autrement.
    Sinon, un autre probleme dans le meme genre se pose à moi.
    J'ai plusieurs classes Algos qui font des traitements quelconques.
    Une partie des traitements est commune à tous les algos donc je les fais deriver d'une classe de base.
    Chaque Algo a besoin d'une fonction init() que je place dans la classe de base comme virtuelle pure.
    Mais je viens de rajouter un nouvel Algo qui lui n'a pas besoin de cette fonction init(), donc comment faire ?
    J'ai mis la fonction init() de la classe de base virtuelle avec un corps vide (elle n'est donc plus virutelle pure) et qui sert d'implementation par defaut. Mais bon, une fonction qui fait rien ca me trouble un peu.
    Vous avez une autre idee pour ce genre de probleme ?

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par vandamme Voir le message
    Je viens d'etudier le pattern visiteur, il est tres puissant mais j'ai resolu le probleme autrement.
    Sinon, un autre probleme dans le meme genre se pose à moi.
    J'ai plusieurs classes Algos qui font des traitements quelconques.
    Une partie des traitements est commune à tous les algos donc je les fais deriver d'une classe de base.
    Ton héritage ne traduit pas un IS-A mais un IS-IMPLEMENTED-IN-TERMS-OF ?
    -> Composition ?
    Citation Envoyé par vandamme Voir le message
    Chaque Algo a besoin d'une fonction init() que je place dans la classe de base comme virtuelle pure.
    Init n'est pas appelé dans le constructeur au moins ?

    Citation Envoyé par vandamme Voir le message
    Mais je viens de rajouter un nouvel Algo qui lui n'a pas besoin de cette fonction init(), donc comment faire ?
    J'ai mis la fonction init() de la classe de base virtuelle avec un corps vide (elle n'est donc plus virutelle pure) et qui sert d'implementation par defaut. Mais bon, une fonction qui fait rien ca me trouble un peu.
    Vous avez une autre idee pour ce genre de probleme ?
    Orthogonalité dans tes alog -> Template ? classe Politique ? Pattern décorateur ? Trop flou pour répondre rapidement, à mon avis.

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 545
    Points
    545
    Par défaut
    Merci pour ces elements de reponses.

    Non, la methode virtuelle pure n'est pas appelee dans les constructeurs.
    Pour la composition j'y ai pense, mais je stocke les algos dans une liste de pointeurs de la classe de base, donc dans ce cas l'heritage me semble approprie.
    Pour le pattern decorateur, je ne pense pas qu'il s'applique dans mon cas, les algos etant distincts l'un de l'autre (je pense que c'est ce que vous voulez dire par orthogonaux).

    Je vais etudier de nouveau mon code pour essayer de trouver une solution et ensuite je reponserai la question avec des extraits de code plus precis.

    Merci.

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par vandamme Voir le message
    Pour la composition j'y ai pense, mais je stocke les algos dans une liste de pointeurs de la classe de base, donc dans ce cas l'heritage me semble approprie.
    : Je préfère utiliser des boost::variant ou les boost::any plutôt que de mettre des héritages qui n'en sont pas.
    Citation Envoyé par vandamme Voir le message
    Pour le pattern decorateur, je ne pense pas qu'il s'applique dans mon cas,
    Je ne sais pas, je ne connais pas ton cas
    Citation Envoyé par vandamme Voir le message
    les algos etant distincts l'un de l'autre (je pense que c'est ce que vous voulez dire par orthogonaux).
    Non, ce serait plutôt est-ce que chacun d'eux peut être 'générique'. Des fois, avec cette approche, ça résout de facto ton problème.
    Comme dit précédemment, ta présentation est trop flou pour donner une réponse définitive.

  11. #11
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    C'est vrai que c'est un poil "flou", mais les mots composition + héritage me font penser très fort au pattern stratégie. Le but est d'encapsuler tout ce que qui varie dans une classe virtuelle à part.

Discussions similaires

  1. problème de conception : cycle
    Par FarookFreeman dans le forum Diagrammes de Classes
    Réponses: 13
    Dernier message: 20/10/2005, 10h15
  2. Probleme de conception pour un update Oracle!
    Par vempiria dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/09/2005, 10h28
  3. [Language]Problème de conception
    Par lautre dans le forum Langage
    Réponses: 5
    Dernier message: 26/09/2005, 07h56
  4. [Evenement]Probleme de conception
    Par le Daoud dans le forum Interfaces Graphiques en Java
    Réponses: 5
    Dernier message: 26/05/2005, 14h12
  5. probleme de conception de classe
    Par NhyMbuS dans le forum C++
    Réponses: 2
    Dernier message: 08/05/2005, 17h10

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