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++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 42
    Points : 26
    Points
    26
    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 é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
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 42
    Points : 26
    Points
    26
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 42
    Points : 26
    Points
    26
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    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 éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    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.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    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.
    C'est vrai, mais ça permet, en loguant un message dans la fonction Ref par exemple, de pouvoir savoir quelle partie du code modifie quoi et quand (si on a un grave souci à un moment)

    En la mettant en protected, on est sur que toutes les autres classes passeront par Ref pour la modifier (et on peut même utiliser Ref dans la classe qui contient les variables membres pour y accéder)

    Je trouve que ça sécurise plus le code.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Contre qui? Contre quoi?
    Contre les autres classes, et on peu même le faire contre sa propre classe.

    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    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,
    invariants = const ?

    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    - 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.
    tu veux dire le type de la Ref est fixé, donc ça ne peut plus évoluer ?


    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    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.
    Je n'arrive à mettre qu'une seule de mes classes dans une de ces 3 catégories, celle des vertex, dont les membres sont publics.
    (d'ailleurs ça me parais bizarre, car elle contient des vecteur3, qui ont des accesseurs)
    (je dois donc mettre aussi des accesseurs)

  10. #10
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par manonoc Voir le message
    C'est vrai, mais ça permet, en loguant un message dans la fonction Ref par exemple, de pouvoir savoir quelle partie du code modifie quoi et quand (si on a un grave souci à un moment)
    Regarde l'exemple de http://www.developpez.net/forums/d58...r/#post3487954

    Tu as beau mettre ce que tu veux dans Ref, ça ne peut pas logger au moment où c'est modifié.
    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.

  11. #11
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par manonoc Voir le message
    C'est vrai, mais ça permet, en loguant un message dans la fonction Ref par exemple, de pouvoir savoir quelle partie du code modifie quoi et quand (si on a un grave souci à un moment)
    J'aimerais bien savoir comment tu fais pour logger les endroits ou on modifie une reference. Tu peux trouver les endroits qui la demande mais une fois qu'elle est dans la nature...

    invariants = const ?
    const force un invariant, mais tu peux en avoir d'autres qui ne sont pas exprimable comme ca.

    tu veux dire le type de la Ref est fixé, donc ça ne peut plus évoluer ?
    Non, je veux dire que, comme il y a une reference, la classe devra continuer a garder ce membre, ne pourra pas le remplacer par un calcul uniquement quand on en a besoin (voir l'exemple de la norme dans la discussion deja citee; edit, c'est le message que donne Loic juste ci-dessus).

    Je n'arrive à mettre qu'une seule de mes classes dans une de ces 3 catégories, celle des vertex, dont les membres sont publics.
    (d'ailleurs ça me parais bizarre, car elle contient des vecteur3, qui ont des accesseurs)
    (je dois donc mettre aussi des accesseurs)
    Eh bien, on doit utiliser des techniques de conception differentes. Mais mon experience me dit que les machins hybrides resultent souvent d'une conception pas claire ou de compromis(sion?)s plus ou bien bien assumes. Je n'ai a priori rien contre les compromis; ce qui m'inquiete c'est de ne pas les reconnaitre comme tels.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par manonoc Voir le message
    invariants = const ?
    Un exemple d'invariants qu'une structure de données à base de Half-edges (c'est de la 3D) doit maintenir :

    http://www.cgafaq.info/wiki/Half_edg...ral#Invariants

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Contre qui? Contre quoi?
    Contre les autres classes, et même la classe qui contient la variable, si on y accède, (même à l'intérieur) par Ref

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    J'aimerais bien savoir comment tu fais pour logger les endroits ou on modifie une reference. Tu peux trouver les endroits qui la demande mais une fois qu'elle est dans la nature...
    c'est vrai que ceci ne sert à rien, la variable n'est pas encore modifiée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SCALAR& Vector3::RefX()
    {
    LOGUER_INSTANCE(x)
    return x;
    }

    Donc tu me donne la réponse à ma question (voir question du début):
    Dans ce cas, le Set est ce qu'il me faut !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Vector3::SetX(SCALAR s)
    {
    LOGUER_INSTANCE(s)
    x = s;
    }
    (je peux loguer la pile d'appel d'autre part)

    et Ref n'est à utiliser qu'avec parcimonie, ou peut-être même pas du tout, si l'on veut faire ce genre de truc.

    Vous ne faites jamais de fonction Ref dans vos classes ?

    merci

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Si les get est pas terrible.
    Que penser du get de boost::tuple qui retourne une référence?

  16. #16
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Si les get est pas terrible.
    Que penser du get de boost::tuple qui retourne une référence?
    Quelles alternatives il y avait? Avoir un nombre de champs variables appeles first, second, third, fourth, fith, sixth, ...?
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  17. #17
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Quelles alternatives il y avait? Avoir un nombre de champs variables appeles first, second, third, fourth, fith, sixth, ...?
    Ben je ne sait pas trop.
    Un truc comme ici (peut être besoin de variadic template?!):
    http://www.developpez.net/forums/d59...e/#post3550484

    Ou appeler le get autrement car c'est plus un accés directe.

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