6 Stimmen

Konkrete Typen oder Interfaces für Rückgabetypen?

Heute bin ich auf ein grundlegendes Paradoxon des objektorientierten Programmierstils gestoßen: konkrete Typen oder Schnittstellen.

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 flexibler für die weitere Verwendung ist und mehr Funktionalität bietet.

Die Schattenseite der Sache: Die Paarung. Die engelsgleiche: Ein konkreter Typ enthält per se die Schnittstelle, die Sie ursprünglich zurückgeben wollten, und zusätzliche Funktionalität.

Wie lautet Ihre Daumenregel?

Gibt es dafür ein Programmierprinzip?


BONUS : Dies ist ein Beispiel dafür, was ich meine ReadOnlyCollection oder IEnumerable für die Anzeige von Mitgliedersammlungen?

8voto

Dominik Punkte 1199

Als Faustregel gilt: Bei Rückgabetypen so spezifisch wie möglich, bei Parametertypen so unspezifisch wie möglich. Bevorzugen Sie außerdem Schnittstellen, da Sie Ihre Implementierung bei Bedarf später austauschen können, ohne die Clients Ihrer API zu ändern.

8voto

Bert F Punkte 81431

Meine Faustregeln:

1) Zunächst gebe die Methode den Schnittstellentyp zurück, da es immer einfach ist, sie später in den konkreten Typ zu ändern, falls erforderlich. Schwieriger ist es, den umgekehrten Weg zu gehen.

2) Selbst wenn die Methode so deklariert ist, dass sie den konkreten Typ zurückgibt, würde ich die Aufrufer so codieren, dass sie den Schnittstellentyp verwenden, wann immer dies möglich ist:
InterfaceType i = xyz.methodThatReturnsConcreteType(); .

3) Es macht auch einen Unterschied, ob ich den aufrufenden Code besitze (interne oder öffentliche APIs):

  • Wenn ich den Code besitze, der die betreffende Methode aufruft (d. h. die interne API), bin ich umso eher bereit, den konkreten Typ zurückzugeben.
  • Wenn ich den Code, der diese Methode aufruft, nicht kontrolliere (z. B. bei einer öffentlichen API), ist es wahrscheinlicher, dass ich stattdessen den Schnittstellentyp zurückgebe. Die Rückgabe der konkreten Art ist eine Verpflichtung, und je weniger ich verspreche, desto einfacher ist es im Allgemeinen.

Andere Überlegungen:

  • Testen kann mit Schnittstellen einfacher sein, da ich ein Mock-Objekt verwenden kann, das die Schnittstelle implementiert.
  • Es besteht eine geringe Chance, dass ich eine Proxy-Objekt (jetzt suche ich wirklich nach Ausreden)

Zusammengefasst,

  • Normalerweise Rückgabe des Schnittstellentyps weil ich der Meinung bin, dass die Vorteile der losen Kopplung die Bequemlichkeit des vollen Zugriffs auf den konkreten Typ überwiegen.
  • Ich bin jedoch nicht gegen einen Wechsel zu den konkreten Typ zurückgeben von Fall zu Fall, wenn die Bequemlichkeit die Vorteile der losen Kopplung überwiegt.

1voto

Jeremy B. Punkte 9114

Eine interessante Frage. Ich glaube, man muss sich fragen, wie die Rücklaufdaten genutzt werden können. Um die alte Auto-Analogie zu verwenden, wenn Sie

public AccelerationResponse PressAccelerator(float force) {}

Es ist wahrscheinlich, dass Sie eher 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 von der konkreten Implementierung erwarteten Weise verwendet werden kann, ist die Verwendung dieser Klasse sinnvoll. Ich bin mir nicht sicher, ob es einen allgemein akzeptierten Grundsatz gibt, aber meine Faustregel lautet: Wenn der Rückgabetyp in verschiedenen Implementierungen wiederverwendet werden kann, ist eine Schnittstelle sinnvoller.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X