Ist es eine schlechte Codierungspraxis / -gestaltung, eine Klasse zu erstellen, die nur einmal instanziiert wird?
Ich habe einige Variablen und Funktionen, die unter einer Klasse zusammengefasst werden können, um "gut auszusehen" (mangels einer besseren Beschreibung), da sie etwas verwandt sind, aber sie können nur globale Variablen und globale Funktionen sein.
(Übrigens verwende ich JavaScript, AngularJS, Express, MongoDB.)
design
design-patterns
Alice
quelle
quelle
Antworten:
Eine einzelne Instanz für eine Klasse ist sinnvoll, wenn das Objekt eine einzelne Ressource darstellt, z. B. eine Ethernet-Verbindung oder den Task-Manager des Betriebssystems.
Funktionen werden nur dann in eine Klasse eingefügt, wenn sie auf die Variablen von Instanzen dieser Klasse einwirken. Andernfalls ist der Betreuer über die Absicht dieser Klasse verwirrt.
Normalerweise gibt es einen guten Grund, warum Ihre App globale Variablen enthält. Versuchen Sie, den gemeinsamen Zweck von ihnen zu finden und eine Klasse um diesen Zweck herum zu entwerfen. Es wird nicht nur das Design klar machen, sondern auch Ihren Verstand.
quelle
Es ist kein Problem, eine Klasse zu schreiben, die nur einmal instanziiert wird.
Wenn das Zusammenfügen einiger Variablen und Funktionen innerhalb einer Klasse sinnvoll ist, einen semantischen Wert hat oder das Lesen und Bearbeiten des Codes vereinfacht, sind die Betreuer dankbar.
Was jedoch sehr falsch sein kann, ist die Durchsetzung der Einzigartigkeit von innen heraus.
Viele Leute neigen dazu, das Singleton-Muster abzufeuern, sobald sie denken, dass sie nur eine Instanz von etwas benötigen. Sehen Sie zum Beispiel, wie Sie Ihren Kontext nicht ausführlich beschrieben haben, aber die meisten Antworten schlagen bereits vor, einen Singleton zu verwenden. Und dann könnte das Design durcheinander geraten, denn wenn Sie aus irgendeinem Grund irgendwann eine andere Instanz benötigen, verhindert die Klasse, dass Sie dies tun, ohne viel Code zu ändern.
Als Fazit ist eine Instanz in Ordnung, aber stellen Sie sicher, dass Sie wissen, ob:
quelle
Dictionary<TKey,KTValue>
unterschiedlich sind. Wenn alle Instanzen einerDictionary<TKey,KTValue>
Instanz dasselbe verwendenIEqualityComparer
, gibt es keine Mehrdeutigkeit, aber wenn sie unterschiedliche Komparatoren verwenden können, die unterschiedliche Äquivalenzbeziehungen definieren, weiß ich nicht, dass es sinnvoll ist, sinnvoll zu definieren,a.ContentsDistinctFrom(b)
um immer gleich zu seinb.ContentsDistinctFrom(a)
.Nein, auch wenn Sie nur einmal instanziiert haben, benötigen Sie eine Klasse dafür. Aber nehmen Sie nicht an, dass Sie jetzt und in Zukunft immer nur eine Instanz benötigen.
Angenommen, Sie machen ein Spiel und haben eine Spielerklasse:
Sie werden eine Spielerklasse in Ihrem Spiel instanziieren und immer das gleiche Objekt verwenden. Daran ist nichts auszusetzen.
Machen Sie jedoch keinen Singleton daraus! Heute gestaltest du dein Spiel und denkst: "Nun, es wird immer ein Einspieler-Spiel sein. Ich werde einen Singleton für meinen Spieler verwenden." In Version 2 möchten Sie möglicherweise den Mehrspielermodus implementieren - und dann geraten Sie in Schwierigkeiten. Sie müssen viel Code neu schreiben und anpassen, da Ihr Design das Instanziieren mehrerer Player nicht unterstützt.
Das gleiche gilt für Caches. Oder Logger. Oder Netzwerkschnittstellen. Heute denken Sie, dass Sie mit Sicherheit immer nur einen brauchen werden. In einer zukünftigen Version müssen Sie jedoch eine Sekunde hinzufügen. Seien Sie sich dieser Situation bewusst.
quelle
Es gibt Singleton-Klassen, und das ist ein gängiges Entwurfsmuster.
Es gibt auch Klassen, die niemals instanziiert werden. Wenn Sie Funktionen haben, die NICHT in einem dauerhaften Zustand arbeiten (z. B. nehmen sie die Eingabe und transformieren sie), können Sie normalerweise eine statische Methode verwenden. In einigen Sprachen (wie Java) werden diese statischen Methoden in einer Klasse deklariert, aber die Klasse selbst wird niemals instanziiert.
quelle
Das Singleton-Muster ist üblich. Sie können damit eine einzelne Instanz einer Klasse erzwingen.
Aber für einige ist es zu häufig, so dass es ein Anti-Muster wird. Der Grund dafür ist, dass es praktisch dasselbe ist wie der globale Staat. Und jeder globale Staat ist schwer zu verspotten und zu testen und schwer zu debuggen. Gleichzeitig kann das explizite Übergeben dieser einen Instanz überall in Ihrem Code dazu führen, dass sich der Code stark aufbläht. Aber das wird Sie über die richtige Architektur nachdenken lassen. Wenn eine Reihe von Klassen diesen einen Singleton verwenden, können Sie feststellen, dass sie irgendwie miteinander verwandt sind, und einen gemeinsamen Vorfahren für sie erstellen, der diese eine Instanz für sie kapselt.
quelle
Es ist schlecht anzunehmen, dass etwas allgemein schlecht ist. In Ihrem Fall wäre es vielleicht eine gute Idee, aber da Sie eine Sprache verwenden, die im Kern nicht OO ist, ist es wahrscheinlich besser, nur lose Methoden und Variablen zu verwenden und sie in eine gemeinsame Bibliothek zu stellen, die Sie in Ihre Bibliothek aufnehmen andere Arbeit.
quelle
Sie stellen zwei Fragen in einer.
quelle