Donc, si je te comprends bien, ton singleton maintient une collection proche d'une pair string / string et renvoie le tout à qui le demande, obligeant celui qui a posé la question à
(si c'est une pair ou une structure composée d'une string et d'un boost.any, ca revient quasiment au même ;))
- vérifier la clé pour savoir si elle lui convient
- convertir la valeur en une valeur utilisable
Or, il ne faut pas oublier que la comparaison de chaines compte parmi les processus de comparaison les plus lents que l'on puisse trouver, d'une part, et d'autre part que tu rend la classe qui utilise l'information responsable de la conversion de l'information dans les deux sens :aie:
j'ai beau être un ardent défenseur de la généralisation et du principe "open close", je ne suis vraiment pas convaincu par l'efficacité de la chose :aie:
D'autant plus que le fait de gérer toute ta collection de propriétés sauvegardées sous forme de pair string, string (ou équivalent) pour la sauvegarde n'est absolument pas incompatible avec... la notion de "décentralisation" de l'information que je défend ;)
Es tu seulement sur qu'il n'y a pas une fonction que tu as oubliée dans une classe quelconque qui fait un Singleton::instance().getMachinChose :question:Citation:
J'y ai pensé. La partie config du jeu sera générée à la volée en fonction des clés dans le singleton. Donc on ne met dedans que les propriétés qu'on veut voir exposées à l'utilisateur final. Le reste se fait avec des defines ou autres (pour les tests, les "on verra plus tard" etc).
De plus, la plupart des unit tests sont faits sans que le singleton ne soit créé, donc les classes doivent pouvoir se démerder sans.
Es tu, surtout, sur que cela n'arrivera jamais :question:
Si tu travailles en équipe, es tu sur que ton voisin de poste a compris la manière dont tu voulais utiliser ton singleton :question:
Dans l'exemple que je donnais la tantot, le gros problème ne vient pas du singleton en tant que tel, le problème vient de toutes les classes qui y accèdent alors qu'elles n'auraient pas lieu d'y accéder :aie:
Du coup, lorsqu'il s'agit d'externaliser une partie de l'info, tu repères assez rapidement certains points auxquels tu t'attends effectivement à ce qu'il y ait un accès à la donnée que tu veux décentraliser, mais c'est sans compter sur les 2000 autres fichiers du projet que tu ne penseras peut etre pas à vérifier :aie:
Non, ou du moins, il sera largement diminué, par ce que les dépendances s'inversent : l'utilisateur et l'utilisé sont différentsCitation:
Avec ton design, j'aurais le même goulet d'étranglement au niveau du panneau de config, a part que le panneau de config a autrement plus de dépendances (graphique, input, gamestate) que mon singleton qui gère son truc dans son coin et envoie des events asynchrones.
Ce n'est plus quatre ou cinq modules qui dépendent (comprend : tous les modules utilisent une partie du singleton qui leur est propre, mais on accès aux informations qui ne les concernent pas) d'un singleton, mais un module qui dépend (comprend: qui utilise une partie) des quatre ou cinq autres ;)
En effet, dans le desing que je défends, c'est le panneau de configuration qui se charge d'invoquer les accesseurs et les mutateurs, alors que les autres modules n'ont meme pas besoin de savoir que le panneau de configuration existe ;)
De plus, au lieu d'avoir "en vrac" les XXX informations relatives à tous tes modules et de devoir en "faire le tri" (ah, ca, c'est pour telle partie du panneau de configuration, ah, ca, c'est pour telle autre... tiens? comment ca se fait que j'ai cette information là, moi ???) tu ne disposes que des informations propres au module qui t'intéressent ;)
Ne t'en fais pas, j'ai toujours considéré que c'est en confrontant ses idées qu'il était possible d'évoluer ;)Citation:
Tout à fait, c'est pourquoi ton avis m'intéresse beaucoup. J'espère que tu ne vois pas dans cette discussion une simple querelle idéologique, c'est juste ma façon de raisonner, j'aime pas suivre les conseils juste parce qu'on me les donne, j'aime comprendre les tenants et aboutissants. S'il y a des problèmes que j'ai pas anticipé, je suis toujours preneur.
Et je ne prends également le temps de comprendre les tenants et les aboutissants avant de me faire mon propre avis ;)
Par contre, je suis relativement pugnasse quand il s'agit de défendre mon point de vue... mais tu l'avais surement remarqué ;) :DCeci dit, on est déjà d'accord sur le principal : le singleton est mal, simplement, je suis un chouia plus extrêmiste que toi sur le sujet :DCitation:
Mais on a tous le même travers : si on est confronté à une grosse erreur de design qui nous pose de gros problèmes et nous fait perdre plein de temps, on a tendance à refuser tout ce qui s'en approche. J'ai d'autres bons exemples (fragmentation mémoire par exemple). C'est pourquoi j'essaie de comprendre exactement les problèmes que tu as rencontré afin de vérifier si j'ai bien tout anticipé.
Mais il est vrai que, une fois que tu t'es heurté une fois, comme je l'ai fait, au fait que tu avais un singleton qui semble faire exactement ce dont tu as besoin (et qui, de prime abord, limite les dépendances) qui, sans rien dire à personne, en invoque un autre qui va initialiser tous les autres (dont tu n'as pas besoin!!! ) parce qu'il sert de "centralisateur", il y a vraiment de quoi devenir prudent ;)