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

Langage C++ Discussion :

Documentation : getter by copy vs getter by reference


Sujet :

Langage C++

  1. #1
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Points : 176
    Points
    176
    Par défaut Documentation : getter by copy vs getter by reference
    Bonjour.

    Considérons le code suivant :

    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
    class MyClass
    {
        // Getters by copy ?
        public:
            inline std::string fullName() const {return _firstName+_lastName;}
     
        // Getters by reference ?
        public:
            inline const std::string& firstName() const {return _firstName;}
            inline const std::string& lastName() const {return _lastName;}
     
        // Data members
        protected:
            std::string _firstName;
            std:::string _lastName;
    };
    Ma question ne porte pas sur le bien-fondé de retourner des string par référence ou par copie, il s'agit juste la d'un exemple. On pourrait imaginer que _firstName et _lastName sont des classes très lourdes et qu'il est mieux de les retourner par référence.

    La question que je me pose est vis-à-vis de ma documentation : comment appeler la catégorie des fonctions firstName et lastName (accès à des data members) et comment appeler la catégorie des fonctions comme fullName (objets construits à partir des data members) ?

    Je cherche donc deux mots anglais (si possible assez clairs) pour baptiser ces deux catégories de fonctions.

    Merci beaucoup

    P.S. : d'ailleurs, je ne sais même pas si on peut qualifier fullName() de getter, parce qu'il ne retourne pas directement un data member. Pouvez-vous m'éclairer sur ce point ?

    EDIT : sur SO, quelqu'un semble dire que je peux mélanger sans problème mes getters par copie et mes getters par référence, sans besoin de faire de distinction. Que pensez vous de ce point de vue ?

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2008
    Messages : 41
    Points : 47
    Points
    47
    Par défaut
    Le problème avec le retour par référence, c'est que tes variables membres sont exposées et que ce sont à la fois des getter et des setter.

    Pour fullName(), c'est un getter, dans le sens où on accède à des informations de ta classe, sous une forme comme une autre (on pourrait penser à plusieurs fonctions qui retourneraient des ordres de nom et prénom différend, rendant encore plus explicite la forme retournée et facilitant la lecture).

    Donc voila, pas d'idée pour firstName() et lastName(). Par contre, fullName est clairement un getter.
    En espérant avoir pu aider.

    P.S. Oui, tu peut mélanger sans problème (c'est d'ailleur ce que je fais, ...) vu qu'ils concernent tous directement les membres de ta classe sans y faire de traitement.

  3. #3
    Membre habitué
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Points : 176
    Points
    176
    Par défaut
    Rebonjour et merci pour cet élément de réponse.

    Je crois que j'ai résolu mon problème. Je pense que mon problème était de ne pas renvoyer de copie constante lorsque je renvoyais une copie. Si je renvoie une copie constante (dans le cas d'une copie) ou une référence constante (dans le cas d'une référence), alors je pense que cela devient un détail d'implémentation et pour l'utilisateur, tous sont des getters. Bon évidemment dans tout cela, je considère que c'est son problème si l'utilisateur fait mumuse avec des const_cast.

    Vous en pensez quoi ?

  4. #4
    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
    Que les getters sont un moyen pour accéder en lecture à une propriété (!= attribut).

    Peu importe comment elle est véritablement implémentée. L'utilisateur n'a pas à le savoir. Il sait déjà qu'il existe une donnée dont l'état est exposé (et non un service), c'est déjà plus qu'assez.


    De la lecture au sujet des getters (et surtout des setters) :
    - http://www.javaworld.com/javaworld/j...2-toolbox.html
    - http://stackoverflow.com/questions/5...d-setters-evil
    - www.idinews.com/quasiClass.pdf
    - http://blog.emmanueldeloget.com/inde...des-accesseurs
    - http://blog.emmanueldeloget.com/inde...loi-de-demeter

    PS: pinaillages :
    - le inline est redondant et inutile ici, la syntaxe est déjà assez lourde sans lui.
    - le préfixage par '_' est peu commun en C++ -> http://cpp.developpez.com/faq/cpp/?p...eurs_interdits
    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...

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par MaximeL Voir le message
    Le problème avec le retour par référence, c'est que tes variables membres sont exposées et que ce sont à la fois des getter et des setter.
    Pas dans le cas présent car c'est une référence constante qui est renvoyée.

    Le compilateur se plaindra donc si tu essaye de modifier la valeur renvoyée, et c'est très bien ainsi

    Il faut d'ailleurs noter le fait que, si tu renvoie un membre par référence, la référence doit etre constante et la fonction qui le fat doit aussi être déclarée constante, de manière à présenter toutes les garanties du point de vue de la const correctness.

    Typiquement, les accesseurs doivent etre des fonctions constantes (pour pouvoir être appelée depuis un objet constant) et doivent donc veiller à ce que la modification de la valeur renvoyée sera impossible (pour assurer la const correctness).

    Le compilateur refuserait donc que tu essayes de renvoyer une référence non constante (mais accepte parfaitement que tu renvoie une copie ou une référence constante )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/06/2014, 09h43
  2. [Toutes versions] vérrouiller document contre la copie du contenu vers autre document
    Par capitainesis dans le forum Word
    Réponses: 4
    Dernier message: 08/11/2012, 21h09
  3. POO: getters retourne une copie ?
    Par ikuzar dans le forum Langage
    Réponses: 2
    Dernier message: 22/06/2012, 11h37
  4. Getter, renvoyer une référence ou une copie ?
    Par the_angel dans le forum C++/CLI
    Réponses: 6
    Dernier message: 13/04/2012, 12h41
  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