Regeln zur Konkretheit von Methodenparametertypen, Rückgabetypen und Eigenschaftstypen

9

Vor einiger Zeit habe ich eine Art "Faustregel" über die Konkretheit von Methodenparametertypen, Rückgabetypen und Eigenschaftstypen gelesen, aber ich erinnere mich einfach nicht daran.

Es ging darum, Ihre Rückgabetypen so konkret wie möglich und Ihre Parametertypen so abstrakt wie möglich zu halten ... oder umgekehrt.

Ich weiß nicht, ob es tatsächlich ein guter oder ein schlechter Rat war. Wenn Sie also Ihre eigenen Gedanken dazu haben, lassen Sie bitte einen Kommentar.

Prost.

NullOrEmpty
quelle

Antworten:

7

Durch abstrakte Eingaben und konkrete Ausgaben wird Ihre Funktion allgemeiner. Dies bedeutet, dass es auf mehr Arten verwendet werden kann. Auf der anderen Seite werden Ihre Methode stärker eingeschränkt, wodurch die Funktionsweise zukünftiger Implementierungen eingeschränkt wird. Es ist also ein Kompromiss zwischen verschiedenen Zielen.

CodesInChaos
quelle
4

Es könnte sein, dass Sie eine Extrapolation des Postelschen Gesetzes gehört haben : "Seien Sie konservativ in dem, was Sie senden, liberal in dem, was Sie akzeptieren."

Meist geht es darum, die Wiederverwendbarkeit von Code zu maximieren. Es ist einfach, Fälle zu finden, um zu demonstrieren, warum es hilft. Betrachten Sie Java Iterable<T>als Beispiel. Wenn Ihre Methode nur alle Ts durchläuft , können Sie mit einem Iterable<T>Parametertyp als Methode diese Methode mit über 60 integrierten Klassen verwenden, ganz zu schweigen von benutzerdefinierten Klassen, die die Schnittstelle implementieren. Wenn Sie es beispielsweise auf beschränken Vector<T>würden, müsste jeder Code, der Ihre Methode aufruft, in einen Vector<T>ersten konvertiert werden .

Auf der anderen Seite, die Rückkehr eines Iterable<T>von einem Verfahren begrenzt die Menge an Code, der Ihren Rückgabewert für diejenigen , die einen nehmen können Iterable<T>Parameter. Wenn Sie einen sehr konkreten Typ zurückgeben, wie Vector<T>, dann können Sie Ihre Rückgabewert in jede Methode übergeben werden, der eine nimmt Serializable, Cloneable, Iterable<T>, Collection<T>, List<T>, RandomAccess, Vector<T>, AbstractList<T>, oder AbstractCollection<T>, und es wird erwartet funktionieren.

Karl Bielefeldt
quelle
Das Postelsche Gesetz steht ganz oben auf meiner Liste der "größten Softwareentwicklungsfehler".
CodesInChaos