Wie vermeide ich es, Manager-Klassen zu schreiben?

13

Ich scheine immer wieder zu lesen, dass es eine schlechte Idee ist, XxxManagerStilklassen 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 ManagerWenn mit einem anderen Namen.

Ist das wirklich ein schlechtes Muster? Wenn ja, welche Alternativen gibt es?

Ross Taylor-Turner
quelle
2
Was ist los mit Managern?
Chris McFarland
blog.codinghorror.com/i-shall-call-it-somethingmanager und andere, obwohl ich nicht so sicher bin, ob es wirklich zutrifft
Ross Taylor-Turner
2
Dieser Link gilt nicht wirklich, es geht um die Benennung. Ich denke, diese Frage passt besser zu Programmers SE.
Tyyppi_77
3
Eigentlich haben unsere Freunde von Programmers SE diese Frage bereits beantwortet, schauen Sie sich dies und das und das an . Guthaben geht an eine Google-Suche mit "Wie vermeide ich Manager-Klassen? Programmers.se".
Tyyppi_77
@ Tyyppi_77 Choice-Zitat aus Ihrem StackOverflow-Link: "Keine Namenslähmung . Ja, Namen sind sehr wichtig, aber nicht wichtig genug, um viel Zeit damit zu verschwenden. Wenn Sie sich in 10 keinen guten Namen ausdenken können Minuten, mach weiter. " Genau. Der Code muss irgendwo hin. Nennen Sie es doch bitte.
Chris McFarland

Antworten:

11

"Manager" -Klassen können aus verschiedenen Gründen problematisch sein. Die beiden Hauptgründe sind in der Regel:

  • der Name ist unklar (was bedeutet eigentlich "Management" und ist es für jede Art von verwalteten Dingen immer gleich?)
  • Sie tendieren dazu, Eimer mit Funktionen zu sein, die gegen das Prinzip der einmaligen Verantwortung verstoßen (das heißt, ein Typ sollte eines tun).

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
6

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 FoobarManagerist, dass das Wort "Manager" Ihnen nicht sagt, was die Klasse tatsächlich tut. Beispielsweise:

  • Wenn es die Spielmechanik der Fußleisten steuert, können Sie es benennen FoobarController.
  • Wenn es Foobars instanziiert, dann aber die Kontrolle an etwas anderes delegiert, ist es ein FoobarFactoryoder FoobarBuilder.
  • Wenn es die Foobars auf den Bildschirm zeichnet, ist es ein FoobarRenderer.
  • Wenn es Ereignisse abhört, die von Foobars generiert werden, ist es ein FoobarEventHandler.
  • Wenn es darauf wartet, dass etwas mit den Fußleisten passiert, ist es eine FoobarObserver.
  • Wenn es nur ein blöder Datenbehälter für eine Sammlung von Foobars ohne Logik ist, nennen Sie es einfach 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).

Philipp
quelle
1
Ich bevorzuge es oft, die Namen zu verwenden FoobarStoreoder FoobarRepositorynoch klarer zu sagen, wofür sie gedacht sind.
Lukazoid