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 :

typeid, mauvaise pratique de programmation ?


Sujet :

C++

  1. #1
    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 typeid, mauvaise pratique de programmation ?
    Bonjour à tous,

    Ce matin, je me suis retrouvé face à un problème où le typeid m'arrange franchement bien. Je voudrais avoir votre avis sur ce tout petit bout de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void CEventRecognitionEngine::AddEvent(const std::string& str)
    {
    	BOOST_FOREACH(boost::shared_ptr<IDescriptor> ptr, m_all_events)
    	{
    		if (typeid(*ptr).name() == str)
    		{
    			descriptor_ptr ptr = CObjectFactory<IDescriptor>::Instance().Create(str);
    			m_vector_vision_chain.push_back(boost::static_pointer_cast<IEventDescriptor>(ptr)->GetVisionChain());
    		}
    	}
    }
    Si vous voyez ça dans un projet :
    a) Vous fuyez. Ce code est horrible.
    b) Vous vous dites que c'est une partie mal écrite
    c) Ca dépend du contexte, parfois le typeid est utile.

    pour vos éclaircissements.

  2. #2
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    c) est vrai dans le cas général, mais là c'est vraiment a) et b).
    Boost ftw

  3. #3
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    réponse d)

    Si je vois ça dans un projet :
    - je cherche les specs techniques du projet, en particulier le diagramme UML ou le diagramme de classes

    - si un tel diagramme n'existe pas, ceci explique surement cela

    - si ce diagramme existe, j'essaie de comprendre comment on en est arrivé là et comment faire autrement (emploi d'un visiteur ? emploi d'une fonction virtuelle ? emploi d'une factory ? en general 1 de ces 3 proposition regle le probleme)

    - si effectivement, l'emploi de "typeid" est justifié, j'essaie de le "rationnaliser" afin d'eviter de faire n'importe quoi sous pretexte que c'est pratique : en l'encapsulant dans une fonction ou dans un pattern, par exemple.

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    typeid et typeof n'ont aucune constance garantie, c'est totalement dépendant du compilateur, des options et bien sur du code (héritage,....) .

    Pour être sûr du résultat, il faut comparer à un objet de référence dont on est sûr du type.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    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
    OK, merci à tous, je vais donc changer mon fusil d'épaule...

  6. #6
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    J'ajouterais une chose :

    Si tu a une architecture du type :

    class A
    class B : public A
    class C : public B

    alors dans ton cas, le test

    typeid(class B) == typeid(class C)

    renvoit faux.

    Alors que les deux (B et C) héritent de A. Selon les besoins, on pourrait vouloir que le test renvoi true.

    En gros, il faut retenir que typeid renvoi le type concret de l'objet, et si on dérive l'objet, on a donc plus la même valeur.

    Dans ce cas, il faut utiliser les propriétés du polymorphisme

  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 bien sûr.
    D'ailleurs, dans mon projet j'ai déjà une factory, mais là c'était différent comme problème...
    Je vais m'en sortir en rajoutant une méthode GetName() const

    EDIT : Ok j'ai viré le typeid, c'est tout bon !

  8. #8
    Membre actif
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Points : 213
    Points
    213
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    typeid et typeof n'ont aucune constance garantie, c'est totalement dépendant du compilateur [...]
    Je me demande : est-ce que le prochain standard prévoit qqch là dessus ? ( Histoire que tous les compilateurs fassent parreil. )

  9. #9
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    C'est pas le typeid qui est le plus gênant, c'est plutôt le fait que tu utilises std::type_info::name de cette manière...

    Sinon typeof, qui est une extension GCC, n'a rien à voir avec typeid.
    Boost ftw

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

Discussions similaires

  1. Qui pratique la programmation spontanée ?
    Par Doloop dans le forum Débats sur le développement - Le Best Of
    Réponses: 486
    Dernier message: 11/04/2023, 19h50
  2. bonnes pratiques de programmation
    Par thierry_b dans le forum Général Java
    Réponses: 3
    Dernier message: 23/01/2009, 14h25
  3. bonne pratique de programmation
    Par Fennec. dans le forum Langage
    Réponses: 6
    Dernier message: 18/01/2009, 18h08
  4. Un guide de bonnes pratiques pour programmer avec le port COM ?
    Par Chekov dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 10/03/2008, 17h25
  5. Tutorial bonne pratique du programmation avec JAVA
    Par menzlitsh dans le forum Langage
    Réponses: 10
    Dernier message: 02/07/2007, 11h56

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