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 :

[notation] Noms des parametres du constructeur


Sujet :

C++

Vue hybride

r0d [notation] Noms des... 15/07/2008, 15h35
wiztricks Je préfèrerais donner... 15/07/2008, 15h44
Lucien63 Je viens de tester ton code.... 15/07/2008, 15h49
wiztricks c'est vrai que cela compile... 15/07/2008, 15h56
3DArchi Je préfère aussi utiliser une... 15/07/2008, 15h52
Luc Hermitte [Suis-je le seul à voir ce... 15/07/2008, 15h58
r0d Effectivement. Je parlais... 15/07/2008, 16h56
HanLee Moi j'fais bêtement comme ça.... 15/07/2008, 15h56
yan que pense tu d'une sémantique... 17/07/2008, 09h58
JolyLoic Je ne sais pas qui est le... 17/07/2008, 10h55
yan je sais pô non plus :aie: ... 17/07/2008, 11h36
Luc Hermitte Je vais plus loin, j'évite de... 17/07/2008, 13h03
bredelet Dans un langage a prototypes,... 21/07/2008, 17h54
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut [notation] Noms des parametres du constructeur
    Bonjour à tous,

    j'ai une question un peu bête, mais je suis curieux de savoir comment vous faites.

    Voilà, prenons un exemple, j'ai une structure Point:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct Point
    {
       int x;
       int y;
    };
    Maintenant je veux lui faire un constructeur qui prend un x et un y en paramètre. Je voudrais faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Point
    {
       Point( int x = 0, int y = 0 ) : x(x), y(y) {}
       int x;
       int y;
    };
    Mais bien évidemment, je n'ai pas le droit de faire ça. Il faut donc que je trouve un autre nom, soit pour les variables membres, soit pour les paramètres passés au constructeur.

    Or, la sémantique est importante. Et dans mon cas, je veux que x et y restent en accès public.

    Vous voyez ce que je veux dire? Comment résolvez-vous ce problème?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 729
    Par défaut
    Je préfèrerais donner d'autres noms aux variables de la classe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct Point
    {
       int c_x; // coordonnée en x
       int c_y; // coordonnée en y
    };
    Mais en général je préfère mettre déclarer des Setter/Getter "inline" pour toucher aux variables.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Citation Envoyé par r0d
    Mais bien évidemment, je n'ai pas le droit de faire ça. Il faut donc que je trouve un autre nom, soit pour les variables membres, soit pour les paramètres passés au constructeur.
    Je viens de tester ton code. Il compile sans problème aussi bien sous gcc que sous borland C++.
    Donc a-t-on vraiment pas le droit ?

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 729
    Par défaut
    c'est vrai que cela compile et qu'on a peut être le droit... Mais côté lisibilité c'est pas top.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Je préfère aussi utiliser une notation me donnant la porté de mes variables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Point
    {
       int m_x;
       int m_y;
    	Point( int P_x = 0, int P_y = 0 ) : m_x(P_x), m_y(P_y) {}
    };
    Sinon, tu peux faire dans l'explicite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Point
    {
       int x;
       int y;
    	Point( int x = 0, int y = 0 ) {this->x = x;this->y = y;}
    };
    Enfin, si tu veux pouvoir faire Point.x, alors change le nom des paramètres.
    P.S.: ton code compile en effet sous gcc et VC++.

  6. #6
    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
    [Suis-je le seul à voir ce que tu veux dire ?]
    Effectivement, il y a la solution de l'explicite -- que je n'aime pas du tout.

    Sinon, il te faut trouver un autre nom à tes paramètres.
    Par chance, le style de codage imposé le client (au taf') demande à ce que tous les paramètres soient post-fixés par des tirets-bas -- ce qui déroute un poil après la lecture de XC++.
    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...

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Effectivement. Je parlais surtout de sémantique en fait: comment faire pour résoudre ce problème de manière à faire en sorte que le code reste sémantiquement correct. Par sémantiquement correct, je veux dire qu'à la lecture d'une ligne de code, il est possible de déduire le rôle de chaque variable sans avoir besoin de voir le reste du code. Ce point là est pour moi de plus en plus important.

    Donc effectivement, il y a les notations préfixées qui résolvent ce problème. Moi j'utilise le 'm_' pour les variables membres et le tour est joué.

    Mais dans le cas où l'on aimerait bien garder des variables membres en accès public, le 'm_' perd sa pertinence sémantique.

    On peut aussi préfixer les paramètres. De la même façon, je trouve que l'on y perd en sémantique. Ou alors on préfixe systématiquement les paramètre des fonctions et constructeurs, mais là je trouve que c'est un peu lourd.

    Les accesseurs également. Le fait de laisser une variable membre en accès public n'est pas totalement anodin du point de vue de la conception.

    Bon, je vous avoue que ce n'est pas une discussion qui va révolutionner le c++ , mais comme je le disais, je crois qu'au plus on avance, au plus on se rend compte que la sémantique est importante. Et j'aime bien discuter de ce genre de questions

  8. #8
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Pour moi, tes variables x et y qui sont passées en paramètres sont des variables locales et doivent être sémantiquement marquées tel quel, ainsi que les types de ces variables (comme pour toutes d'ailleurs ). Voir la convention de notation hongroise (un peu stricte mais pas bête). Voici ton code tel que je le ferais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct Point
    {
       public:
          Point(const int l_ix = 0, const int l_iy = 0 ) : m_ix(l_ix), m_iy(l_iy) {};
          int GetX() const {return m_ix;};
          int GetY() const {return m_iy;};
          void SetX(const int l_ix) {m_ix = l_ix;};
          void SetY(const int l_iy) {m_iy = l_iy;};
       private:
          int m_ix;
          int m_iy;
    };
    Citation Envoyé par r0d
    Donc effectivement, il y a les notations préfixées qui résolvent ce problème. Moi j'utilise le 'm_' pour les variables membres et le tour est joué.

    Mais dans le cas où l'on aimerait bien garder des variables membres en accès public, le 'm_' perd sa pertinence sémantique.

    Les accesseurs également. Le fait de laisser une variable membre en accès public n'est pas totalement anodin du point de vue de la conception.
    Effectivement, les variables membres d'une classe doivent être marquées d'un 'm_', mais je comprends quand tu dis que le caractère publique de la variable casse un peu tout... J'aurais alors tendance à te dire que aucune variable membre ne doit être publique mais doit être utilisée de l'extérieur via des accesseurs. Je ne suis pas un star de la conception, mais tu es arrivé au point d'avoir des variables membres publiques, c'est que ta conception n'est pas forcément la bonne. Mais ce n'est que mon point de vue.

  9. #9
    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 r0d Voir le message
    Bonjour à tous,

    j'ai une question un peu bête, mais je suis curieux de savoir comment vous faites.

    Voilà, prenons un exemple, j'ai une structure Point:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct Point
    {
       int x;
       int y;
    };
    Maintenant je veux lui faire un constructeur qui prend un x et un y en paramètre. Je voudrais faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Point
    {
       Point( int x = 0, int y = 0 ) : x(x), y(y) {}
       int x;
       int y;
    };
    Mais bien évidemment, je n'ai pas le droit de faire ça. Il faut donc que je trouve un autre nom, soit pour les variables membres, soit pour les paramètres passés au constructeur.

    Or, la sémantique est importante. Et dans mon cas, je veux que x et y restent en accès public.

    Vous voyez ce que je veux dire? Comment résolvez-vous ce problème?
    Moi j'fais bêtement comme ça.

    Côté lisibilité, aucun problème, quand tu as des classes avec des fonctions membres qui ont des responsabilités triviales et directes.

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    que pense tu d'une sémantique comme cela?
    http://qt.developpez.com/doc/4.4/qpoint/

  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
    Je ne sais pas qui est le "tu" de la question, mais je vais répondre quand même...

    Pour moi, cette classe n'encapsule aucunement le fait qu'elle possède une variable membre x, et une autre y, toutes deux de type entier (je vois mal comment implémenter par exemple la fonction rx autrement). Dans ce cas, autant mettre directement en accès public ces variables.

    C'est plus clair, plus simple, moins hypocrite, et peut-être même plus performant.

    A mon avis, le seul avantage d'écrire cette classe ainsi est d'éviter d'avoir à répondre sans cesse à des questions de gens qui n'ont pas bien compris l'encapsulation et en ont retenu une mauvaise règle qui serait : Tout mettre en privé tout le temps.

    Si je voyais une telle classe dans du code dont j'ai la responsabilité, je la modifierais probablement. Sans compter qu'elle a d'autre problèmes (qu'est-ce que la longueur d'un point ?... Ne serait-il pas préférable d'en faire une classe immuable...). J'aime bien Qt dans son ensemble, ne serait-ce que par manque de concurrence, mais il m'arrive très souvent de ne pas trop aimer ce que j'y vois quand j'entre dans les détails.
    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
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Je ne sais pas qui est le "tu" de la question, mais je vais répondre quand même...
    je sais pô non plus

    C'est plus clair, plus simple, moins hypocrite, et peut-être même plus performant.
    Pourquoi moins hypocrite???

    A mon avis, le seul avantage d'écrire cette classe ainsi est d'éviter d'avoir à répondre sans cesse à des questions de gens qui n'ont pas bien compris l'encapsulation et en ont retenu une mauvaise règle qui serait : Tout mettre en privé tout le temps.
    Pas bien compris ou mal appris... je doit faire partie de ceux là , sauf que j'aime pas private et utilise plutôt protected....
    Pour moi une class avec des fonctions protège ses données par de get/set. Cela permet surtout, de pouvoir ajouter du code si il le faut (c'est surement pas le plus propre).
    Une class contenant que des données n'as pas de get/set.

    J'aime bien Qt dans son ensemble, ne serait-ce que par manque de concurrence, mais il m'arrive très souvent de ne pas trop aimer ce que j'y vois quand j'entre dans les détails.
    Aprés c'est difficile de gérer du code aussi gros sans lacune...

  13. #13
    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
    Citation Envoyé par Mongaulois
    Pour moi une class avec des fonctions protège ses données par de get/set. Cela permet surtout, de pouvoir ajouter du code si il le faut (c'est surement pas le plus propre).
    Une class contenant que des données n'as pas de get/set.
    Je vais plus loin, j'évite de mettre des setXXX(), et privilégie immuabilité (pour les données qui n'ont pas de raison de changer unitairement), fonctions dédiées qui changent tout de manière cohérente, et mutateurs non triviaux qui vont avoir un nom qui n'est pas en setXXX().

    Chez moi, les get sont régulièrement nécessaires pour des raisons de débuggage via fichiers de log.


    Quant au rx() de la classe montrée. Mon premier réflexe est "Quelle horreur!" Dans le genre je n'encasule rien, mais je fais croire à ceux qui n'ont pas compris l'encapsulation que je l'ai comprise, elle est pas mal.
    /me adepte du "ne jamais donner un accès direct et complet aux détails membres" (i.e. pas d'accès en référence non constante sur les attributs privés)
    Enfin. Je dis ça, mais peut-être qu'en interne qui ont mis en œuvre la classe comme le type extent_t d'un concurrent un jour peut-être. C'est sûr que chez eux le côté : "je peux changer l'implémentation de façon quasi-transparente sans impacter le code client" est un plus vrai que ce peut l'être dans un code qui n'est pas celui d'une bibliothèque vendue à des clients.


    Quant à protégé/privé, quand j'ai le temps de faire propre, j'ai tendance à privilégier la données en privé, quitte à fournir un mutateur non trivial (ou pas de mutateur du tout), et un accesseur, tous deux protégés. Cela me donne un meilleur contrôle des invariants.
    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...

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    et privilégie immuabilité (pour les données qui n'ont pas de raison de changer unitairement)
    Pourrais tu explique ce que tu entend par immuabilité? J'ai du mal à comprendre le principe...

    C'est sûr que chez eux le côté : "je peux changer l'implémentation de façon quasi-transparente sans impacter le code client" est un plus vrai que ce peut l'être dans un code qui n'est pas celui d'une bibliothèque vendue à des clients.
    C'est pour cela que je trouve l'idée intéressante... A chaque fois que j'ai une class qui manipule ses données, je me dit qu'il faut mieux une fonction pour modifier, si besoin, certain comportement du code (optimisation) dans le futur...
    Par exemple, je décide de stocker la norme d'un vecteur, pour ne pas la recalculer à chaque fois. Seulement, à chaque fois que je change x ou y, il faut la recalculer. Si je n'ai pas utiliser de fonction (get/set ou autre) je n'ai aucune possibilité de le savoir.

    Quant à protégé/privé, quand j'ai le temps de faire propre, j'ai tendance à privilégier la données en privé, quitte à fournir un mutateur non trivial (ou pas de mutateur du tout), et un accesseur, tous deux protégés. Cela me donne un meilleur contrôle des invariants.
    et donc des get/set.... non?

    Ce que je comprend, en lisant d'autre thread, le problème est la signification de get/set qui est trop vague et porte à confusion et qu'il faut mieux utiliser un nom plus explicite. Après faut trouver...
    Mettre un membre public au lieu de le protéger, je n'ai pas trouvé de bonne raison ou exemple... Sauf une class contenant que des données.

  15. #15
    Membre chevronné

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Par défaut
    Citation Envoyé par r0d Voir le message
    Bonjour à tous,

    j'ai une question un peu bête, mais je suis curieux de savoir comment vous faites.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Point
    {
       Point( int x = 0, int y = 0 ) : x(x), y(y) {}
       int x;
       int y;
    };
    Or, la sémantique est importante. Et dans mon cas, je veux que x et y restent en accès public.

    Vous voyez ce que je veux dire? Comment résolvez-vous ce problème?
    Dans un langage a prototypes, au lieu de constructeurs tu aurais par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Point = struct(x <= 0.0, y <= 0.0);
    A = Point(x <= 3.0, y <= 1.5);
    B = A(x <= -2.0);             // B.x = -2.0, B.y = 1.5
    Est-ce que c'est pas plus simple?

    (promo: dodo langage a prototypes)

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/02/2015, 08h21
  2. Ninject Constructeur sans le nom du parametre
    Par mariox dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 05/10/2012, 09h34
  3. Réponses: 7
    Dernier message: 27/05/2011, 17h58
  4. Comment passer des parametres au constructeur d'un service?
    Par jnc65 dans le forum Windows Communication Foundation
    Réponses: 2
    Dernier message: 06/08/2009, 20h41
  5. Recuperation du nom des parametres
    Par Sebastien_INR59 dans le forum Général Java
    Réponses: 16
    Dernier message: 13/10/2007, 23h28

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