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 :

Convention de nommage pour les typedef


Sujet :

C++

  1. #1
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut Convention de nommage pour les typedef
    Bonjour à tous,

    La convention de nommage de Boost indique que les typedef doivent être suffixées par _t.
    Or, le typedef le plus célèbre du C++, std::string, ne suit lui-même pas cette convention.
    Dans Boost même, on peut voir des disparités sur ce point. Un exemple avec cette classe tree_node (implémentation générique du pattern composite) :
    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
    17
     
        template <typename T>
        struct tree_node
        {
            typedef T parse_node_t;
            typedef std::vector<tree_node<T> > children_t;
            typedef typename children_t::iterator tree_iterator;
            typedef typename children_t::const_iterator const_tree_iterator;
     
            T value;
            children_t children;
     
            tree_node();
            explicit tree_node(T const& v);
            tree_node(T const& v, children_t const& c);
            void swap(tree_node<T>& x);
        };
    Alors, quand mettre _t, quand ne pas le mettre ?

    Un typedef, hors template, c'est avant tout une abstraction. On veut plus ou moins faire oublier quel est le type équivalent, qui serait trop compliqué (un emboitement de templates, par exemple).
    Dans ce cas, suffixer le nom du typedef casserait un peu cette abstraction.
    Lorsque l'on ajoute _t, on joue plutôt la transparence.

    Selon vous, y a-t-il d'autres facteurs qui justifieraient l'ajout d'un suffixe particulier ? Que suivez-vous comme règles, personnellement ?
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Personnellement, là où cela me sert le plus (dans le sens pertinent), c'est en métaprogrammation.

    J'utilise des typedef intérieurs à ma classe/structure de ce genre :
    - type ou
    - return_type désignent le type retourné par ma métafonction si c'est un type
    - value désigne la valeur retournée par ma métafonction

    Bref, ce genre de choses. Après, tout n'est pas parfaitement uniformisé dans Boost donc desfois tu verras des "_t" desfois non.
    Personnellement, je trouve que cela fait trop emprunté au C, mais ce n'est que mon avis...

  3. #3
    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
    J'ai le vague souvenir que _t est reserve par POSIX.

    Je ne vois pas en quoi les conventions de nommage de boost devraient avoir une influence sur la bibliotheque standard, en particulier quand les composants sont anterieurs a boost.

    Il y a une utilite a avoir des conventions de nommages differentes -- ca diminue le risque de collision. Il y a un desavantage: ca diminue l'homogeneite.

    Un aspect C++ qui peut pousser a utiliser un suffixe, c'est que les typedefs introduisent un synonyme pour l'ancien type plutot qu'un nouveau type, donc qu'on ne peut pas trop compter sur la possibilite de surcharger.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    D'habitude, je nomme mes typedef comme mes classes. Donc si j'ai un suffixe, j'utilise le même suffixe.

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Franchement les conventions de nommages en C++ sont plus des questions de culture d'entreprise que de véritable convention généralisée...

    Exemple pour ma part:
    Le suffixe _t est utilisé pour un "type" (donc un truc avec constructeurs de recopie, opérateurs et tout le toutim) qui peut être utilisé comme valeur de retour d'une fonction (ou passé par valeur) sans perte de temps/mémoire, sans destructeur virtuel, .... Ca ne veut pas dire que c'est un typedef, juste qu'en hériter va être extrêmement compliqué... Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Fixed32_t  // c'est une classe, mais un vrai 'type'
    {
         SInt32_t    m_value; // là c'est juste un typedef vers le bon type de 32 bits
    public:
         inline Fixed32_t() {}
     
         inline Fixed32_t(const Fixed32_t& f) : m_value(f.m_value) {}
         inline Fixed32_t& operator=(const Fixed32_t& f) { m_value=f.m_value; return *this; }
         ...
    };
    J'ai le sentiment que c'est le cas que tu décris.... Recopier un std::string dans un autre std::string est très lent (enfin.... ca appelles malloc donc c'est très lent ).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    À l'intérieur d'une classe, j'utilise généralement _type.
    Surtout dans les classes templates.
    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.

  7. #7
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Oui quelques libs utilisent ce principe.
    Les types sont suffixés par _type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef IMAGEITERATOR                             ImageIterator;
    typedef typename IMAGEITERATOR::LineStartIterator LineStartIterator;
    typedef typename IMAGEITERATOR::value_type        value_type;
    typedef typename IMAGEITERATOR::difference_type::MoveY difference_type;
    typedef typename IMAGEITERATOR::reference         reference;
    typedef typename IMAGEITERATOR::index_reference   index_reference;
    typedef typename IMAGEITERATOR::pointer           pointer;
    typedef std::random_access_iterator_tag           iterator_category;
    Après les gouts et les couleurs. L'essentiel je pense c'est d'arriver à un code clair pour soi même et les autres. Car comme le répète souvent Koala, un code est plus souvent lu que compilé/modifié.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/11/2013, 16h33
  2. Réponses: 15
    Dernier message: 12/08/2012, 13h10
  3. y-a-t-il des conventions de nommage pour SQL
    Par new11 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/08/2008, 11h51
  4. convention de nommage pour un web service
    Par snopims_ dans le forum Services Web
    Réponses: 1
    Dernier message: 04/02/2008, 09h11
  5. convention de nommage pour les variables
    Par nono_31 dans le forum Langage
    Réponses: 10
    Dernier message: 28/08/2007, 10h04

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