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 :

Modélisation d'un ensemble de type en C++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 44
    Par défaut Modélisation d'un ensemble de type en C++
    Bonjour,

    Le projet que je dois réaliser un est projet réseaux, en particulier l'implémentation d'un protocole. Ce protocole spécifie plusieurs formats de paquets appelés "TLV".

    Mon problème est de trouver une façon d'implémenter ces TLV de façon idiomatique en C++.

    Tous les TLV ont un champ "type".

    Puis tous les TLV sauf un ont un champ "length".

    Ensuite ça diverge. Cependant on peut noter qu'il existe deux TLV avec les mêmes champs mais dont seulement le type est différent.

    Ma première idée était d'utiliser l'héritage en utilisant un enum pour différencier les TLV.

    En particulier j'aurais eu en classe mère un TLV du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Tlv{
    	enum TlvType {
               ... //Differents types de TLV
     
    	};
    protected:
    	TlvType type_;
    public:
    	TlvType type();
    	Tlv();	
    };
    Puis j'aurais fait une classe fille avec un champ length. Puis pour chaque TLV différent une classe "petite fille". Cependant mon problème est que parfois je vais avoir deux TLV qui diffèrent par leur Type mais qui pourtant auront la même classe. Je trouve ça bizarre d'un point de vue utilisateur.

    Je me trompe peut-être, mais si l'utilisateur veut créer le TLV machin, j'aurais pensé qu'il fasse appelle au constructeur de la classe TLV machin, pas au constructeur de la classe TLV bidule en lui passant machin en paramètre.

    Puis le enum dans la classe mère je ne suis pas convaincu que ce soit la bonne façon de faire car ça n'est pas très extensible. Si je souhaite rajouter des TLV je devrais modifier le enum et toutes les classes faisant un "pattern matching" (ou un case) sur le type.

    Bref je suis un peu dubitatif sur les choix que j'ai fait jusqu'à présent et je me demande s'il n'éxiste pas une meilleure solution.

    En espérant avoir été clair,

    Bonne journée

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 503
    Par défaut
    Le plus simple, c'est de ce servir d'un Framework de sérialisation qui s'occupera de tous ces détails pour vous et de manières transparentes.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Salut,

    un moyen simple de faire avec l'enum justement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    enum TLVType { Type1, Type2, ... };
    struct BaseType {
     TLVType _type;
     BaseType(TLVType__type) : _type(__type) {}
    };
    struct TLV1 {
    TLV1(...) : BaseType(TLVType::Type1) {}
    };
    ...
    par contre, oublie les "oui mais les 2 types là ils ont X, Y champs communs, ..." ça complique la tache pour pas grand chose.
    Si vraiment tu veux utiliser ce genre de trucs, tu peux mettre des classes intermédiaires, mais je conseille pas.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Tlv{
    	enum TlvType {
               ... //Differents types de TLV
     
    	};
    protected:
    	TlvType type_;
    public:
    	TlvType type();
    	Tlv();	
    };
    enum TlvType? à quoi sert ton enum
    à quoi sert de stocker le type?

    si Tlv est la classe mère,
    tu as tes types
    Tlv1, Tlv2,... qui sous des fils de Tlv
    Rien ne t'empêche de considérer
    Tlv11 et Tlv12 qui sont des fils de Tlv1 si leur champs sont identiques, de toute façon tu manipuleras des Tlv* non?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 44
    Par défaut
    @bacelar: la sérialisation est hors de propos dans le cadre de ce projet. Le protocole est un protocole pair à pair. Chaque étudiant utilisant son propre langage avec ses propres frameworks. Je ne vois pas en plus en quoi ça me concerne puisque je cherche à définir la sémantique des paquets à l'intérieur de mon programme, le réseau n'intervient pas là-dedans.

    @bousk: je ne comprend pas bien l'avantage de ta solution par rapport à celle que j'ai proposée. Tu peux me dire ce qu'elle apporte ?

    @galerien69: Je n'ai pas assez d'expérience pour savoir si je ne vais manipuler que des Tlv* mais à vue de nez j'ai envie de dire non. En effet, une tlv peut contenir l'adresse d'autres pairs, une autre peut contenir des données, une autre peut contenir d'autres informations. Bref, chaque tlv à une sémantique propre et j'ai envie d'avoir un comportement spécifique en fonction de la tlv. J'ai donc besoin d'avoir accès à des fonctions membres à l'intérieur.

    Pourquoi je veux un enum pour spécifier le type ? Parce que si je me place du côté client, je n'ai pas envie de connaître le mapping entre les int et les tlv correspondant. En l'occurence il y a une dizaine de type + les extensions, c'est pas très sympa je trouve. Le but de l'enum est donc de fournir ce mapping au client car en interne, le type du paquet envoyé par le réseau sera un entier.

    Par contre je ne sais pas pourquoi mais ça m'embête que deux tlv qui vont avoir la même interface soient dans deux classes différentes juste à cause du type et en même temps je vois mal comment les mettre dans la même classe.

    J'ai surtout l'impression qu'il y a une meilleure solution et que je ne la vois pas.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 503
    Par défaut
    la sérialisation est hors de propos dans le cadre de ce projet
    Houai, sauf que ce que tu fais, bin c'est de la sérialisation/désérialisation de base.
    Prend la définition de sérialisation et tu veras que tu cherches une manière de la faire, pas la plus élégante, mais c'est quand même une sérialisation.

    Alors, si tu veux réinventer la roue, bin triche, regarde le plan de la vraie roue.

    Si tu veux absolument une mécanique avec un T sous forme d'un numérique, regardes comment les MFC l'ont généré, avec une classe de base et une macro pour enregistrer l'identifiant d'une classe dans un membre static de la classe de base. Cela permet une extensibilité automatique.
    Les MFC gèrent aussi le versionning, mais là, c'est un peu overkill.
    Les MFC utilise la classe CArchive (http://msdn.microsoft.com/en-us/library/caz3zy5s.aspx) pour permettre une sérialisation/désérialisation d'objet polymorphique:
    http://www.informit.com/library/cont...Plus&seqNum=93

Discussions similaires

  1. Modéliser les Web Services de type REST
    Par JacNar6 dans le forum Services Web
    Réponses: 5
    Dernier message: 27/08/2013, 14h02
  2. Probleme sur un ensemble de type dans fonction
    Par jetgirl dans le forum Oracle
    Réponses: 4
    Dernier message: 19/02/2007, 13h04
  3. differents type de courbes JFreeChart ensemble
    Par noussa_nouha dans le forum 2D
    Réponses: 8
    Dernier message: 08/09/2006, 13h55
  4. [Tableaux] Le type Ensemble existe-t-il ?
    Par petitnuage dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2006, 20h21
  5. [Modélisation] Type de champs pour champs récurents ?
    Par shadeoner dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 24/03/2006, 11h29

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