Was ist die Grenze für die Anzahl der Methoden einer Klasse?

22

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?

Francesco
quelle
3
Menschen scheinen eine eingebaute Vergessensreichweite zu haben. Sobald Sie die sieben Optionen überschritten haben, werden die ersten vergessen. Geben Sie also nicht mehr als 7 Optionen pro Schnittstelle.
Martin York
+ 1 @ Martin- 7 + oder- 2
Morgan Herlocker
Diese Einschränkung gilt nur für das Kurzzeitgedächtnis. Wie könnten wir uns sonst an all diese verschiedenen Buchstaben und Wörter erinnern? Im Ernst, wenn die Klasse stark genutzt wird, können Sie sie sich als Minisprache vorstellen und haben so viele Methoden, wie Sie brauchen, um auszudrücken, was Sie damit zu tun haben.
Artem

Antworten:

30

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.

Morgan Herlocker
quelle
Richtig, aber wenn es sich um eine Utility-Klasse handelt, sind bis zu 10-15 in Ordnung.
Sid
1
@SidCool - Ich sage nicht, dass ich sie nie benutze, aber Utility-Klassen sind zunächst keine bewährte Methode. In der Regel handelt es sich nur um eine Minigottklasse, die eine Reihe von Belangen zusammenführt, die nichts miteinander zu tun haben. Vor diesem Hintergrund sollte eine Utility-Klasse eigentlich gar nicht existieren, geschweige denn mit 15 Methoden.
Morgan Herlocker
1
Meine Klasse "Note" ist keine Utility-Klasse. Es stellt ein Geschäftsobjekt dar (eine Notiz, mit der einem Dokument Kommentare und Beschreibungen hinzugefügt werden können). Allerdings stimme ich ironcode hinsichtlich der Gefahr von "Utility" -Klassen zu. Sie helfen uns, wenn wir unsere Lieferfristen eilig haben, aber ich denke, es gibt oft eine bessere Lösung / ein besseres Design für sie.
Francesco
13

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.

Falke
quelle
8

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.

Ingo
quelle
Ich stimme zu, die Zahl 15 war nur eine Annäherung an das Lesen dieser Designbücher (als "Code Complete" von Steven McConnell als Beispiel). Tatsächlich verfügt die String-Klasse über eine Vielzahl von Methoden, die sich alle auf dieselbe Entität beziehen.
Francesco
@Luca: Das Problem bei einigen dieser Bücher ist, dass die Beispiele oft erfunden sind und daher kleiner als viele Beispiele aus der Praxis sind.
FrustratedWithFormsDesigner
Genau ... wahrscheinlich, um Konzepte für die meisten klarer zu machen und die potenzielle Basis der Käufer zu erweitern ...
Francesco
Ich möchte jede Art von DataGrid oder sogar UI-Steuerung mit nur 15 Methoden sehen. Wenn Sie diese Klassen in kleinere Klassen aufteilen, wird die Schnittstelle zum Albtraum.
Falcon
6

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()und equals()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.

Thomas Owens
quelle
+1 - Die 7 + -2-Regel ist eine Regel, nach der die Benutzerfreundlichkeit zu leben ist.
Morgan Herlocker