Tipps / Ratschläge zur Reduzierung des Einsatzes von „Manager“ -Klassen?

14

Ich höre manchmal, dass zu viele "Manager" -Klassen im Design Ihres Programms Code-Geruch sind und eine unnötige Komplexität hinzufügen. Für mich ist es sinnvoll, Manager-Klassen zu verwenden, um Objekte aus einem für sie sinnvollen Kontext heraus zu manipulieren und zu steuern. Es kann jedoch verwirrend sein, herauszufinden, wie eine Lösung ohne sie funktioniert.

Sollte man Manager-Klassen wirklich so weit wie möglich meiden? Welche Artikel / Papiere sollte ich auch lesen, um herauszufinden, wie eine alternative Arbeitsweise für allgemeine / häufige Fälle implementiert werden kann, in denen diese Manager entfernt werden können?

Chris C
quelle
3
Die Antwort auf programmers.stackexchange.com/questions/59866/… könnte für Sie hilfreich sein.
Tesserex
Was oder wen managen sie, was ist die Logik dieser Klassen? Stellen Sie sich diese Frage und helfen Sie möglicherweise dabei, die Logik dieser Klassen zu erweitern, zu reduzieren oder zu verschieben.
umlcat

Antworten:

13

Es gibt vielleicht zwei Gründe, warum dies ein Codegeruch ist. Ein Grund dafür ist, dass Sie möglicherweise keine Domänenobjekte haben, sondern Wertobjekte, die nur Daten zur Manipulation durch Controller- oder Manager-Klassen speichern. Dies ist eigentlich ziemlich häufig und läuft auf eine prozedurale Programmierung in einer OO-Sprache hinaus. Die "vielen Manager" können ein Hinweis darauf sein, dass Sie Statuslogik, Validierung und andere direkte Belange in die Domänenobjekte integrieren müssen, damit sie tatsächlich etwas einkapseln. Natürlich gibt es größere Hinweise wie die Tatsache, dass Sie keine anderen Methoden als Getter / Setter haben.

Der andere Grund, warum es sich um einen Codegeruch handelt, ist, dass dies bedeuten kann, dass Ihre Domänenobjekte nicht wirklich gut miteinander in Beziehung stehen. Wenn Sie beispielsweise eine Account-Klasse haben, die wirklich nichts über die Transaction-Klasse weiß, außer dass sie als Transaction bezeichnet wird und es mehr als eine davon geben kann, haben Sie wiederum keine wirklich lebendige Business-Domain-Implementierung. Zum Beispiel sollte SavingsAccount wissen, dass es eine DebitTransaction nicht akzeptieren kann, wenn der accountStatus geschlossen ist. Viele Implementierungen würden dies dem Manager überlassen.

Jeremy
quelle
4

Viele "Manager" -Klassen zu haben, ist oft ein Symbol für ein anämisches Domänenmodell , bei dem die Domänenlogik aus dem Domänenmodell herausgehoben und stattdessen in Manager-Klassen eingeordnet wird , die mehr oder weniger Transaktionsskripten entsprechen . Die Gefahr besteht darin, dass Sie im Grunde auf die prozedurale Programmierung zurückgreifen - dies kann je nach Projekt an sich eine gute Sache sein oder auch nicht -, aber die Tatsache, dass dies nicht berücksichtigt oder beabsichtigt ist, ist der "Codegeruch" imo.

Nach dem Prinzip des "Informationsexperten" sollte eine logische Operation so nah wie möglich an den Daten liegen, die sie benötigt. Dies würde bedeuten, dass die Domänenlogik wieder in das Domänenmodell verschoben wird, sodass sich diese logischen Operationen spürbar auf den Status des Domänenmodells auswirken, anstatt dass Transaktionsskripts den Status des Domänenmodells von außen ändern.

MattDavey
quelle
3

Das größte Problem bei Manager-Klassen ist, dass sie nur diese vage Vorstellung davon darstellen, was die Klasse tun soll. Wenn Sie etwas als Manager bezeichnen, kann es alles tun, was für die Verwaltung erforderlich ist. Ich nehme an, in einigen Zusammenhängen mag das in Ordnung sein, aber ich würde in fast allen Fällen sagen, dass das nicht das ist, was Sie wollen. Sie möchten, dass jemand in der Lage ist, sich den Klassennamen anzusehen und nicht nur eine verdammt gute Vorstellung davon zu haben, was die Klasse tut, sondern auch, was sie nicht tut.

Ein weiteres Problem bei Manager-Klassen ist, dass es sehr schwierig ist zu entscheiden, wohin die Funktionalität gehen soll. Wenn es viele Manager-Klassen gibt, gibt es häufig eine große Überschneidung in der Funktionalität zwischen Manager-Klassen. Sie müssen dann herausfinden, welche Klasse diese überlappende Funktionalität implementieren soll, und natürlich hätte sich jemand anders entschieden. Wenn sie also nach der Funktionalität suchen und sie nicht dort sehen, wo sie sie erwarten, setzen sie sie dort um, wo sie glauben, dass sie dazugehört, weil sie sich der Existenz der anderen Implementierung nicht bewusst sind. Mit anderen Worten, Manager-Klassen führen zu schwer verständlichen und häufig verschlungenen Designs.

Dunk
quelle