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 :

que choisir entre Ref et Set


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 42
    Par défaut que choisir entre Ref et Set
    bonjour,

    Pour ma classe de vecteur, j'ai mis dans le .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ---------------------------------------------------------------
    	const SCALAR			GetX() const	{return x;}
    	const SCALAR			GetY() const	{return y;}
    	const SCALAR			GetZ() const	{return z;}
     
    	void					SetX(SCALAR s)	{x = s;}
    	void					SetY(SCALAR s)	{y = s;}
    	void					SetZ(SCALAR s)	{z = s;}
     
    	SCALAR&					RefX()			{return x;}
    	SCALAR&					RefY()			{return y;}
    	SCALAR&					RefZ()			{return z;}
    ---------------------------------------------------------------
    mais j'aurais tendance à ne me servir seulement de Ref (pour avoir une référence, mais aussi pour les affectations):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	e.RefX() = fabs(max0 - min0) / 2;
    quand il faudrait mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	e.SetX(fabs(max0 - min0) / 2);
    Finalement à quoi sert Set si on a un Ref ?

    (vous allez me dire "quand on veut faire une affectation sans avoir besion d'une référence", mais alors finalement Set ne me sert pas)

    par exemple les opérations du genre:
    sont plus rapides que:
    non ?
    (mais je suppose que cela se décide dans le compilo)

    merci

  2. #2
    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
    A quoi sert d'encapsuler si tu décapsules aussitôt avec un ref, ou même avec un couple set/get ?

    Là, je ne vois pas l'intérêt de ne pas donner un accès direct aux 3 ordonné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...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 42
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    A quoi sert d'encapsuler si tu décapsules aussitôt avec un ref, ou même avec un couple set/get ?

    Là, je ne vois pas l'intérêt de ne pas donner un accès direct aux 3 ordonnées.
    avant je les avait mise en public, mais pour avoir un meilleur controle, je les ai mises en protected.
    Sinon, comment veux tu mettre à jour d'une manière controlée les variables protected ?

    Cela sert au controles de modifications pour les fonctions const, les arguments const:
    SCALAR SqDistPointOBB(const Vector3& p) const;

    les arguments passent par référence, donc plus rapidement que par copie, mais on ne peut pas les modifier.

  4. #4
    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
    Et quel contrôle crois-tu avoir gagné en faisant ainsi ?

    Pour plus de détails, voir le thread http://www.developpez.net/forums/d58...-constructeur/ qui bien que partant d'une question différente s'est assez attardé sur ce sujet.
    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.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 42
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Et quel contrôle crois-tu avoir gagné en faisant ainsi ?

    Pour plus de détails, voir le thread http://www.developpez.net/forums/d58...-constructeur/ qui bien que partant d'une question différente s'est assez attardé sur ce sujet.
    Luc Hermitte parle du fait que s'il y a des accesseurs (set et get) alors pas la peine de mettre en protected, il faut mettre les variables en public.
    Mais alors à quoi sert le const pour une fonction ?

    Pour moi, il faut mettre en protected les variables membres, et faire des getters et setters. On protège ainsi ses accès.
    Evidemment, quand on donne un Ref sur une variable membre, c'est comme si elle était publique. Mais ça se passe dans une fonction qui a le droit de modifier l'instance, donc tout va bien.

    Sinon, je pense avoir gagné la sureté, que si je mets une fonction const, je serais sur que ma classe ne sera pas modifiée:

    Dans une fonction prenant en argument un const vector3, je ne pourrais pas utiliser les Ref.

    Il est bon d'avoir des fonctions que testent la classe, et des fonctions qui modifient la classe.

    Comment faites vous ?

  6. #6
    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
    Je ne suis pas certain de suivre ton raisonnement...

    Si tu mets ta variable membre en public, on ne pourra quand même pas la modifier dans une fonction où on a passé un vecteur constant.
    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.

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par manonoc Voir le message
    Pour moi, il faut mettre en protected les variables membres, et faire des getters et setters. On protège ainsi ses accès.
    Contre qui? Contre quoi?

    Evidemment, quand on donne un Ref sur une variable membre, c'est comme si elle était publique. Mais ça se passe dans une fonction qui a le droit de modifier l'instance, donc tout va bien.
    Il me semblait que le contrôle d'accès était là pour limiter les endroits où on accède à la représentation interne avec deux objectifs principaux:
    - pouvoir contrôler plus facilement que les invariants sont respectés,
    - pouvoir changer la représentation interne.
    Fournir une réference vers un membre, ça n'aide en rien le contrôle des invariants et ça contraint l'évolutivité de la classe.

    Comment faites vous ?
    Soit la classe est un conteneur -- et les membres sont publics -- soit elle est une valeur -- et elle est généralement invariante -- soit elle est une entité -- et on modifie son état interne avec une granularité autre que membre à membre.

    Pour moi, tu es dans le second cas: tu fournis des constructeurs et des fonctions qui vont bien mais la première possibilité n'est pas exclue.

Discussions similaires

  1. [Cookies] Que choisir entre session et cookie
    Par black is beautiful dans le forum Langage
    Réponses: 10
    Dernier message: 08/06/2008, 18h27
  2. Que choisir entre Sous domaine et repertoire
    Par badrel dans le forum Référencement
    Réponses: 2
    Dernier message: 31/03/2008, 23h05
  3. Réponses: 3
    Dernier message: 13/03/2008, 15h41
  4. Réponses: 4
    Dernier message: 20/10/2007, 22h36
  5. Que choisir entre l'objet COM et le Spreadsheet
    Par Ivan Isaak dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 31/07/2006, 08h38

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