Der einfache Ansatz besteht darin, das, was früher Singleton<T>
global war , einfach zu machen T
. Globale Unternehmen haben ebenfalls Probleme, aber sie stellen keinen Haufen zusätzlicher Arbeit und zusätzlichen Code dar, um eine triviale Einschränkung durchzusetzen. Dies ist im Grunde die einzige Lösung, bei der der Entity-Konstruktor nicht (möglicherweise) berührt wird.
Der schwierigere, aber möglicherweise bessere Ansatz besteht darin , Ihre Abhängigkeiten an den Ort weiterzuleiten, an dem Sie sie benötigen . Ja, dies kann bedeuten, dass Sie eine Window *
an eine Reihe von Objekten (wie Ihre Entität) auf eine Weise übergeben, die grob aussieht. Die Tatsache, dass es grob aussieht, sollte Ihnen etwas sagen: Ihr Design könnte grob sein.
Der Grund, warum dies schwieriger ist (abgesehen davon, dass mehr Eingaben erforderlich sind), ist, dass dies häufig zu einer Umgestaltung Ihrer Schnittstellen führt, so dass weniger Klassen auf Blattebene das benötigen, was Sie "übergeben" müssen. Dies führt dazu, dass ein Großteil der Hässlichkeit, die mit der Übergabe Ihres Renderers an alles verbunden ist, verschwindet und die allgemeine Wartbarkeit Ihres Codes verbessert wird, indem die Anzahl der Abhängigkeiten und Kopplungen verringert wird, deren Ausmaß Sie sehr deutlich gemacht haben, indem Sie die Abhängigkeiten als Parameter verwendet haben . Wenn es sich bei den Abhängigkeiten um Singletons oder Globals handelte, war es weniger offensichtlich, wie stark Ihre Systeme miteinander verbunden waren.
Aber es ist möglicherweise ein großes Unterfangen. Es kann geradezu schmerzhaft sein, es einem System nachträglich anzutun. Es mag für Sie weitaus pragmatischer sein, Ihr System vorerst mit dem Singleton in Ruhe zu lassen (insbesondere, wenn Sie versuchen, ein Spiel zu veröffentlichen, das ansonsten einwandfrei funktioniert; es ist den Spielern im Allgemeinen egal, ob Sie es haben oder nicht) ein Singleton oder vier drin).
Wenn Sie versuchen möchten, dies mit Ihrem vorhandenen Design zu tun, müssen Sie möglicherweise viel mehr Details zu Ihrer aktuellen Implementierung veröffentlichen, da es keine allgemeine Checkliste für diese Änderungen gibt. Oder kommen Sie und diskutieren Sie im Chat .
Nach dem, was Sie gepostet haben, besteht ein großer Schritt in Richtung "kein Singleton" darin, zu vermeiden, dass Ihre Entitäten Zugriff auf das Fenster oder die Ansicht haben müssen. Es deutet darauf hin, dass sie sich selbst zeichnen, und Sie müssen keine Entitäten haben, die sich selbst zeichnen . Sie können eine Methode übernehmen , wo die Einheiten nur die Informationen enthalten , die würde erlaubenSie müssen von einem externen System gezeichnet werden (mit Fenster- und Ansichtsreferenzen). Die Entität legt nur ihre Position und das zu verwendende Sprite offen (oder eine Art Verweis auf das Sprite, wenn Sie die tatsächlichen Sprites im Renderer selbst zwischenspeichern möchten, um doppelte Instanzen zu vermeiden). Dem Renderer wird einfach gesagt, dass er eine bestimmte Liste von Entitäten zeichnen soll, die er durchläuft, aus denen er die Daten liest und deren intern gehaltenes Fensterobjekt verwendet, draw
um das nach der Entität gesuchte Sprite aufzurufen .