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 :

Interêt propriétés privés - getter/setter public


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 214
    Par défaut Interêt propriétés privés - getter/setter public
    Bonjour,

    Je me familiarise peu à peu avec un projet développé par des personnes qui ne sont plus dans la société. Et je me pose une question :

    Quel est l'intérêt de créer des propriétés privés dans une classe si dans cette même classe des getter/setter publics sont systématiquement créés pour ces propriétés ?


    Code l'entête : 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
    class CCaracteristquesObjet  
    {
    public:
    	CCaracteristquesObjet();
    	virtual ~CCaracteristquesObjet();
     
    	double GetHauteur();
    	void SetHauteur(double value);
     
    	double GetLargeur();
    	void SetLargeur(double value);
     
    protected:
    	double m_dHauteur;
    	double m_dEmprise;
    };

    Code Un getter/setter type trouvé partout dans le code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    double CCaracteristquesObjet::GetHauteur()
    {
    	return m_dHauteur;
    }
     
    void CCaracteristquesObjet::SetHauteur(double value)
    {
    	m_dHauteur= value;
    }


    Personnellement, j'aurais tendance à considérer comme équivalent et plus simple de supprimer les getter/setter et d'avoir des propriétés publiques.

    Est-ce que dans certains cas, tel que sont ces getter/setter ou après quelques légères modifications, il y aurait un réel intérêt de créer de getter/setter de cette façon ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Argh de la notation hongroise !

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Y'a pas de réel intérêt, si ce n'est l'encapsulation à tout prix dans ton cas.
    On pourrait considérer que ce n'est pas normal d'avoir accès à des variables directement car tu en fais ce que tu en veux. L'intérêt d'avoir des méthodes est le contrôle. Tu ne laisses pas le client de ta classe faire n'importe quoi. Tout est correctement initialisé, et la classe respecte ses préconditions, postconditions et invariants.

    Dans certains cas, il arrive cependant qu'on laisse des variables publiques, mais ce sont des pratiques à éviter, globalement.

    Hope it helps !

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    L'avantage, c'est que tu peux à tout moment changer ce qu'il y a "sous le capot".
    Comme par exemple, rajouter un contrôle si tu n'accepte que les valeurs positives, etc.

    Par contre, je conseillerais de toujours implémenter ces accesseurs en inline, ainsi il n'y aura pas d'impact sur la performance.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Oui enfin de toute façon c'est le compilo qui décide alors... C'est quand même un peu mitigé cet "inline"...

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    En effet, mais si la fonction est dans un autre fichier source, le compilo ne pourra absolument pas l'inliner.
    Donc, il faut lui donner au moins la possibilité de le faire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Citation Envoyé par poukill Voir le message
    Oui enfin de toute façon c'est le compilo qui décide alors... C'est quand même un peu mitigé cet "inline"...
    Je suis pas d'accord, on arrive a savoir assez facilement ce que parviendra ou pas le compilateur à inliner. Dans ce cas, il n'y a aucun doute (je peux me tromper mais bon...) sur le fait qu'il y arrivera.

    Si on ne pouvait pas être sûr de certains inline, les bases de la métaprog seraient remises en cause. (en fait, par "c'est le compilo qui décide", il faut plutôt entendre "le compilateur n'est pas censé indiquer une erreur lorsqu'un inline est impossible à effectuer").

    Jérôme, pour la réponse, celles que Médinoc et Luc t'ont donné me semblent relativement claires :

    Dans l'état actuel, cette encapsulation ne sert à rien, mais si dans le futur on souhaite contrôler un peu mieux l'accès à la donnée (ajouter un contrôle pour ne pas la rendre inférieure à zéro par exemple), on pourra le faire facilement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    inline double
    CCaracteristquesObjet::GetHauteur() const
    {
      return m_dHauteur;
    }
     
    inline void
    CCaracteristquesObjet::SetHauteur(double value)
    {
      if (value >= 0.)
        m_dHauteur= value;
    }
    Le concept de propriété évoqué par Luc me semble intéressant. Luc, disposes-tu d'une définition claire ?

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    Sauf qu'il ne peut pas avoir pas y raison de réponse complète qui tienne en moins d'une page ...

    Citation Envoyé par poukill Voir le message
    Y'a pas de réel intérêt, si ce n'est l'encapsulation à tout prix dans ton cas.
    Il n'encapsule rien du tout. Il expose au contraire toutes ses variables membres.

    Il faut commencer par distinguer variables membres et propriétés. Après on peut parler sérieusement.
    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...

  9. #9
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Qui plus est, il n'y a pas de réponse ultime à cette question.

    Pourquoi ? Cela dépend de la nature de ton attribut, entre autres. Tu voudras parfois faire des vérifications avant donner la main au code qui veut s'en servir, d'autres fois des vérifications avant de changer sa valeur.

    Par contre, quelle que soit la nature, un avantage de mettre un couple getter/setter est que l'on peut changer le code facilement, et que cela se répercutera sur tout ton programme. En effet, si tu travaillais directement sur l'attribut en public, tu devrais modifier chaque code appelant, ce qui risquerait d'être assez long et désagréable.

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

Discussions similaires

  1. [VB.NET] Génération automatique Property (getter / setter)
    Par Husqvarna dans le forum Windows Forms
    Réponses: 7
    Dernier message: 23/07/2020, 11h55
  2. Réponses: 10
    Dernier message: 20/09/2006, 12h53
  3. Emploi dans le privé ou le public
    Par delphine_lep dans le forum Emploi
    Réponses: 2
    Dernier message: 09/01/2006, 12h28
  4. [Info]générer automatiquement les getters / setters
    Par lr dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 01/02/2005, 10h14
  5. configuration getter & setter
    Par otb82 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 15/10/2003, 15h53

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