2010-04-21 7 views
6

Heute kam ich zu einem fundamentalen Paradox des Objektprogrammierstils, konkreter Typen oder Interfaces.Konkrete Typen oder Schnittstellen für Rückgabetypen?

Was ist die bessere Wahl für den Rückgabetyp einer Methode: ein konkreter Typ oder eine Schnittstelle?

In den meisten Fällen neige ich dazu, konkrete Typen als Rückgabetyp für Methoden zu verwenden. weil ich glaube, dass ein konkreter Typ für die weitere Verwendung flexibler ist und mehr Funktionalität bietet.

Die dunkle Seite von diesem: Kupplung. Der Engel: Ein konkreter Typ enthält per-se die Schnittstelle, die Sie am Anfang zurückgeben würden, und zusätzliche Funktionalität.

Was ist deine Daumenregel?

Gibt es dafür ein Programmierprinzip?


BONUS: Dies ist ein Beispiel dafür, was ich meine ReadOnlyCollection or IEnumerable for exposing member collections?

Antwort

4

Meine Faustregeln:

1) Zunächst habe ich die Methode die Schnittstelle Typ zurückgeben, weil es ist immer einfach, es auf die konkrete Art bei Bedarf später zu ändern. Schwieriger, in die andere Richtung zurückzukehren.

2) Auch wenn das Verfahren den konkreten Typ zurückzukehren deklariert ist, würde ich die Anrufer codieren den Schnittstellentyp, wann immer möglich zu verwenden:
InterfaceType i = xyz.methodThatReturnsConcreteType();.

3) Ob ich besitze den anrufende Code zu einem Unterschied macht (interne vs öffentlicher APIs):

  • Wenn ich den Code besitzen, der die Methode in Frage stellt (dh interne API), dann ist die bereite Ich soll den Betontyp zurückgeben.
  • Wenn ich den Code nicht kontrolliere, der diese Methode aufruft (z. B. öffentliche API), würde ich eher den Schnittstellentyp zurückgeben. Die Rückkehr des konkreten Typs ist eine Verpflichtung, und je weniger ich versprich, desto einfacher.

Weitere Überlegungen:

  • Testing mit Schnittstellen einfacher kann, da ich ein Mock-Objekt verwenden kann, die die Schnittstelle implementiert.
  • Es gibt eine geringe Chance, dass ich ein proxy object zurückkehren möchte (jetzt bin Erreichen ich wirklich für Ausreden)

Zusammengefasst

  • I in der Regel den Schnittstellentyp zurückgeben weil ich der Meinung bin, dass die Vorteile der losen Kopplung den Komfort des vollen Zugangs zum Betontyp überwiegen.
  • Allerdings bin ich nicht gegen eine Umstellung auf zurück die konkrete Art auf einer Fall-für-Fall-Basis, wenn der Komfort überwiegt die Vorteile der loose-Kupplung.
7

Faustregel in Rückgabetypen, ein so spezifisch wie möglich sein, in Parametertypen möglichst unspezifisch sein. Bevorzugen Sie auch Schnittstellen, da Sie bei Bedarf später Ihre Implementierung austauschen können, ohne die Clients Ihrer API zu ändern.

+0

Vielen Dank für Ihre Meinung Dominik +1 – SDReyes

+0

Eine 'MyCustomExtendedArrayList' ist spezifischer als' List'. Was würdest du zurückgeben? – BalusC

+2

@BalusC: Hängt davon ab, ob es nur eine andere Implementierung von List oder es bietet einige benutzerdefinierte Methoden. Welchen Sinn würde es machen, eine spezialisierte Klasse zurückzugeben, wenn sie nur durch Casting verwendet werden kann? – Dominik

1

Interessante Frage. Ich glaube, Sie müssen sich fragen, wie die Rückgabedaten verwendet werden können. Verwenden Sie die Oldtimer-Analogie, wenn Sie hatten

public AccelerationResponse PressAccelerator(float force) {} 

Die Chancen, dass Sie lieber eine Schnittstelle als eine Klasse zurückgeben möchten. Sie könnten diese Antwort abhängig von bestimmten Bedingungen unterschiedlich interpretieren.

Wenn Sie sicher sind, dass Ihre Rückgabe nur in der Art und Weise verwendet werden kann, die von der konkreten Implementierung erwartet wird, ist die Verwendung dieser Klasse sinnvoll. Ich bin mir nicht sicher, ob ein allgemein akzeptiertes Prinzip existiert, aber meine Faustregel ist, dass wenn der Rückgabetyp in verschiedenen Implementierungen wiederverwendet werden kann, eine Schnittstelle mehr Sinn macht.

+0

Vielen Dank Jeremy, speziell für die "... wenn der Rückgabetyp in verschiedenen Implementierungen wiederverwendet werden kann, macht eine Schnittstelle mehr Sinn" Teil +1 – SDReyes

Verwandte Themen