Frage

Wenn Sie sollen nicht eine Singleton-Klasse verwenden, obwohl es sehr verlockend sein könnte, dies zu tun? Es wäre sehr schön, wenn wir eine Liste der häufigsten Fälle von ‚singletonitis‘ hatten, die wir sollten darauf achten, zu vermeiden.

War es hilfreich?

Lösung

Sie keinen Singleton für etwas verwenden, das in eine multipliable Ressource entwickeln könnte.

Das klingt wahrscheinlich albern, aber wenn Sie etwas einen Singleton erklären bist du eine sehr starke Aussage, dass es absolut einzigartig ist. Sie bauen Code um ihn herum, immer mehr. Und wenn man dann nach Tausenden von Zeilen Code herauszufinden, dass es nicht ein Singleton überhaupt, haben Sie eine riesige Menge an Arbeit vor Ihnen, weil alle anderen Objekten „das“ heilige Objekt der Klasse WizBang erwarten ein Singleton zu sein .

Ein typisches Beispiel: „Es gibt nur eine Datenbankverbindung diese Anwendung hat, so ist es ein Singleton.“ - Schlechte Idee. Sie können mehrere Verbindungen in der Zukunft haben wollen. Besser einen Pool von Datenbankverbindungen erstellen und es mit nur einer Instanz füllen. Verhält sich wie ein Singleton, aber alle anderen Code Erweiterbare Code haben für den Pool zu gelangen.

EDIT: Ich verstehe, dass theoretisch können Sie einen Singleton in mehrere Objekte erweitern. Und doch gibt es keinen wirklichen Lebenszyklus (wie Pooling / unpooling), das bedeutet, dass es kein wirkliches Eigentum an Objekten, die verwendet werden, um gleichzeitig mit unterschiedlichen Methoden und Fäden würde, dh die jetzt Multi-Singleton sein müssen staatenlos ausgehändigt wurden.

Andere Tipps

Nun Singletons zum größten Teil machen die Dinge nur statisch sowieso. Sie sind also entweder in der Tat machen Daten global, und wir alle wissen, globale Variablen sind schlecht oder Sie statische Methoden sind das Schreiben und das ist nicht sehr OO jetzt ist es?

Hier ist ein detaillierteres rant, warum Singletons sind schlecht, durch Steve Yegge. Grundsätzlich sollte man nicht Singletons verwenden in fast allen Fällen kann man nicht wirklich wissen, dass es nie in mehr als einem Ort werden musste gehen.

Ich kenne viele beantwortet haben mit „wenn Sie mehr als eine“, etc.

Da das ursprüngliche Plakat, das eine Liste der Fälle wollte, wenn Sie nicht Singletons verwenden sollten (und nicht der Hauptgrund), ich werde im Einklang stehen:

Jedes Mal, wenn Sie verwenden es, weil Sie nicht erlaubt sind ein global zu nutzen!

Die Anzahl der Male, die ich habe einen Junior-Ingenieur hat, die einen Singleton verwendet hat, weil sie wussten, dass ich nicht Globals in Code-Reviews akzeptiert habe. Sie scheinen oft schockiert, als ich darauf hinweisen, dass alles, was sie taten, war ein globales mit einem Singleton-Muster ersetzen, und sie haben immer noch nur eine globale!

Ich bin schuldig eine Großes ein paar Jahre zurück (zum Glück meines lession Ich habe seitdem gelernt).

Was passiert ist, dass ich an Bord eines Desktop-App-Projekt kam, die .Net von VB6 umgewandelt hatte, und war ein echtes Chaos. Dinge wie 40-seitigen (gedruckt) Funktionen und keine wirkliche Klassenstruktur. Ich baute eine Klasse Zugriff auf die Datenbank zu verkapseln. Keine echte Datenebene (noch) nicht, nur eine Basisklasse, die eine echte Datenebene nutzen könnte. Irgendwo habe ich auf die Idee diese Klasse ein Singleton zu machen. Es funktionierte in Ordnung für ein Jahr oder so, und dann mussten wir auch ein Web-Interface für die App bauen. Die Singleton endete ein großer Engpass für die Datenbank sein, da alle Web-Benutzer die gleiche Verbindung teilen mussten. Wieder ... Lektion gelernt.

