Anzahl der Methoden in einer Schnittstelle

7

Ich weiß, das mag eine kontroverse Frage sein, aber es ist wirklich nicht so gemeint. Gibt es eine optimale Anzahl von Methoden in einer Schnittstelle?

Zum Beispiel hasse ich persönlich eine Schnittstelle mit 20 Methoden. Es ist nur schwer zu implementieren. Der Vertrag scheint schwer aufrechtzuerhalten. Ähnlich, wenn die Anzahl der Methoden nur 1 ist. Es lässt mich fragen, ob es wirklich eine gute Abstraktion ist.

Irgendwelche Gedanken?

    
Jeow 19.03.2010, 16:10
quelle

11 Antworten

16

Eine Schnittstelle sollte genau so viele Methoden haben, wie sie benötigt wird. Beispiele:

java.lang.Iterable - 1 Methode
java.lang.Comparable - 1 Methode
java.util.Collection - 14 Methoden
java.util.List - 25 Methoden (einschließlich derjenigen aus der Sammlung)

Die Antwort lautet also: Nimm die Nummer nicht als Kriterium für deine Schnittstelle. Setzen Sie stattdessen Methoden in Schnittstellen, wo sie logisch hingehören.

    
Bozho 19.03.2010, 19:14
quelle
5

Es gibt eine bekannte Studie , die darauf hinweist, dass wir die Anzahl der Informationen, die wir verarbeiten können, gleichzeitig angeben können ist sieben, plus oder minus zwei. Ich finde oft, dass dies eine gute Faustregel für diese Art von Frage ist - in diesem Fall, wenn die Schnittstelle entworfen ist, um einen einzigen verwandten Satz von Funktionen zu verwalten, werden wir wahrscheinlich nicht in der Lage sein, die Funktionalität als eine einzige zu verstehen Stellen Sie ein, wenn es viel mehr als sieben ist.

Für viele Schnittstellen muss ein Entwickler jedoch nicht in der Lage sein, die Funktionalität als eine zusammenhängende Menge zu verstehen. In diesem Fall wäre diese Regel nicht relevant.

    
JacobM 19.03.2010 16:18
quelle
4

Gut Schnittstellen mit einer Methode haben normalerweise ihren Zweck und Sie können sie einfacher anonym implementieren. Meine Faustregel ist so viele Methoden wie nötig . Viele Methoden in einer Schnittstelle weisen jedoch darauf hin, dass Sie sie in mehrere andere Schnittstellen aufteilen können, insbesondere wenn sie unterschiedliche Aufgabenbereiche betreffen (z. B. wird ein UserLoginAndAdministrationInterface zu einer UserLogin- und einer UserAdministration-Schnittstelle). Sie können beliebig viele Schnittstellen in einer Klasse implementieren und sie können auch in Unterklassen unterteilt werden. Also tut es nicht weh, sie zu spalten.

    
Daff 19.03.2010 16:11
quelle
4

Ich wäre eher besorgt, dass die Schnittstelle logisch konsistent ist, als sie irgendeine willkürlich optimale Anzahl von Methoden hat. Das heißt, eine große Anzahl von Methoden könnte ein "Gott" -Objekt anzeigen, das refaktorisiert werden sollte. Der klarere Hinweis ist, dass die Methoden nicht zusammenhängend sind, aber die Anzahl der Methoden könnte leichter zu beobachten sein und Sie zu einer genaueren Untersuchung führen. Manchmal müssen Sie jedoch viele Methoden verwenden, da es viele mögliche Operationen gibt, die Sie für Objekte dieses Typs ausführen möchten. Ein Beispiel dafür wäre etwas wie IEnumerable<T> in .NET. Ich kann mir keinen vernünftigen Grund vorstellen, diese in separate Schnittstellen zu zerlegen, aber es gibt viele Methoden in der Schnittstelle.

    
tvanfosson 19.03.2010 16:12
quelle
4

Eine Schnittstelle sollte genau so viele Methoden haben wie sie benötigt .

Wenn diese Zahl groß ist, sollte die Begründung sorgfältig geprüft werden, kann aber auch gültig sein.

Andererseits gibt es (mindestens) eine Instanz in Java, wo die Schnittstelle keine Methoden benötigt (serialisierbar) und somit keine hat. Weniger Methoden, macht es definitiv einfacher, die Schnittstelle zu implementieren, kann aber immer noch eine sehr nützliche Abstraktion bereitstellen. Es gibt eine Reihe von Schnittstellen zu einer Methode.

    
Kris 19.03.2010 16:18
quelle
3

Es gibt no optimale Anzahl von Methoden in einer Schnittstelle. Schnittstellen werden für alle möglichen Dinge verwendet, und was angemessen ist, hängt ganz davon ab, was.

In einem Extremfall wird eine Schnittstelle möglicherweise von einem Programm automatisch für die Verwendung durch ein anderes Programm code-generiert und könnte aus gutem Grund 1000 Methoden enthalten.

Für Code, der für Menschen lesbar ist, können Regeln die Beurteilung nicht ersetzen.

    
bmargulies 19.03.2010 16:13
quelle
2

7 ± 2

    
John Topley 19.03.2010 16:47
quelle
1

Es gibt keine richtige oder falsche Antwort darauf, wie viele Methoden für eine Schnittstelle akzeptabel sind. Einige können Null haben, andere eine, und wahrscheinlich werden nur sehr wenige jemals hundert überschreiten. Die größte Schnittstelle, die ich je geschrieben habe, war fast dreißig Methoden, aber es war eine Fassade für Kunden.

Allerdings würde ich denken, dass eine Schnittstelle, die mehr als 8-10 Methoden hätte, ein möglicher Code-Rauch wäre - nur etwas, das 5 Sekunden für die Untersuchung rechtfertigen würde.

    
tmeisenh 19.03.2010 16:43
quelle
0

Der Weg, mit vielen Methoden umzugehen, wenn Sie nur ein paar implementieren müssen, ist Abstract -Klassen, die Standardimplementierungen oder throw NotImplementedException liefern. Wenn es nur eine Methode gibt, dann ist es wahrscheinlich in Ordnung, weil es Methoden gibt, die nur diese eine Oberfläche erwarten und diese eine Methode aufrufen. Es gibt viele Muster, zum Beispiel Vistor, die nur eine Methode brauchen.

    
Jarrod Roberson 19.03.2010 16:11
quelle
0

Diese zwanzig Methoden erfassen entweder etwas Nützliches zusammen oder nicht. Wenn dies der Fall ist, müssen Sie alle implementieren , um eine Implementierung für die Sache bereitzustellen, die sie erfassen. Es wird konsistent sein, sie in diesem Fall in derselben Schnittstelle unterzubringen.

    
David Soroko 19.03.2010 16:18
quelle
-1

Die Antwort ist - nimm die Nummer nicht als Kriterium für deine Schnittstelle. Setzen Sie stattdessen Methoden in Schnittstellen, wo sie logisch hingehören, und Sie können sie in verschiedenen Klassen verwenden Sie können eine Methode der Schnittstelle in zwei oder mehr Klassen verwenden, also zögern Sie nicht, Schnittstelle zu verwenden es eine gute Programmiertechnologie.

    
Sanjeev 19.03.2010 16:37
quelle

Tags und Links