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 :

Design Patern Politique et types.


Sujet :

C++

  1. #1
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut Design Patern Politique et types.
    Bonjour,

    J'ai une classe template qui écoute un port et qui transmet les informations à traiter.

    J'utilise alors un design pattern politique pour grossièrement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename Mode>
    class Listener 
    {
            Listener(Type cible);
    };
    En fonction de Mode, le mode de transmission des information sera différent.
    Dans le premier cas j'ai besoin d'une liste d'instruction (ListeInstruction pour Mode = Liste) et dans le second j'ai besoin d'une classe de traitement d'instruction (Traitement pour Mode = Param).

    J'aimerais donc que la classe passée en paramètre template (Mode) détermine aussi le type "Type".

    Le moyen le plus simple que je verrais serait de 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
    template <typename Mode>
    class Listener 
    {
            Listener(Mode::Type cible);
    };
     
    class Liste
    {
        public :
              class Type : ListeInstruction
              {
              };
    }
    Listener<Liste>( liste );
    Mais je me demande s'il n'existe pas une meilleurs solution.
    Le cas idéal serait de faire un typedef dans les classes Mode (donc dans Liste et Param) qu'on puisse réutiliser dans le constructeur de Listener mais je ne pense pas que ce soit possible...

    Qu'en pensez-vous?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 111
    Points
    111
    Par défaut
    pourquoi ce ne serait pas possible ?
    ta sous classe Type n'a pas besoin d'etre une classe, ca peut etre une typedef.

    petit edit:
    "le plus simple" -> phrase intéressante. relativise l'utilité de ce pattern ici, si tu n'as que deux politiques "le plus simple" reste un 'if / else'.

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Citation Envoyé par Lightness1024 Voir le message
    pourquoi ce ne serait pas possible ?
    ta sous classe Type n'a pas besoin d'etre une classe, ca peut etre une typedef.
    J'y avais pensé, mais après avoir testé j'ai remarqué que d'utiliser des sous-classes ou des typedef, on a le même message d'erreur :
    Mode::Cible is not a type
    Citation Envoyé par Lightness1024 Voir le message
    petit edit:
    "le plus simple" -> phrase intéressante. relativise l'utilité de ce pattern ici, si tu n'as que deux politiques "le plus simple" reste un 'if / else'.
    L'utilisation d'un tel partern a été bien réfléchit. C'est la solution la plus optimisée et la plus pratique pour cette utilisation.

    De plus, Listener a une méthode qui tourne en boucle, une bonne quinzaines de if/else ou d'appel de méthodes en moins n'est donc pas si négligeable.

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Autre problème avec les if_else, c'est que si l'on ajoute un troisième mode, il faut modifier du code existant (le code la classe Listner), ce qui contredit le principe ouvert-fermé

    Perso, dans cette situation, je pars très rapidement sur des classes de traits/polices + spécialisation (en fait, c'est même le premier design auquel je pense par habitude)
    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
    19
    20
    21
    22
    23
     
    template <typename T> struct Listener_traits;
     
    struct Mode1;
    template <> struct Listener_traits<Mode1> {
        typedef ListeInstruction Type;
        typedef Mode1 Mode;
    };
     
    struct Mode2;
    template <> struct Listener_traits<Mode2> {
        typedef ParamInstruction Type;
        typedef Mode1 Mode;
    };
     
    template <typename Mode>
    class Listener 
    {
            Listener(typename Listener_traits<Mode>::Type cible);
    };
     
    Listener<Mode1> listener1;
    Listener<Mode2> listener2;
    Ce code permet d'ajouter des spécialisations sans modifier le code existant et permet beaucoup de souplesse (vive le principe "tous les problèmes peuvent être réglés par l'ajout d'une indirection")

    EDIT :
    Citation Envoyé par Neckara Voir le message
    J'y avais pensé, mais après avoir testé j'ai remarqué que d'utiliser des sous-classes ou des typedef, on a le même message d'erreur :
    hum, tu as oublié le typename : http://www.developpez.net/forums/d12...5-cle-typename

    EDIT2 : pour rappel, la FAQ (Qu'est-ce qu'une classe de trait ? Qu'est-ce qu'une classe de politique ?) et le tutoriel de Alp : Présentation des classes de Traits et de Politiques en C++

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    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 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Une alternative est la factory, mais cela provoque une variabilité à l'exécution plutot qu'à la compilation.

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    J'aurais plutôt dit un DP stratégie (qui est l'équivalent au runtime des classes de police finalement)

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    C'est exactement ceci qui me manquait, j'avais vite survolé le sujet il y a peu de temps en plus

    J'ai donc mis le typedef dans le Mode et ton fonctionne parfaitement, merci beaucoup.

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

Discussions similaires

  1. repository design patern
    Par zalalus dans le forum C#
    Réponses: 1
    Dernier message: 02/07/2013, 19h29
  2. SharePoint Designer 2010 - External Content Type
    Par xasha dans le forum Configuration
    Réponses: 2
    Dernier message: 26/03/2012, 15h47
  3. [Débutant] Implémentation du design patern Singleton sous Borland C++ Builder XE
    Par otacon ghost dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/08/2011, 15h21
  4. [SP-2010] Designer : Formulaire spécifique à un type de contenu
    Par swann7 dans le forum SharePoint
    Réponses: 7
    Dernier message: 06/08/2010, 15h53
  5. [Design Patern] Observer
    Par anthyme dans le forum Général Python
    Réponses: 2
    Dernier message: 11/10/2006, 09h14

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