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 :

Suis-je atteint de singletonite aiguë ?


Sujet :

C++

  1. #41
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Et encore, cela n'est pas totalement vrai, dans le cas d'un jeu avec de joueur sur un seul peripherique ... Il y aura bien deux objets sur un materiel. Et de plus, avec votre instance unique, il est difficile de differencier par la suite quel joueur aura fait l'action.
    On s'est mal compris : je voulais dire qu'il y a une instance par matériel (par exemple un clavier,une souris) et que potentiellement il peut y en avoir plus, donc les classes correspondantes (et l'interface commune) ne peuvent pas être singleton.

    En revanche, dans ce genre de système, il faut bien un objet qui :
    1. détienne les différents objets représentants les matériels d'entrée;
    2. les mettes à jour (sur demande) : traite les messages du matériel pour obtenir un "état" résultant des différents matériels.
    3. fournisse l'accès à ces objets détenus.

    Quel que soit cet objet, il doit être unique, soit parcequ'il n'est instancié qu'une fois dans un singleton, soit parcequ'il est lui même singleton. On peut faire sans, mais on reviens aux problèmes de communication et d'érreurs faciles (instancier plusieurs fois cet objet et se retrouver avec différents codes piochant dans des états pas toujours synchro...)

  2. #42
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par Klaim Voir le message
    On s'est mal compris : je voulais dire qu'il y a une instance par matériel (par exemple un clavier,une souris) et que potentiellement il peut y en avoir plus, donc les classes correspondantes (et l'interface commune) ne peuvent pas être singleton.

    En revanche, dans ce genre de système, il faut bien un objet qui :
    1. détienne les différents objets représentants les matériels d'entrée;
    2. les mettes à jour (sur demande) : traite les messages du matériel pour obtenir un "état" résultant des différents matériels.
    3. fournisse l'accès à ces objets détenus.

    Quel que soit cet objet, il doit être unique, soit parcequ'il n'est instancié qu'une fois dans un singleton, soit parcequ'il est lui même singleton. On peut faire sans, mais on reviens aux problèmes de communication et d'érreurs faciles (instancier plusieurs fois cet objet et se retrouver avec différents codes piochant dans des états pas toujours synchro...)
    Je continu a douter de l'utilite que cela soit unique. Pour les materiels d'acquisition, il est tres facile d'avoir les memes resultats, que je fasse une ou vingts instances de la classe utilisant le materiel. Ceci parce que c'est mon materiel qui met a jour les etats. Certes en avoir 20 est loin d'etre utile, mais ceci sont synchronise par rapport aux actions de l'utilisateur.
    Tout de meme, je ne suis pas contre la classe englobante, qui permet un acces unifie a tous les materiels enregistres dans cette classe. Mais comme je l'ai dit, pour des raisons de multijoueur ... cette classe peut aussi avoir plusieurs instances.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #43
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    A première vue, j'ai l'impression que tout ce qui est décrit comme "préoccupation transversale" en programmation par aspect (cf http://skebir.developpez.com/tutoriels/java/aspectj/), est plus ou moins sujet à être un bon singleton.

    Mais d'un autre coté, c'est surtout la facon de penser son programme qui amène à ce genre de design, dans une optique plus "C++" (ou programmation par objet "classique"), on essaie d'éviter l'apparition de "préoccupation transversale", de ne pas avoir de code qui sert partout.

    Et je crois comprendre, en lisant son article, que c'est sur ce point que Emmanuel dit ne pas voir d'utilisation au singleton : pas de nécessité d'avoir à la fois un point d'accés global et une garantie d'unicité en même temps.
    Vrai. Global et unique signifie généralement qu'on s'attaque à une ressource proposée par le système qui lui, garanti son unicité - pour l'instant. Je n'ai aucune garantie que ça continuera à être vrai d'ailleurs (DirectX et ses Swap Chains ; les premiers versions de DX ne les implémentaient pas, parce que les setup dual monitor étaient si rares que ce n'était pas utiles).

    Citation Envoyé par Flob90 Voir le message
    @Emmanuel: Pour un pool mémoire utilisé par un allocateur, tu ferais comment ? Monostate et initialisation au démarrage de l'appli ?
    On touche un point super fin là. Si tu me le demande en tant que concepteur de librairie, alors ma réponse est : "très certainement un monostate". Ce monostate pourra alors me servir pour paramétrer les classes d'allocateurs qui je fournirait à mes ouailles.

    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
     
    class system_memory_pool
    {
      static some_type m_realpool;
    public:
      system_memory_pool();
      char* allocate();
      void liberate(char*);
    };
     
    // adapter to the standard allocator interface
    template <class Pool>
    class pool_allocator
    {
      public:
        typedef Pool pool_type;
      private:
        pool_type m_pool;
      public:
        // reste de l'interface de std::allocator
    };
     
    typedef std::basic_string<char, std::char_traits<char>, pool_alocator<system_memory_pool> > sys_string;
    Dans le cadre d'une application, je pense que j'utiliserais une stratégie similaire.

    Citation Envoyé par Flob90 Voir le message
    @guillaume07: 7 objets qui peuvent être utilisés n'importe où dans le code ca sent quand même le problème de conception. En avoir un ou deux et ne pas réussir à facotoriser ca peut être normal, mais avoir tout le coeur de l'application c'est quand même étrange. Et d'autre part ta classe main ne devrait pas être à mon avis, elle ne respecte pas le SRP.

    Et tu parles de thread, mais n'oublie pas que MT et singleton c'est un problème qui n'est pas trivial, soit tu créés ton instance avant d'entrer dans les thread, soit tu mets en place quelque chose à base de CAS qui doit être une solution viable (mais c'est pas si évident que ca il me semble, par contre c'est lock-free et bien fait peut-etre wait-free).

    Et enfin, tu as besoin d'accéder aux listes dans les différents thread, le problème c'est que si les listes sont aussi lié qu'elles semblent l'être, il risque d'y avoir beaucoup d'accés concurrentiel, et ca c'est pas bon, les mutex (ou autre) c'est pratiques, mais si il y en a trop ca sera pas plus performant qu'en non threader, AMHA.
    Sur et certain même. Et le fait que le singleton soit un objet global signifie qu'il doit être protégé contre les accès concurrents (comme tous les objets globaux). Sauf que le point d'entrée du singleton, c'est getInstance(), et qu'il faut aussi le protéger pour éviter une double création du singleton (il y a un pattern qui marche très bien pour ça). Il faut donc deux niveaux de protection, avec deux systèmes de protection différents (généralement deux mutex). Et donc une bonne possibilité de deadlock.

    Singleton et MT, c'est tout sauf trivial comme problème...
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  4. #44
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 36
    Points : 33
    Points
    33
    Par défaut
    Ca y est ! La gestion des événements est maintenant conçue comme une sorte de pattern Observateur.

    Suis-je atteint de singletonite aiguë ? Plus maintenant. Merci à vous.

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. SUIS PROFANE
    Par njogou dans le forum Langage SQL
    Réponses: 10
    Dernier message: 27/09/2004, 15h06
  2. Installation de Visual Editor - je suis désespéré
    Par tomy29 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 11/07/2004, 22h17
  3. Je suis un gros boulet ou comment faire de la 2D avec DX
    Par Freakazoid dans le forum DirectX
    Réponses: 4
    Dernier message: 19/06/2004, 15h55

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