In verschiedenen Designbüchern, die ich lese, wird manchmal großer Wert auf die Anzahl der Methoden gelegt, die eine Klasse haben muss (unter Berücksichtigung einer OO-Sprache, z. B. Java oder C #). Oft sind die Beispiele in diesen Büchern sehr ordentlich und einfach, aber selten behandeln sie einen "ernsten" oder komplexen Fall.
Der Bereich scheint jedoch zwischen 5 und 8 zu liegen.
In einem Projekt habe ich eine Klasse "Note" mit den Attributen "Title", "Desctiption", "CreateDate" usw. entwickelt.
Dann einige grundlegende Methoden wie: getRelations (wenn die Note verschiedenen Dokumenten zugewiesen ist), getExpiryDate, ect.
Bei der Entwicklung der Anwendung waren jedoch mehr Funktionalitäten und daher mehr Methoden erforderlich.
Ich weiß, dass eine Klasse umso lockerer gekoppelt ist, je weniger Methoden sie hat. Das ist in der Tat ein guter Vorteil in Bezug auf Modularität und Wiederverwendbarkeit sowie eine einfachere Bearbeitung.
Übrigens, wenn es in unserem Kontext nicht nötig (oder sogar sinnvoll) ist, Unterklassen zu erstellen und alle benötigten Funktionen mit dieser Klasse zusammenhängen, wie viele Methoden können wir dann weiter anfügen?
Ich bin damit einverstanden, dass mit mehr als 15 Methoden möglicherweise eine kleine Neugestaltung erforderlich ist.
Aber selbst in diesem Fall ist das Löschen einiger Methoden oder der Vererbung keine Option. Welcher Weg ist der richtige?
quelle
Antworten:
Haben Sie so viele Methoden, wie Sie brauchen. Ich würde versuchen, die Anzahl der öffentlichen Methoden auf diese Regel von 5 bis 8 zu beschränken, wenn dies möglich ist. Ehrlich gesagt, die meisten Menschen haben das gegenteilige Problem, bei dem sie verrückte Supermethoden anwenden, die mehr und nicht weniger ausbrechen müssen. Es ist wirklich egal, wie viele private Hilfsmethoden Sie haben. Wenn Sie in Java weniger als 8 Methoden verwenden, können Sie das Limit mit einer Klasse erreichen, die nur einen Konstruktor, einen toString und den Getter / Setter für 3 Eigenschaften enthält. Dies ist keine robuste Klasse. Die Quintessenz ist, machen Sie sich keine Sorgen darüber, wie viele Methoden Ihre Klasse enthält. Sorgen Sie sich darum, dass Ihre Klasse keine Belange berücksichtigt, die nichts miteinander zu tun haben, und dass Sie eine vernünftige öffentliche Oberfläche haben, die leicht verständliche Methoden enthält.
quelle
Die Antwort ist ganz einfach: Ordnen Sie alles in eine Klasse ein, die zu ihren Verantwortlichkeiten gehört, aber seien Sie vorsichtig, wenn Sie Verantwortlichkeiten zuweisen.
Manchmal setzt sich eine große Klasse aus kleineren Klassen mit unterschiedlichen Verantwortlichkeiten zusammen.
Im Allgemeinen versuche ich, die Zuständigkeiten in kleinere Klassen zu unterteilen, wenn die Klasse in ihrer Verwendung oder Wartung unhandlich wird. Ich habe selten Klassen, die länger als 500 Zeilen sind. Meine größten Klassen haben ungefähr 1.5k Locs.
Sie können einfach keine allgemeine Regel wie "eine Klasse sollte zwischen n und m Methoden haben" angeben.
quelle
Es gibt keinen Grund (im OO-Design), nur so viele Methoden zu haben. Es ist auch nicht wahr, dass eine Klasse mit weniger Methoden besser entkoppelt ist.
Schauen Sie sich zum Beispiel die Klasse java.lang.String an. Viele Methoden, weil es so viele Dinge gibt, die man mit einem String machen kann. Trotzdem nicht stark gekoppelt.
Ich frage mich, warum eine magische Zahl wie 15 gutes und schlechtes Design trennen könnte. Nein, so einfach ist das nicht.
quelle
In PMD besteht das Standardverhalten der TooManyMethods-Regel darin, Klassen mit 10 oder mehr Methoden als potenzielle Fehler zu identifizieren und zu kennzeichnen . Dies ist jedoch nur eine willkürliche Zahl. Es ist leicht in einer Konfiguration zu ändern. Unabhängig davon, wie hoch diese Zahl ist, ist es für einen Entwickler lediglich ein Anhaltspunkt, sich eine Klasse anzusehen und festzustellen, ob ein Problem vorliegt, und nicht, ob ein Problem damit vorliegt.
Etwas konkreter ist möglicherweise die 7 plus / minus 2-Regel . Dies besagt, dass der menschliche Geist zwischen 5 und 9 "Objekte" im Gedächtnis halten und erfassen kann. Beim Lesen einer bestimmten Klasse sind die Objekte höchstwahrscheinlich die Methoden und Felder, aus denen diese Klasse besteht. Allerdings Klassen häufig mehr als 9 Felder und Methoden, auch wenn Sie (zum Beispiel nicht Accessoren, Mutatoren und alle Standardoperationen zählen
toString()
,hashCode()
undequals()
in Java).Die relevantesten Maßnahmen wären Fan-In und Fan-Out sowie Diskussionen über Kopplung und Zusammenhalt . Das Prinzip der Einzelverantwortung und die Trennung von Anliegen sollten angewendet werden - eine Klasse sollte eine Sache und eine Sache für sich allein tun oder darstellen. Diese sind weitaus besser als der Versuch, bei der Beurteilung eines Entwurfs oder einer Implementierung der maximalen / minimalen Anzahl von Methoden Zahlen zuzuweisen.
quelle