Im Rückblick war es wohl tatsächlich die richtige Wahl für eine kurze Zeit, da sie die anderen Entwickler gezwungen, es zu sein disziplinierter über die Verwendung und machte sie bewusst Fragen der Scoping nicht vorher ein Problem in der VB6 Welt. Aber ich hätte es geändert haben nach ein paar Wochen zurück, bevor wir zu viel hatte, um ihn herum aufgebaut.

ist hier ein rant von meinem Freund Alex Miller ... es ist nicht genau aufzählen „wenn Sie nicht einen Singleton verwenden sollten“, aber es ist eine umfassende, hervorragende Post und argumentiert, dass man nur einen Singleton in seltenen Fällen verwenden soll, wenn überhaupt.

Singletons sind praktisch immer eine schlechte Idee und in der Regel nutzlos / redundant, da sie nur eine sehr begrenzte Vereinfachung eines anständigen Musters sind.

Sehen Sie, wie Dependency Injection funktioniert. Es löst die gleichen Probleme, aber in einem viel nützlicher Weise -. In der Tat, finden Sie es auf viele weitere Teile des Designs gilt

Auch wenn Sie DI-Bibliotheken da draußen finden können, können Sie auch ein grundlegender eine selbst rollen, ist es ziemlich einfach.

Ich versuche nur einen Singleton zu haben -. Eine Umkehrung der Steuer / Service-Locator-Objekts

IService service = IoC.GetImplementationOf<IService>();

Eines der Dinge, die es zu einem Alptraum machen neigen, wenn sie enthält modifizierbar globalen Zustand. Ich an einem Projekt gearbeitet, wo es Singletons ganzen Platz für Dinge verwendet, die in einigen Fällen eine große Rewrite von Teilen der „De-singletonification“ war in einer ganz anderen Art und Weise (in Strategien usw. passieren) gelöst werden sollte System. Ich würde das in dem größeren Teil der Fälle argumentieren, wenn die Leute einen Singleton verwenden, ist es einfach falsch ist b / c es in erster Linie schön aussieht, sondern verwandelt sich in ein Problem vor allem bei der Prüfung.

Wenn Sie mehrere Anwendungen in derselben JVM ausgeführt wird.

Ein Singleton ist ein Singleton über die gesamte JVM, nicht nur eine einzelne Anwendung. Auch wenn mehrere Threads oder Anwendungen Erstellen ein neues Singleton-Objekt zu sein scheinen, sie sind alle das gleiche zu verwenden, wenn sie in der gleichen JVM ausgeführt werden.

Manchmal, vorausgesetzt, dass Sie nur ein von einer Sache sein wird, dann falsch sein, Sie entpuppen.

Beispiel, eine Datenbank-Klasse. Sie nehme an, Sie werden sich immer nur auf Ihrer App-Datenbank verbinden.

// Its our database! We'll never need another
class Database
{
};

Aber warten Sie! Ihr Chef sagt, Haken bis zu einigen anderen Jungs Datenbank. Sagen Sie bitte phpbb auf der Website hinzufügen möchten, und möchte seine Datenbank stoßen einige seiner Funktionalität zu integrieren. Sollten wir eine neue Singleton oder eine andere Instanz Datenbank machen? Die meisten Menschen sind sich einig, dass eine neue Instanz der gleichen Klasse bevorzugt wird, gibt es keine Code-Duplizierung ist.

Sie hätte lieber

Database ourDb;
Database otherDb;

als Kopie-Vergangenheit Datenbank und machen:

// Copy-pasted from our home-grown database.
class OtherGuysDatabase
{
};

Die schlüpfrigen Abhang hier ist, dass man darum, neue Instanz der Klassen denken könnte zu stoppen und stattdessen beginnen seine Ordnung zu denken pro jedem Fall eine Art zu haben.

Im Falle einer Verbindung (zum Beispiel), macht es Sinn, dass Sie die Verbindung selbst ein Singleton machen wollen, können Sie vier Verbindungen benötigen, oder Sie können die Verbindung eine Anzahl von zerstören müssen und neu erstellen Zeiten.

Aber warum würden Sie nicht Zugriff alle Verbindungen über eine einzige Schnittstelle (d-Verbindungs-Manager)?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top