In letzter Zeit gab es eine Art Revolution gegen Singletons, aber stimmt etwas nicht mit ihnen, wenn sie staatenlos sind?
Ich kenne die Überbeanspruchung und alles ... das gilt für alles, nicht nur für Singletons.
In letzter Zeit gab es eine Art Revolution gegen Singletons, aber stimmt etwas nicht mit ihnen, wenn sie staatenlos sind?
Ich kenne die Überbeanspruchung und alles ... das gilt für alles, nicht nur für Singletons.
Antworten:
> Are immutable/stateless singletons bad?
Weitere Details finden Sie unter the-onion-architecture
Ich sehe keine anderen Gründe, warum ich Singletons nicht benutze.
Es kommt immer auf die Nutzung an. Ich denke , die Revolution kommt von der Tatsache, dass jeder Programmierer dieses Muster wie lernt das objektorientierte Muster. Die meisten vergessen zu überlegen, wo es Sinn macht und wo nicht.
Dies gilt natürlich für jedes Muster. Nur durch die Verwendung von Mustern erstellen Sie keinen guten Code oder keine gute Software.
Wenn Sie einen Singleton ohne Status haben, warum nicht eine Klasse verwenden, die nur statische Methoden anbietet (oder eine statische Klasse verwenden)?
Hier einige Posts zu globalen Variablen und Singletons im Allgemeinen.
Ich wäre nicht so streng wie der Autor, aber er zeigt, dass man in den meisten Fällen, in denen man denkt, dass man einen Singleton braucht, diesen nicht wirklich braucht.
Es gibt nichts, was ein unveränderlicher zustandsloser Singleton tun kann, was eine statische Klasse nicht kann.
Es gibt einfach keinen Grund, die zusätzliche Komplexitätsebene hinzuzufügen, die -> Instance () erzeugt, während der einfache Aufruf einer statischen Methode klarer, ressourcenschonender und wahrscheinlich schneller sein wird.
Es ist nicht so, dass sie falsch liegen. Es ist so, dass es einen besseren Weg gibt. Es gibt Szenarien, in denen normale ("stateful") Singletons der richtige Weg sind. Das Böse an Singleton ist, dass sie häufig missbraucht werden, mit denselben schlechten Ergebnissen wie globale Variablen, aber es gibt bestimmte Fälle, in denen die Verwendung eines Singletons einfach richtig ist. Für Staatenlose gibt es keine derartigen Fälle.
Das Hauptproblem bei Singleton ist, dass es Abhängigkeiten und Kopplungen verbirgt, insbesondere wenn es in einem übergreifenden Szenario verwendet wird. Weitere Informationen finden Sie unter Singletons sind pathologische Lügner oder Warum Singletons böse sind .
Auf der anderen Seite kann ein Zustand ohne Singleton hilfreich sein und die Leistung verbessern, wenn er nicht missbraucht wird. Betrachten Sie ein Beispiel:
interface Interface
{
void Method();
}
class StatelessSingleton : Interface
{
public static readonly StatelessSingleton Instance = new StatelessSingleton();
private StatelessSingleton() { }
public void Method() { }
}
class User
{
public User(Interface i) { /* ... */ }
}
Hier fungiert der StatelessSingleton als Standardimplementierung der Schnittstelle und wird in den User-Konstruktor eingefügt. Es gibt keine fest codierte Kopplung und keine erweiterten Abhängigkeiten. Eine statische Klasse kann aufgrund der zugrunde liegenden Schnittstelle nicht verwendet werden, es gibt jedoch keinen Grund, mehr als eine Instanz eines Standards zu erstellen. Aus diesem Grund scheint ein Singleton ohne Status eine geeignete Wahl zu sein.
Vielleicht sollten wir jedoch ein anderes Muster für eine Standardimplementierung verwenden:
class Implementation : Interface
{
private readonly Action _method;
public Implementation()
{
_method = new Action(() => { /* default */ });
}
public Implementation(Action custom)
{
_method = custom;
}
public void Method()
{
_method();
}
}
Es beeinträchtigt die Leistung in Bezug auf StatelessSingleton, stellt jedoch eine generische Implementierung der Schnittstelle dar. Eine ähnliche Lösung wird von der IProgress- Schnittstelle verwendet.
Aber warum sollte es möglich sein, mehr als eine Implementierung des Standardverhaltens zu erstellen? Trotzdem können wir beides kombinieren:
class Implementation : Interface
{
public readonly Implementation Default = new Implementation();
private readonly Action _method;
private Implementation()
{
_method = new Action(() => { /* default */ });
}
public Implementation(Action custom)
{
_method = custom;
}
public void Method()
{
_method();
}
}
Zusammenfassend glaube ich, dass es Orte gibt (wie in den Standardeinstellungen dargestellt), an denen Singletons nützlich sind. Die Hauptdefinition von Singleton besagt, dass nicht mehr als eine Instanz einer Klasse erstellt werden darf . Es ist wie Atomkraft. Kann eine Energie oder eine Bombe produzieren. Es hängt vom Menschen ab.