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

Langage C++ Discussion :

Valider un schéma : design


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut Valider un schéma : design
    Bonjour,

    À l’occasion d'un projet, je dois coder un serveur. L'échange des données se fait principalement sous cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [balise1]
      id = IDENTIFIANT
      [info]
        nom = NOM
      [/info]
    [/balise1]
    On a déjà une classe qui s'occupe de parser ce schéma dans un arbre. Ce que j'aimerais c'est pouvoir valider cet arbre.

    Par exemple avoir un schéma comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [balise1]
      id = REGEX <-- requis
      [info] <-- {0 .. 2}
        nom = REGEX <-- requis
      [/info]
    [/balise1]
    Ce validateur devrait pouvoir vérifier la répétition d'un champ, par exemple le champ info peut apparaitre de 0 à 2 fois. Et ceci sous d'autres formes encore comme '*', '1 .. *', ...

    On controlera les types avec un regex ou éventuellement autre chose suivant.

    Et il faudra que le nom des balises et des attributs soient exactement les mêmes.

    Plus encore peut-être d'autre choses auxquelles je n'ai pas encore pensé.

    J'étais prêt à coder ma propre solution, mais en essayant de faire un design, je me suis demandé si ce n'était pas un peu comme un lexer. Ou s'il n'existait pas des solutions pour ça, vu que ça semble assez banal.

    Du coup j'ai un peu regardé Boost.Spirit.Lex mais est-ce que ça n'est pas un peu étrange d'écrire des règles de cette manière pour un protocole réseau ? Et de plus, j'ai l'impression que c'est un peu trop pour mon problème.

    N'hésitez pas à me demander plus de détails.

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Je me demande si boost spirit ne te permettrait pas de faire tout cela :
    • Spirit Qi est un parser
    • Spirit Kama est un générateur (écriture)
    • Spirit Lex est un analyseur lexical
    Je ne sais pas quel est l'état d'avancement de ton projet ( surtout en ce qui concerne le parsing et l'écriture), mais, peut etre est-il encore temps de prendre une "solution intégrée"

    Ouppsss... je m'étais arrêté avant la fin du message et n'avais pas remarqué que tu envisageais effectivement spirit...

    Non, pour moi, il n'y a pas vraiment de problème à utiliser spirit pour un protocole réseau, étant donné que, de toutes manières, les informations peuvent être considérées comme un flux de données

    De plus, "qui peut le plus peut le moins"... Tu auras plus facile à ne pas utiliser quelque chose de présent qu'à... essayer d'avoir quelque chose qui n'existe pas
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Merci pour ta réponse koala01,

    En fait, c'est un projet open-source nommé Wesnoth, qui est un jeu de stratégie au tour par tour.

    Ils ont déjà une classe config qui stocke un fichier comme présenté ci-dessus.

    Ce qu'il me faut c'est juste la partie "validation".

    De plus je me disais, qu'au final, un schéma est quelque chose de statique. J'ai donc envisagé les possibilités les plus folles avec la métaprogrammation et Boost::mpl par exemple. Mais je ne suis pas arrivé à quelque chose de convainquant.

    Sachant que Spirit.Lex est totalement dynamique, je me demandais si ce n'était pas une éventuelle perte de performance ?

    De toutes manières, les schémas seront créés dès le début, et au final je voudrais juste pouvoir faire :

    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
    18
    config cfg;
    // On récupère du réseau les données dans config.
    // ...
     
    validator.validate(cfg);
     
    // Et dans validator on ferait quelque chose comme :
     
    bool validate(const config &cfg)
    {
      std::string label = cfg[0];
      if(label == "update")
        return update_validator.validate(cfg);
      else if(label == ...)
      // ...
     
      return false;
    }
    Ce qui serait statique serait par exemple, update_validator. Mais je ne sais pas comment représenter statiquement update_validator et si ça a un réel avantage.

    Qu'en pensez-vous ?

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Le fait est que, de toutes manières, le schéma n'est pas validé en permanence...

    Typiquement, si c'est un schéma de configuration, tu vas le valider une première fois au moment de charger la configuration et, éventuellement, au moment où tu voudras sauvegarder une configuration modifiée.

    Je ne pense sincèrement pas que tu doives réellement t'inquiéter des problèmes de performances dans le cas présent : n'oublie pas que 80 du temps d'exécution est perdu dans 20% du code...

    AMHA, les problèmes de performance ne viendront pas d'un endroit qui n'est utilisé que si rarement
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Je pense qu'on s'est mal compris et que le nom de la classe porte à confusion.

    La validation va s'opérer à chaque fois qu'on va recevoir un paquet du réseau, pour valider ce paquet. Un paquet est organisé comme présenté ci dessus.

    Du coup, les questions de performance peuvent peut-être se poser ici.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Pas vraiment puisque les paquets réseaux n'arrivent qu'à chaque changement de tours, soit toutes les deux minutes et non toutes les secondes.

    Alors, si la validation prends quelques secondes, le joueur est en général d'accord pour attendre si peu au changement de tour. (surtout qu'on doit pouvoir réaliser les animations de début de tour pendant ce temps...)

Discussions similaires

  1. [MCD] Validation de schéma de rencontres sportives
    Par Squale76 dans le forum Schéma
    Réponses: 11
    Dernier message: 11/08/2008, 17h07
  2. [debutante]Validation XML schéma
    Par ameliepim dans le forum Valider
    Réponses: 7
    Dernier message: 03/07/2006, 15h44
  3. [SAX] Valider un flux XML à partir d'un schéma
    Par spidetra dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 23/11/2005, 16h16
  4. [XSD]Validation avec deux schémas?
    Par cuber dans le forum Valider
    Réponses: 10
    Dernier message: 22/09/2005, 09h16
  5. Réponses: 12
    Dernier message: 19/05/2005, 14h29

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