Wann macht eine Leim- oder Managementklasse zu viel?

10

Ich neige dazu, zentralisierte Klassen zu erstellen, die die anderen Klassen in meinen Entwürfen verwalten. Es wird nicht alles selbst gespeichert, aber die meisten Datenanforderungen werden zuerst an den "Manager" gesendet. Als ich mir eine Antwort auf diese Frage ansah, bemerkte ich den Begriff "Gottobjekt". Wikipedia listet es verständlicherweise als Antimuster auf.

Wo liegt die Grenze zwischen einer legitimen Leimklasse oder einem legitimen Modul, das Daten und Nachrichten von Ort zu Ort weiterleitet, und einer Klasse, die zu viel tut?

jprete
quelle

Antworten:

15

Viele Leute sagen Dinge wie "Eine Klasse sollte niemals größer sein als dein Kopf".

Ich habe jedoch gerade an einer Diskussion mit einigen wirklich großartigen Programmierern von Weltklasse zu diesem Thema teilgenommen. Ich habe es mit einem der Naked Objects-Leute durchgesprochen. Soweit wir das beurteilen können, passiert dies manchmal, und es gibt nicht viel, um es zu umgehen.

Normalerweise ist die eine Klasse, der dies passiert, ein Domain-Objekt, das das grundlegende Element Ihrer Domain darstellt - ein Konto für Bankgeschäfte, ein Verkauf für den Einzelhandel usw. Wenn Sie feststellen, dass dies auch anderen Klassen passiert, sind Sie es wahrscheinlich Ich möchte die Verantwortung dieser Klasse berücksichtigen. Hier sind meine Tipps:

  • Wenn es "Manager", "Helfer" oder "Service" heißt, ist es wahrscheinlich zu groß. Sobald Sie tatsächlich herausgefunden haben, welche Verantwortung eine Klasse haben sollte, fällt es Ihnen leichter, die anderen Verantwortlichkeiten zu delegieren.
  • Wenn es "Controller" heißt, sollte es für die Steuerung der Interaktion zwischen einer Reihe anderer Klassen verantwortlich sein ... und sonst nichts.
  • Wenn Daten und Nachrichten zwischen verschiedenen physischen Knoten übertragen werden , sollte entweder die Konvertierung einer bestimmten Nachricht in ein serialisiertes Formular behandelt werden, oder es wird der Übertragungsmechanismus verwaltet. Beispielsweise haben Sie möglicherweise eine Klasse, die eine Banküberweisung in XML konvertiert, und eine andere Klasse, die diese XML über HTTP sendet.
  • Wenn Ereignisse zwischen verschiedenen Modulen in einer Anwendung übergeben werden, sollte es dafür verantwortlich sein, den Listenern mitzuteilen, wann ein Ereignis ausgelöst wird, und sonst nichts.

Als Faustregel gilt: Wenn es zu groß ist, prüfen Sie, ob Sie Verantwortlichkeiten an eine andere Klasse delegieren können. Wenn dies nicht möglich ist, ist dies wahrscheinlich in Ordnung.

Lunivore
quelle
Gute Antwort mit nützlichen konkreten Richtlinien. Ich neige dazu, Klassen wie diese für Domänenobjekte zu erstellen, bei denen alle oder fast alle Daten einen Aspekt der Domäne darstellen, und ich möchte sie als Einheit behandeln können. Dann neige ich dazu, die eigentlichen Verantwortlichkeiten an Klassen zu delegieren, die nur innerhalb der großen Klasse wirklich instanziiert werden. Ich bin also ziemlich nah an der Linie und sollte mich wahrscheinlich dazu neigen, die einzelnen Klassen beim Schreiben kleiner zu machen.
jprete