Monopol ist der Teufel und Singletons mit nicht schreibgeschütztem / veränderlichem Zustand sind das "wahre" Problem ...
Nachdem ich gelesen hatte, dass Singletons pathologische Lügner sind, wie in Jasons Antwort vorgeschlagen, stieß ich auf diesen kleinen Leckerbissen, der das am besten präsentierte Beispiel dafür liefert, wie Singletons oft missbraucht werden.
Global ist schlecht, weil:
- ein. Dies führt zu einem Namespace-Konflikt
- b. Es entlarvt den Staat auf ungerechtfertigte Weise
Wenn es um Singletons geht
- ein. Die explizite OO-Methode zum Aufrufen verhindert die Konflikte. Zeigen Sie also auf a. ist kein Problem
- b. Singletons ohne Staat sind (wie Fabriken) kein Problem. Singletons mit Status können wiederum in zwei Kategorien fallen, die unveränderlich sind oder einmal schreiben und viele lesen (Konfigurations- / Eigenschaftendateien). Diese sind nicht schlecht. Mutable Singletons, die eine Art Referenzinhaber sind, sind diejenigen, von denen Sie sprechen.
In der letzten Aussage bezieht er sich auf das Konzept des Blogs "Singletons sind Lügner".
Wie trifft dies auf Monopoly zu?
Um ein Monopolspiel zu beginnen, zuerst:
- Wir legen zuerst die Regeln fest, damit alle auf der gleichen Seite sind
- Jeder erhält zu Beginn des Spiels den gleichen Start
- Es wird nur ein Regelwerk angezeigt, um Verwirrung zu vermeiden
- Die Regeln dürfen sich im Laufe des Spiels nicht ändern
Für alle, die nicht wirklich Monopol gespielt haben, sind diese Standards bestenfalls ideal. Eine Niederlage im Monopol ist schwer zu schlucken, denn beim Monopol geht es um Geld. Wenn Sie verlieren, müssen Sie akribisch zusehen, wie der Rest der Spieler das Spiel beendet, und die Verluste sind normalerweise schnell und erdrückend. Daher werden die Regeln normalerweise irgendwann verdreht, um dem Eigeninteresse einiger Spieler auf Kosten der anderen zu dienen.
Sie spielen also das Monopol mit den Freunden Bob, Joe und Ed. Sie bauen schnell Ihr Imperium auf und verbrauchen exponentiell Marktanteile. Ihre Gegner werden schwächer und Sie beginnen (im übertragenen Sinne) Blut zu riechen. Ihr Kumpel Bob hat sein ganzes Geld in die Blockade so vieler minderwertiger Immobilien wie möglich gesteckt, aber er erhält nicht die erwartete hohe Kapitalrendite. Bob landet als Pech auf Ihrem Boardwalk und wird aus dem Spiel ausgeschlossen.
Jetzt geht das Spiel vom freundlichen Würfeln zum ernsthaften Geschäft. Bob wurde zum Beispiel des Scheiterns gemacht und Joe und Ed wollen nicht wie 'dieser Typ' enden. Als führender Spieler werden Sie plötzlich zum Feind. Joe und Ed üben unter dem Tisch Trades, Geldspritzen hinter dem Rücken, unterbewerteten Haustausch und im Allgemeinen alles, was Sie als Spieler schwächt, bis einer von ihnen an die Spitze steigt.
Anstatt dass einer von ihnen gewinnt, beginnt der Prozess von vorne. Plötzlich wird ein endliches Regelwerk zu einem beweglichen Ziel und das Spiel degeneriert zu einer Art sozialer Interaktion, die die Grundlage jeder hoch bewerteten Reality-TV-Show seit Survivor bilden würde. Warum, weil sich die Regeln ändern und es keinen Konsens darüber gibt, wie / warum / was sie darstellen sollen, und was noch wichtiger ist, dass niemand die Entscheidungen trifft. Zu diesem Zeitpunkt stellt jeder Spieler im Spiel seine eigenen Regeln auf und es kommt zu Chaos, bis zwei der Spieler zu müde sind, um die Scharade aufrechtzuerhalten und langsam aufzugeben.
Wenn also ein Regelbuch für ein Spiel genau einen Singleton darstellt, wäre das Monopol-Regelbuch ein Beispiel für Missbrauch.
Wie trifft dies auf die Programmierung zu?
Abgesehen von all den offensichtlichen Thread-Sicherheits- und Synchronisationsproblemen, die bei veränderlichen Singletons auftreten ... Wenn Sie über einen Datensatz verfügen, der von mehreren verschiedenen Quellen gleichzeitig gelesen / bearbeitet werden kann und während der Lebensdauer der Anwendungsausführung besteht, Es ist wahrscheinlich ein guter Zeitpunkt, einen Schritt zurückzutreten und zu fragen, ob ich hier die richtige Art von Datenstruktur verwende.
Persönlich habe ich gesehen, wie ein Programmierer einen Singleton missbraucht, indem er ihn als eine Art verdrehten Cross-Thread-Datenbankspeicher in einer Anwendung verwendet. Nachdem ich direkt an dem Code gearbeitet habe, kann ich bestätigen, dass er langsam war (wegen all der Thread-Sperren, die erforderlich sind, um ihn threadsicher zu machen) und ein Albtraum war, an dem gearbeitet werden musste (wegen der unvorhersehbaren / intermittierenden Natur von Synchronisationsfehlern) Unter Produktionsbedingungen kaum zu testen. Sicher, ein System hätte mithilfe von Polling / Signaling entwickelt werden 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 bereits die gleiche Funktionalität in einer viel robusteren Version erreichen kann? / skalierbare Weise.
Ein Singleton ist nur dann eine Option, wenn Sie das benötigen, was ein Singleton bietet. Eine schreibgeschützte Instanz eines Objekts. Dieselbe Regel sollte auch für die Eigenschaften / Elemente des Objekts gelten.