Ich scheine immer wieder zu lesen, dass es eine schlechte Idee ist, XxxManager
Stilklassen in der Game-Engine-Programmierung zu verwenden, aber selbst wenn ich versuche, deren Verwendung zu vermeiden, lande ich immer bei etwas, das alle Akteure / Entitäten / Spielewelten enthält und auf sie einwirkt am Ende ein Manager
Wenn mit einem anderen Namen.
Ist das wirklich ein schlechtes Muster? Wenn ja, welche Alternativen gibt es?
architecture
software-engineering
design-patterns
Ross Taylor-Turner
quelle
quelle
Antworten:
"Manager" -Klassen können aus verschiedenen Gründen problematisch sein. Die beiden Hauptgründe sind in der Regel:
Oft verursacht oder impliziert einer dieser Gründe den anderen.
Diese Probleme sind gute Dinge, die Sie im Hinterkopf behalten sollten, aber lassen Sie sich nicht von Ihrer Fähigkeit lähmen , Ihr Spiel tatsächlich zu machen . Am Ende wird es niemanden interessieren, wie Ihre Klassen heißen oder was sie tun. Sie werden sich um dein Spiel kümmern.
Es ist normalerweise ziemlich einfach, die meisten "Manager" in zwei Teile zu unterteilen:
der Teil, der die eigentlichen Objekte speichert und Zugriff auf sie bietet (den Sie als "Speicher", "Repository", "Datenbank", "Cache" oder verschiedene andere Dinge bezeichnen können. Dies ist normalerweise der Typ, der dafür verantwortlich ist für die Lebensdauer der Objekte, dh, wenn ein Objekt aus einer Instanz dieses Typs entfernt wird oder auf andere Weise nicht mehr darin enthalten ist, ist es nicht mehr vorhanden.
der Teil, der verarbeitet die eigentlichen Objekte und führt einige Arbeit auf sie. Es kann diese Objekte aktualisieren (dann ist es ein "Updater" oder "Simulation") oder es kann sie zeichnen (dann ist es ein "Drawer" oder "Renderer"). Oder es könnte etwas anderes mit ihnen machen; Das Wichtigste ist, es nach seinem Hauptzweck zu benennen. Im Allgemeinen geben Sie Instanzen dieses Typs eine Instanz oder einen Verweis auf Instanzen des ersten Typs (derjenige, der nur die Lebensdauer der Objekte behandelt).
Es könnte ein vernünftiges Argument dafür angeführt werden, dass der Name des ersten Typs "manager" enthalten könnte (da er die Lebensdauer einiger Objekte "verwaltet"). Die Welt wird nicht untergehen, wenn Sie Ihren Typ auf diese Weise benennen, obwohl Sie es möglicherweise in Kauf nehmen müssen, dass Sie nicht so oft "Dinge Manager nennen", also möchten Sie es vielleicht aus diesem Grund vermeiden.
quelle
Wenn Sie den Blog-Beitrag lesen, auf den Sie in den Kommentaren verlinkt haben, werden Sie feststellen, dass "Manager sein, wenn er einen anderen Namen hat" genau das ist, was Sie tun möchten. In der Softwareentwicklung herrscht allgemeiner Konsens darüber, dass globale Variablen böse sind, und die einzige Alternative besteht darin, dass alle Daten von anderen Daten gespeichert werden.
Das Problem mit einer Klasse namens
FoobarManager
ist, dass das Wort "Manager" Ihnen nicht sagt, was die Klasse tatsächlich tut. Beispielsweise:FoobarController
.FoobarFactory
oderFoobarBuilder
.FoobarRenderer
.FoobarEventHandler
.FoobarObserver
.Foobars
.Sie können jede dieser Klassen als "Manager" bezeichnen. Aber dann könnte es eine dieser Funktionen ausführen. Und wenn Sie später feststellen, dass Sie eine der oben genannten Funktionen benötigen, integrieren Sie diese auch in den FoobarManager. Sie erhalten also ein Gott-Objekt, das das Prinzip der Trennung von Interessen verletzt (jede Klasse sollte genau eines tun).
quelle
FoobarStore
oderFoobarRepository
noch klarer zu sagen, wofür sie gedacht sind.