Monopole sind der Teufel und Singletons mit nicht-lesbarem/veränderbarem Status sind das "wahre" Problem...
Nach der Lektüre Singletons sind pathologische Lügner wie vorgeschlagen in Jasons Antwort Ich bin auf diesen kleinen Leckerbissen gestoßen, der das am besten dargestellte Beispiel für wie Singletons werden oft missbraucht.
Global ist schlecht, weil:
- a. Es verursacht Namensraumkonflikte
- b. Sie stellt den Staat in ungerechtfertigter Weise bloß
Wenn es um Singletons geht
- a. Der explizite OO-Aufruf verhindert die Konflikte, so dass Punkt a. kein Problem darstellt.
- b. Singletons ohne Zustand (wie Fabriken) stellen kein Problem dar. Singletons mit Zustand können wiederum in zwei Kategorien fallen, diejenigen, die unveränderlich sind oder einmal schreiben und viele lesen (Konfigurations-/Eigenschaftsdateien). Diese sind nicht schlecht. Mutable Singletons, die eine Art von Referenzhalter sind, sind diejenigen, von denen Sie sprechen.
Mit der letzten Aussage bezieht er sich auf das Konzept des Blogs "Singles sind Lügner".
Was bedeutet das für Monopoly?
Um ein Monopoly-Spiel zu beginnen, müssen Sie zuerst:
- wir legen zuerst die Regeln fest, damit alle auf der gleichen Seite sind
- Jeder erhält zu Beginn des Spiels die gleichen Startbedingungen.
- um Verwirrung zu vermeiden, wird nur ein Satz von Regeln vorgelegt
- die Regeln dürfen sich während des Spiels nicht ändern
Für alle, die es noch nicht wissen wirklich Monopol gespielt haben, sind diese Standards bestenfalls ideal. Eine Niederlage bei Monopoly ist schwer zu schlucken, denn bei Monopoly geht es um Geld, und wenn man verliert, muss man mühsam zusehen, wie der Rest der Spieler das Spiel beendet, und die Verluste sind in der Regel schnell und vernichtend. Also werden die Regeln irgendwann so verdreht, dass sie den Eigeninteressen einiger Spieler auf Kosten der anderen dienen.
Du spielst also Monopoly mit deinen Freunden Bob, Joe und Ed. Sie bauen Ihr Imperium rasch aus und erobern sich exponentiell Marktanteile. Ihre Gegner werden schwächer und Sie beginnen, Blut zu riechen (im übertragenen Sinne). Ihr Kumpel Bob hat sein ganzes Geld in das Gridlocking von möglichst vielen Immobilien mit geringem Wert gesteckt, aber seine Rendite ist nicht so hoch, wie er erwartet hatte. Bob hat das Pech, dass er auf Ihrem Boardwalk landet und aus dem Spiel genommen wird.
Jetzt wird das Spiel vom freundschaftlichen Würfeln zur ernsten Angelegenheit. Bob wurde als Beispiel für einen Versager hingestellt, und Joe und Ed wollen nicht wie "dieser Typ" enden. Als führender Spieler wird man also plötzlich zum Feind. Joe und Ed fangen an, unter dem Tisch zu handeln, hinter dem Rücken Geld zuzuschießen, unterbewertete Häuser zu tauschen und generell alles zu tun, um dich als Spieler zu schwächen, bis einer von ihnen an die Spitze kommt.
Wenn dann nicht einer von ihnen gewinnt, beginnt der Prozess von vorne. Plötzlich wird ein begrenztes Regelwerk zu einem beweglichen Ziel und das Spiel verkommt zu einer Art von sozialer Interaktion, die die Grundlage jeder hochkarätigen Reality-TV-Show seit Survivor bildet. Der Grund dafür ist, dass sich die Regeln ändern und es keinen Konsens darüber gibt, wie/warum/was sie repräsentieren sollen, und - was noch wichtiger ist - es gibt keine Person, die die Entscheidungen trifft. Jeder Spieler macht zu diesem Zeitpunkt seine eigenen Regeln und das Chaos nimmt seinen Lauf, bis zwei der Spieler zu müde sind, um die Scharade aufrechtzuerhalten und langsam aufgeben.
Wenn also ein Spielregelwerk ein Singleton korrekt darstellt, wäre das Monopoly-Regelwerk ein Beispiel für Missbrauch.
Was bedeutet das für die Programmierung?
Abgesehen von den offensichtlichen Problemen mit der Thread-Sicherheit und Synchronisation, die veränderbare Singletons mit sich bringen... Wenn Sie einen Datensatz haben, der von mehreren verschiedenen Quellen gleichzeitig gelesen/manipuliert werden kann und während der gesamten Dauer der Anwendungsausführung existiert, ist es wahrscheinlich an der Zeit, einen Schritt zurückzutreten und sich zu fragen: "Verwende ich hier den richtigen Typ von Datenstruktur".
Ich persönlich habe gesehen, wie ein Programmierer ein Singleton missbraucht hat, indem er es als eine Art verdrehten, Thread-übergreifenden Datenbankspeicher innerhalb einer Anwendung verwendet hat. Nachdem ich direkt an dem Code gearbeitet habe, kann ich bestätigen, dass er langsam war (wegen all der Thread-Sperren, die benötigt werden, um ihn thread-sicher zu machen) und ein Alptraum bei der Arbeit (wegen der unvorhersehbaren/intermittierenden Natur von Synchronisationsfehlern), und fast unmöglich unter "Produktionsbedingungen" zu testen. Sicherlich hätte man ein System mit Polling/Signaling entwickeln können, um einige der Leistungsprobleme zu überwinden, aber das würde die Probleme beim Testen nicht lösen, und warum sollte man sich die Mühe machen, wenn eine "echte" Datenbank dieselbe Funktionalität bereits auf eine viel robustere/skalierbarere Weise erfüllen kann.
Ein Singleton ist sólo eine Option, wenn Sie benötigen, was ein Singleton bietet. Eine schreibgeschützte Nur-Lese-Instanz eines Objekts. Diese Regel sollte auch auf die Eigenschaften/Mitglieder des Objekts übertragen werden.