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 :

Question de style ;)


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 14
    Par défaut Question de style ;)
    Est ce mieux de déclarer

    comme ceci (retour par référence)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mon_objet *Mon_objet::function ();
    ou comme cela (retour par pointeur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mon_objet &Mon_objet::function ();
    J'ai l'intime conviction que c'est la même chose !?
    Peut être est ce mieux par référence !?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    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 394
    Par défaut
    C'est la même chose, sauf au niveau syntaxe, et aussi, si c'est un objet alloué dynamiquement, on risque d'avoir un peu de mal à le supprimer avec delete.

    Personnellement, toute fonction qui retourne un nouvel objet, je lui fait retourner un pointeur, car c'est ainsi que new se comporte.
    Après, si la fonction retourne une référence vers un objet existant (dans l'objet dont la fonction est membre, ou bien passé en paramètre), ça dépend...
    Originaire du C, je m'en sors mieux avec les pointeurs, réservant généralement les références aux operator. Mais d'autres ont la philosophie inverse : "Références partout, sauf quand le pointeur est indispensable". Et pour une fonction new-like, je qualifie arbitrairement le pointeur d'indispensable.
    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.

  3. #3
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut
    Et pour une fonction new-like, je qualifie arbitrairement le pointeur d'indispensable.
    Entièrement d'accord. Et vice-versa, une fonction qui renvoie un pointeur me laisse penser qu'il vient d'être fraichement alloué, et qu'il faut que je le delete à la fin de mon utilisation.

    Il y a aussi le cas des fonctions qui peuvent retourner un objet, ou rien du tout, comme une recherche dans un conteneur. En C on penserait tout de suite à utiliser les pointeurs (NULL pour le cas "non trouvé"), mais en C++ on peut aussi utiliser:
    un retour par référence, ou un lancement d'exception le cas écheant, si toutefois les exceptions sont activées
    un retour d'iterateur, qui peut être invalide
    ...

    Enfin le mieux reste de bien documenter ses méthodes, comme ça pas de confusion possible sur l'objet retourné !

  4. #4
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    Et pour une fonction new-like, je qualifie arbitrairement le pointeur d'indispensable.
    tout à fait d'accord aussi. Et c'est pour ça que je met des références partout, sauf pour certains cas dont celui-là. Comme ça quand tu croise un pointeur, tu sais qu'il faut pas faire n'importe quoi avec et peut-être penser à le libérer.

  5. #5
    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
    De manière générale, les pointeurs sont à éviter.
    Utilise les que si tu en as besoin.

    A priori ton truc ce serait plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mon_objet Mon_objet::function ();
    À part si tu veux effectivement retourner une référence vers une variable membre ou autre.

  6. #6
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut
    Citation Envoyé par loufoque
    A priori ton truc ce serait plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mon_objet Mon_objet::function ();
    À part si tu veux effectiver retourner une référence vers une variable membre ou autre.
    En effet il faut clairement se poser la question. On arrive ici à question de conception et non de style. En gros, que souhaites-tu retourner ? Une copie modifiable ? Un simple accès vers la variable ? En lecture / écriture ?

    Je pense qu'une copie systematique de l'objet est dommage car souvent superflue. Retourner une référence constante peut solutionner 2 des problèmes: la copie modifiable et l'accès en lecture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const Objet&   MaClasse::getObjet();
     
    {
           const Objet& acces = getObjet();
                 Objet  copie = getObjet();
    }
    Ca pousse la personne à se demander si elle veut vraiment copier l'objet ou non, puisque à moins d'expliciter cette copie, le compilateur refusera les appels vers des méthodes non constantes.

    -

    Sinon, petite question, j'ai vu beaucoup de biliothèques qui définissaient à la fois un accesseur par référence et un accesseur par référence constante pour le même objet. Est-ce que vous voyez des avantages particuliers ?

  7. #7
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par bigquick
    Citation Envoyé par loufoque
    A priori ton truc ce serait plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mon_objet Mon_objet::function ();
    À part si tu veux effectiver retourner une référence vers une variable membre ou autre.
    En effet il faut clairement se poser la question. On arrive ici à question de conception et non de style. En gros, que souhaites-tu retourner ? Une copie modifiable ? Un simple accès vers la variable ? En lecture / écriture ?

    Je pense qu'une copie systematique de l'objet est dommage car souvent superflue. Retourner une référence constante peut solutionner 2 des problèmes: la copie modifiable et l'accès en lecture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const Objet&   MaClasse::getObjet();
     
    {
           const Objet& acces = getObjet();
                 Objet  copie = getObjet();
    }
    Ca pousse la personne à se demander si elle veut vraiment copier l'objet ou non, puisque à moins d'expliciter cette copie, le compilateur refusera les appels vers des méthodes non constantes.

    -

    Sinon, petite question, j'ai vu beaucoup de biliothèques qui définissaient à la fois un accesseur par référence et un accesseur par référence constante pour le même objet. Est-ce que vous voyez des avantages particuliers ?
    Pour des valeurs de retour, il me semble qu'en déclarant simplement sans référence, il y a des compilateurs qui savent optimiser, en évitant la copie, c'est à dire en faisant comme si l'objet créé sur la pile était la valeur affectée par la valeur de retour de la fonction.

    Enfin bon, il faut bien connaître ses compilateurs pour oser faire ça.

  8. #8
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut
    Oui en effet j'en ai entendu parler ! Mais comme tu dis, si c'est vrai sur un compilateur donné, il faudra peut-être tout refaire à la main si on change de compilateur. Dans ce cas là je suis d'avis de donner un coup de pouce au compilo en lui mettant des références "là où il faut", et des petits mot-clés "const" partout

  9. #9
    Membre émérite Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Par défaut
    Je suis tout à fait d'accord avec bigquick concernant l'aspect "conception" qui vise à ne pas perdre de temps en copiant X fois la variable, mais en en en économisant en passant, quand cela est possible, par référence(si possible constante)...

    Mais il faut avouer que j'aime bien utiliser les pointeurs, pour des raisons évoquées plus haut...


    Effectivement je trouve un peu riqué de se fier au avantage de son compilo, car l'obligation d'en changer risquerait de demander beaucoup plus de temps que prévu...

  10. #10
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par bigquick
    Oui en effet j'en ai entendu parler ! Mais comme tu dis, si c'est vrai sur un compilateur donné, il faudra peut-être tout refaire à la main si on change de compilateur. Dans ce cas là je suis d'avis de donner un coup de pouce au compilo en lui mettant des références "là où il faut", et des petits mot-clés "const" partout
    Oui, d'ailleurs c'est tellement pas connu que j'm'en méfie et que j'fais comme toi.

    Mais parfois j'aimerais bien aller à l'essentiel, et éviter de perdre du temps comme ça.

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par bigquick
    Sinon, petite question, j'ai vu beaucoup de biliothèques qui définissaient à la fois un accesseur par référence et un accesseur par référence constante pour le même objet. Est-ce que vous voyez des avantages particuliers ?
    Oui, si l'objet n'est pas constant, un accesseur non constant par référence non constante permettra de le modifier. S'il est constant, l'accesseur constant par référence constante ne le permettra pas.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  12. #12
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    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 292
    Par défaut
    Citation Envoyé par JolyLoic
    Citation Envoyé par bigquick
    Sinon, petite question, j'ai vu beaucoup de biliothèques qui définissaient à la fois un accesseur par référence et un accesseur par référence constante pour le même objet. Est-ce que vous voyez des avantages particuliers ?
    Oui, si l'objet n'est pas constant, un accesseur non constant par référence non constante permettra de le modifier. S'il est constant, l'accesseur constant par référence constante ne le permettra pas.
    Cas qui fait se demander si le design est vraiment bon ...

    Sinon comme d'autres. Par défaut je prends les références (constantes) quand c'est possible. Des valeurs quand le résultat est construit et que l'on a bien une sémantique de valeur, ou que la copie est bien définie et excessivement peu couteuse (genre < 2-3 ints). Des pointeurs quand il faut pouvoir renvoyer null ou créer une nouvel élément ; et dans ce dernier cas, je préfère de plus en plus souvent l'auto_ptr<> qui lève toute ambiguité quant à ce qui se passe dans la fonction. Les itérateurs pour les fonctions de recherche internes: privées ou protégées.
    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...

  13. #13
    Membre averti
    Inscrit en
    Février 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 14
    Par défaut
    Merci bien à tous pour ces conseils.

  14. #14
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut
    Citation Envoyé par JolyLoic
    Oui, si l'objet n'est pas constant, un accesseur non constant par référence non constante permettra de le modifier. S'il est constant, l'accesseur constant par référence constante ne le permettra pas.
    C'est à dire qu'ils ont écrit les 2 accesseurs "au cas ou" ? (je parle bien du même objet, qui ne peut donc pas être constant et non-constant à la fois ).

    Citation Envoyé par Luc Hermitte
    Cas qui fait se demander si le design est vraiment bon ...
    Aie, c'est justement le cas dans la bibliothèque OpenSceneGraph, qui avait une réputation plutôt correcte niveau design je crois. Dommage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const Drawable* osg::Geode::getDrawable (unsigned int i) const
          Drawable* osg::Geode::getDrawable (unsigned int i)

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    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 394
    Par défaut
    Un même objet ne peut pas être constant et non-constant à la fois, mais deux pointeurs/références différents sur cet objet peuvent être l'un const, l'autre non...

    Ainsi, c'est courant de passer une référence const d'objet à une fonction qui ne le modifie pas...
    Cette fonction peut alors utiliser les accesseurs const, mais pas les accesseurs non-const.
    Cela garantit que la fonction possède un accès en lecture à l'objet.

    D'autres fonctions, elles peuvent avoir besoin d'un accès en écriture...



    Mais il est vrai que les accesseurs par références peuvent être remplacés par des getters/setters...
    Mais c'est souvent utilisé pour les accès par opérateur, notamment l'opérateur [].
    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.

  16. #16
    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
    Enfin bon, il faut bien connaître ses compilateurs pour oser faire ça.
    Les auteurs du C++ standard recommendent de faire "ça".
    C'est au compilateur de se débrouiller pour faire en sorte que le code final soit optimisé.

  17. #17
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut
    Citation Envoyé par loufoque
    Enfin bon, il faut bien connaître ses compilateurs pour oser faire ça.
    Les auteurs du C++ standard recommendent de faire "ça". C'est au compilateur de se débrouiller pour faire en sorte que le code final soit optimisé.
    Euh, je suis d'accord pour laisser au compilateur le soin d'optimiser le bas niveau; je trouve ça inutile de rendre le code illisible pour optimiser 3 lignes d'une fonction, alors qu'il y a surement des goulots d'étranglement ailleurs ... (je ne sais plus qui donnait l'exemple d'un bubblesort optimisé par des décalages de bits )

    Pour des valeurs de retour, il me semble qu'en déclarant simplement sans référence, il y a des compilateurs qui savent optimiser, en évitant la copie, c'est à dire en faisant comme si l'objet créé sur la pile était la valeur affectée par la valeur de retour de la fonction.
    Je ne suis pas sur d'avori vraiment compris ce que HanLee voulait dire.... Mais si c'est que certains compilateurs remplacent des retours par copie par des référence si les copies ne sont pas modifiées, alors non je ne suis pas d'accord pour laisser ce travail au compilateur

    On lui facilite beaucoup la tache en faisant ce petit effort soi-même (est-ce que j'ai vraiment besoin d'une copie ?). Et à mon avis, ça nuit à la lisibilité du code puisqu'une référence constante prévient clairement "je te donne un accès, mais en lecture seule" (le client pourra faire une copie locale si il y tient). Alors qu'un retour par copie se lirait plutôt "tiens, voilà une copie pour en faire ce que tu veux". On sent bien les 2 approches différentes.

    Enfin, c'est surement une question de goûts

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

Discussions similaires

  1. Une question de style
    Par sethlegoauld dans le forum Ext JS / Sencha
    Réponses: 1
    Dernier message: 05/08/2010, 22h51
  2. une question de style ?
    Par barbouille dans le forum C
    Réponses: 10
    Dernier message: 16/11/2008, 21h41
  3. [POO] Question de style et méthode de codage
    Par elitemedia dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2006, 22h03
  4. [RCP] Petite question de style :)
    Par Laph95 dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 06/10/2006, 16h14

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