Le monopole est le diable et les singletons avec un état non en lecture seule / mutable sont le `` vrai '' problème ...
Après avoir lu les singletons sont des menteurs pathologiques comme suggéré dans la réponse de Jason, je suis tombé sur cette petite friandise qui fournit le meilleur exemple présenté de la façon dont les singletons sont souvent mal utilisés.
Global est mauvais parce que:
- une. Il provoque un conflit d'espace de noms
- b. Il expose l'État d'une manière injustifiée
En ce qui concerne les singletons
- une. La façon explicite OO de les appeler empêche les conflits, alors pointez a. n'est pas un problème
- b. Les singletons sans état ne sont pas (comme les usines) un problème. Les singletons avec état peuvent à nouveau appartenir à deux catégories, celles qui sont immuables ou écrivent une seule fois et en lisent plusieurs (fichiers de configuration / propriété). Ce ne sont pas mauvais. Les singletons Mutable, qui sont en quelque sorte des détenteurs de références, sont ceux dont vous parlez.
Dans la dernière déclaration, il fait référence au concept du blog de «singletons sont des menteurs».
Comment cela s'applique-t-il au monopole?
Pour commencer un jeu de monopole, d'abord:
- nous établissons d'abord les règles pour que tout le monde soit sur la même longueur d'onde
- tout le monde a un départ égal au début du jeu
- un seul ensemble de règles est présenté pour éviter toute confusion
- les règles ne sont pas autorisées à changer tout au long du jeu
Maintenant, pour quiconque n'a pas vraiment joué le monopole, ces normes sont au mieux idéales. Une défaite en monopole est difficile à avaler car, le monopole est une question d'argent, si vous perdez, vous devez regarder attentivement le reste des joueurs terminer le jeu, et les pertes sont généralement rapides et écrasantes. Ainsi, les règles sont généralement tordues à un moment donné pour servir les intérêts personnels de certains joueurs au détriment des autres.
Vous jouez donc en monopole avec des amis Bob, Joe et Ed. Vous construisez rapidement votre empire et consommez des parts de marché à un rythme exponentiel. Vos adversaires s'affaiblissent et vous commencez à sentir le sang (au sens figuré). Votre copain Bob a investi tout son argent dans le blocage du plus grand nombre possible de propriétés de faible valeur, mais le sien ne reçoit pas un retour sur investissement élevé comme il s'y attendait. Bob, comme un coup de malchance, atterrit sur votre Boardwalk et est retiré du jeu.
Maintenant, le jeu passe du lancer de dés amical aux affaires sérieuses. Bob est devenu un exemple d'échec et Joe et Ed ne veulent pas finir comme «ce gars». Donc, étant le principal acteur, vous devenez tout d'un coup l'ennemi. Joe et Ed commencent à pratiquer des échanges sous la table, des injections d'argent dans le dos, des échanges de maisons sous-évalués et généralement tout ce qui vous affaiblit en tant que joueur jusqu'à ce que l'un d'eux atteigne le sommet.
Puis, au lieu que l'un d'eux gagne, le processus recommence. Tout d'un coup, un ensemble fini de règles devient une cible mouvante et le jeu dégénère en le type d'interactions sociales qui constitueraient le fondement de chaque émission de télé-réalité de haut niveau depuis Survivor. Pourquoi, parce que les règles changent et qu'il n'y a pas de consensus sur comment / pourquoi / ce qu'elles sont censées représenter, et plus important encore, il n'y a personne pour prendre les décisions. À ce stade, chaque joueur du jeu établit ses propres règles et le chaos s'ensuit jusqu'à ce que deux des joueurs soient trop fatigués pour continuer la mascarade et abandonner lentement.
Donc, si un livre de règles pour un jeu représentait fidèlement un singleton, le livre de règles monopolistique serait un exemple d'abus.
Comment cela s'applique-t-il à la programmation?
Mis à part tous les problèmes évidents de sécurité des threads et de synchronisation que les singletons mutables présentent ... c'est probablement le bon moment pour prendre du recul et demander "est-ce que j'utilise le bon type de structure de données ici".
Personnellement, j'ai vu un programmeur abuser d'un singleton en l'utilisant comme une sorte de magasin de base de données cross-thread torsadé dans une application. Ayant travaillé directement sur le code, je peux attester qu'il s'agissait d'un ralentissement (en raison de tous les verrous de threads nécessaires pour le rendre sûr pour les threads) et d'un cauchemar sur lequel travailler (en raison de la nature imprévisible / intermittente des bogues de synchronisation), et presque impossible à tester dans des conditions de «production». Bien sûr, un système aurait pu être développé en utilisant l'interrogation / signalisation pour surmonter certains des problèmes de performances, mais cela ne résoudrait pas les problèmes avec les tests et, pourquoi s'embêter quand une «vraie» base de données peut déjà accomplir la même fonctionnalité dans un environnement beaucoup plus robuste / de manière évolutive.
Un Singleton est seulement une option si vous avez besoin ce qu'un singleton fournit. Une instance en lecture seule en écriture d'un objet. Cette même règle doit également se connecter aux propriétés / membres de l'objet.