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 :

Conception: ajout de fonctionnalités


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut Conception: ajout de fonctionnalités
    Bonjour à tous,

    J'ai un "problème" de conception: j'ai une classe A:
    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
     
    class A
    {
    private:
      int val;
    public:
      A(int valeur=0) : val(valeur)
      {}
     
      int getVal() const throw()
      {
        return val;
      }
    protected:
      void setVal(int valeur)
      {
        val = valeur;
      }
    };
    Je voudrai lui ajouter une fonctionnalité: admettons que je veuille lui ajouter une méthode qui multiplie la valeur par 10 (c'est un exemple bidon pour illustrer mon problème): j'ai lu que lorsque l'on veut ajouter des fonctionnalités à une classe, on peut utiliser le design pattern visitor mais un ami procède de la manière suivante pour ajouter une fonctionnalité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class AWithFunction : public A
    {
    public:
      void mult()
      {
        setVal(getval()*10);
      }
    };
    et pour l'utilisation, il fait un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    A a(5);
    static_cast<AWithFunction*>(&a)->mult();
    std::cout << a.getVal() << std::endl;
    Alors pour que ça marche, il me dit qu'il ne faut pas ajouter d'attributs dans la classe fille, par contre le gros avantage par rapport à l'approche visiteur est que dans ma classe fille, j'ai accès à la méthode protégée de la classe A (du fait de l'héritage). D'où ma question: que pensez-vous de cette approche de cast "violent", comment feriez vous avec une autre approche (type visiteur) pour éviter que je mette la méthode setVal de ma classe A en public?

  2. #2
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 73
    Points : 68
    Points
    68
    Par défaut
    Pour ajouter une fonctionnalité, j'aurais tendance à utiliser plutôt le pattern Decorateur que le pattern Visiteur...Mais le problème de la méthode protégée reste présent.

  3. #3
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Une fonction libre tout simplement ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut
    Ben... je vois pas trop comment cette fonction libre pourra modifier la valeur de val de l'objet A à moins d'être amie de la classe A (ce que je voudrais éviter puisque je ne connais pas à l'avance l'ensemble des fonctionnalités qui seront ajoutées à la classe)

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Dans l'ensemble, les droits d'accès ne devraient pas être utilisés pour restreindre l'utilisation d'une classe, juste pour empêcher certaines syntaxes mais tout en permettant une alternative à l'aide de méthodes. Cela a uniquement pour but de toujours conserver les objets dans un état cohérent, pas d'ennuyer les utilisateurs. Donc tu ferais mieux de mettre ta méthode setVal() en public et tu n'auras plus ce problème.

Discussions similaires

  1. [Conception] Ajouter des "0" devant un nombre
    Par xender dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 18/01/2012, 16h19
  2. Ajout de fonctionnalités à des logiciels existants
    Par ictium dans le forum Windows
    Réponses: 1
    Dernier message: 09/10/2006, 02h57
  3. [Conception] Ajout des produits dans un panier
    Par ghyosmik dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/09/2006, 11h17
  4. [C# 2.0] Ajouter des fonctionnalités au MonthCalandar
    Par margagn dans le forum Windows Forms
    Réponses: 2
    Dernier message: 01/08/2006, 16h11
  5. Réponses: 7
    Dernier message: 11/05/2006, 09h30

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