Je suis au cœur d'essayer de m'apprendre à la programmation. J'ai commencé la même chose que je suis sûr que la plupart des gens commencent; Faire de petites applications et de jeux en désordre qui font des choses simples de manière non aussi simple. Récemment, j'ai essayé de passer la prochaine étape en écrivant un jeu légèrement plus complexe qui utilise des conceptions de OOP pour écrire un code meilleur et plus modulaire! P>
Le problème principal que j'ai eu est la conception de ma classe StatManager principale (FSM) (pour basculer entre les états d'écran d'introduction / Menu / Jeu / etc). J'ai regardé haut et bas, et je n'ai vraiment pas vu deux méthodes de les concevoir: em> p>
Utilisez une instruction de commutation / cas + un énorme pour basculer entre les états. P> li>
Fabriquez une classe FSM singleton qui gère la poussée / popping états vers / depuis un vecteur .. p> li>
ul>
Maintenant, mon problème est que la déclaration de cas de commutation est très répétitive et clunky, et cela fonctionne en quelque sorte sur mon objectif d'utiliser ce projet pour m'apprendre à OOP. P>
mon deuxième problème et un problème plus gros est la suggestion "Singleton". em> p>
Comme je l'ai déjà dit, j'essaie de m'apprendre, et j'ai encore beaucoup à apprendre quand il s'agit de programmer, en particulier dans le domaine des modèles de POO et de conception et de toutes ces choses. J'ai rencontré un problème où, pour chaque "singletons" singletons "est mauvais" et discussion que je trouve, je trouve autant de tutoriels et de références où les gens utilisent des singletons dans leur code pour créer des classes "Moteur" . EM> C'est un message mixte très cohérent. P>
Je suppose que je ne comprends tout simplement pas pourquoi ... même si vous ne voulez que / que vous souhaitez avoir un seul objet d'une classe, pourquoi est-il nécessaire / bénéfique de rendre le constructeur privé et de créer un singleton? J'ai beaucoup lu sur la façon dont les singletons sont mauvais, comment ils sont essentiellement globaux, comment ils gênent la voie de la multi-threading et combien de programmeurs les considèrent surutilisés ou simplement un mauvais design ... Pourtant, je vois l'exemple après l'exemple des personnes qui les utilisent et très peu d'exemples de contre-exemples montrant des méthodes alternatives. P>
ne pouvait pas être fait le même type de chose avec juste une classe régulière? Quel est le but de restreindre explicitement la création d'instances? J'ai entendu seulement des choses négatives sur des singletons, mais les gens semblent les utiliser constamment ... Je manque complètement quelque chose sur des singletons et du POO? P>
est l'utilisation de singletons juste une tendance, ou est-ce juste une tendance lorsque les gens appellent le "mal des singletons"? Comment puis-je contourner cela..? n'y a-t-il pas quelque chose entre le commutateur / l'affaire FSM et le Singleton FSM ?? Quelqu'un n'a pas pu concevoir le système d'État de leur programme exactement de la même manière sans faire de leurs classes singletons? Cela changerait-il quelque chose? Strong> [ confus em>] p>
3 Réponses :
ne pouvait pas être fait le même type de chose avec juste une classe régulière? Quel est le but de restreindre explicitement la création d'instances? J'ai entendu seulement des choses négatives sur des singletons, mais les gens semblent les utiliser constamment ... Je manque complètement quelque chose sur des singletons et du POO? P> blockQuote>
Non, je crois que vous êtes sur la bonne voie: il n'y a absolument aucune raison d'empêcher la création de deux cas. L'univers n'implose pas à cause de cela. P>
C'est une restriction complètement inutile. Depuis que vous devez coder manuellement cette restriction, il est assez stupide de l'avoir du tout (si vous deviez écrire du code pour Soulevez em> cela, ce serait une autre question). P>
Je suppose qu'il peut y avoir des situations bizarres et rares dans lesquelles l'univers implose si une deuxième instance est créée, mais cela semble assez farfalu. En tout cas, il ne justifie pas la prévalence des singletons sur Internet. P>
Je ne peux pas vraiment expliquer pourquoi les gens les utilisent constamment sans insulter les capacités de raisonnement de ces personnes, donc je m'abstiendrai de le faire. P>
Est-ce que quelqu'un n'a pas pu concevoir le système d'État de leur programme exactement de la même manière sans faire de leurs classes singletons? Cela changerait-il quelque chose? P> blockQuote>
La seule chose que cela change, c'est que, en le faisant un singleton, vous vous empêchez de créer des instances de jets pour les tests unitaires. Tout le reste fonctionne simplement la même chose. P>
Même si une seconde instance provoque l'implication de l'univers, cela ne signifie pas nécessairement que vous avez besoin d'un accès universel à celui-ci également, ce que la plupart des gens semblent oublier des singletons.
Ils sont utilisés, car ils étaient (ou sont) un modèle de conception et des personnes ont tendance à les utiliser car elles sont des modèles de conception. Mais ils ne devraient les utiliser que lorsqu'ils sont justifiés (ce qui, dans la plupart des cas, ils ne le sont pas). Pour la phraser plus généralement: des motifs de conception (en particulier du singleton) sont surutilisés.
Merci pour la réponse, c'était rapide! Je serai le premier à admettre, je suis maintenant un programmeur noob non éduqué, essayant de comprendre ce que je fais! J'ai fait des recherches sur et plus d'essayer d'apprendre davantage et d'aller mieux au point où je peux réellement commencer à créer des choses et à faire les choses cool que tous les programmeurs aiment faire! J'ai vu tant de singletons partout sur la place et, en même temps, je n'ai pas seulement vu des preuves raisonnables pourquoi les singletons sont un mauvais design et injustifié. Je n'ai jamais vu un exemple concret d'une classe qui doit être un singleton. Merci! ^^
@MRKATSWORDFISH: système de fichiers; C'est généralement l'exemple classique. Mais généralement, lorsque vous voyez quelqu'un qui suggère que quelque chose soit un singleton, demandez-vous: "Pourquoi a besoin i> pour empêcher une personne d'instancier une seconde?" La plupart du temps, "singleton" est confondu avec "l'instance disponible globalement".
@Mrkatwordfordfish pour un "noob non éduqué" Vous montrez déjà l'une des qualités les plus importantes: vous pensez pour vous-même et ne faites pas les choses simplement parce que vous les lisez sur Internet. Continuez à faire ce que vous faites :) Oh, et bienvenue à la pile débordement!
Je peux donner un exemple de vie réel - celui qui, certes, est retourné! Dans le (Cadre de QT) [ http://doc.qt.nokia.com/] , le qcoreapplication code> est un singleton, mais dans les coulisses, il crée d'autres singletons liés au threading. Il est difficile de démarrer la structure QT dans un thread non par défaut, même si les API de la plate-forme sous-jacente ne placent aucune restriction de ce type. Donc, parfois même si c'est " évidemment i>" aurait un sens, vous pourriez être moins évidemment mais néanmoins malheureusement faux.
Haha merci! Bien que vous puissiez d'accord avec moi si vous avez vu mon code! XD Merci pour la chaleureuse bienvenue au débordement de la pile, ce type de ressource est incroyable et merveilleux, en particulier pour les personnes comme moi qui n'ont jamais eu de classe de programmation ni d'enseignant. C'est une bonne chose, Internet! :) J'avais un gut qui ne ressentait pas de faire confiance aux singletons et je suis heureux que je me demandais parce que maintenant je me sens assuré que je ne manque pas quelque chose d'important ... haha
Il y a des cas où une deuxième instance d'une classe dans un processus unique serait une erreur grave. Cela n'est cependant pas l'un d'entre eux. Et je pense que la réponse de personne n'est l'explication probable quant à pourquoi elles sont surutilisées. Ils sont l'un des modèles de conception les plus simples à comprendre, alors les gens les utilisent pour dire qu'ils utilisent des modèles de conception. Même s'ils ne comprennent pas la motivation derrière le motif.
Je ne vois pas pourquoi la classe FSM devrait être un singleton. Il existe de nombreux systèmes FSM réels dans lesquels il n'y a pas de singletons, Heck, il existe certains où les instances d'état sont créées et détruites comme le SM traverse les états et où La machine d'état est elle-même un état pour permettre une composabilité facile des machines d'état hiérarchique. P>
Dans une application complexe, vous aurez plusieurs machines d'état, dont certaines apparaissent et hors de l'existence. Ceux qui gèrent, par exemple, l'interaction client-serveur, auront nécessairement plusieurs instances qui se présentent avec des clients. Certains autres peuvent bénéficier de plusieurs machines d'état hiérarchique multiples, dont certaines peuvent être réutilisées dans de nombreux endroits. Ainsi, l'idée que vous auriez une machine d'état comme un singleton classe em> est stupide à moi. Vous pouvez avoir, par exemple, un em> d'une machine d'état particulière dans une classe d'application Singleton qui encapsule votre application, mais c'est loin d'avoir une machine d'état de classe Singleton. P>
Pour obtenir un bon aperçu de diverses techniques d'implémentation de la machine à états, y compris des contrastes entre les FSM plat et les machines d'état hiérarchique (HSMS), vous souhaiteriez jeter un coup d'œil à Miro Samek's Livre PSICC2 . Il a beaucoup de téléchargeable librement téléchargeable articles où des techniques courantes sont expliquées. P>
Une implémentation raisonnable C ++ d'une machine d'état hiérarchique, utilisable pour l'interface utilisateur, est disponible dans le Cadre de machine d'état dans QT . P>
Merci pour la réponse perspicace et les références! Une chose qui me dérange toujours est la suivante: même en supposant que le programmeur crée une classe qu'elles n'avaient que l'intention d'avoir une seule instance, existe-t-il vraiment un point de transformation de cette classe dans un singleton? (par opposition à simplement simplement, choisissez de ne pas créer d'autres instances ..?) Merci encore!
Pas, tant que vous ne brisez pas les choses en créant plusieurs instances. Si la classe doit réclamer certaines ressources qui ne peuvent être revendiquées de manière logique qu'une seule fois, le modèle Singleton applique ce cas d'utilisation et empêche les erreurs. Sinon c'est inutile.
Comme c'est souvent le cas, il n'y a pas une seule réponse. En C ++, le Singleton Motif gère également l'ordre des problèmes d'initialisation, qui sont important s'il doit être utilisé dans les constructeurs d'objets statiques. Et il existe certains types d'objets où plusieurs instances ne peuvent que être une erreur de programmation; Si vous pouvez les empêcher, pourquoi pas. P>
D'autre part, j'ai beaucoup de difficulté à imaginer une affaire
où un Une déclaration telle que "singletons sont mauvaises" est très trompeuse; pour certains
Les choses, ils sont la solution la plus appropriée. Mais juste parce qu'ils
ne sont pas mauvais dans l'absolu ne signifie pas qu'ils sont appropriés
partout. Ils résolvent un problème particulier et très limité. Lorsque vous
Besoin de résoudre ce problème, pas em> à l'aide d'un singleton est mauvais. Mais (comme c'est
vrai pour tout à peu près tout), en l'utilisant quand il n'est pas approprié est
mauvais. p> StapeManager CODE> classe doit être un singleton. Ce n'est en aucun cas
gérer une ressource unique ou une certaine méta-fonctionnalité (par exemple comme
journalisation) qui par sa nature même doit être unique. Et je ne peux pas imaginer
Il est utilisé dans les constructeurs d'objets statiques. p>
Une troisième option peut être d'utiliser un outil externe pour générer un code de la chaudron de classe FSM pour vous (je ne recommanderais pas les macros C / C ++ simples, bien qu'ils puissent travailler). Je crois qu'il y a déjà des outils qui le feront pour vous si vous n'avez pas envie de franchir votre propre Perl ou autre chose. Beaucoup de gens semblent assez défavorables à ce type d'étape de génération de code, mais cela peut économiser un peu d'effort et de répétition.
Je n'ai jamais envisagé ça. Des recommandations? Je ne suis pas sûr de savoir comment faire cela ou quels outils à utiliser. . :) Bon conseil, merci.