Ist es besser, den spezifischsten oder allgemeinsten Typ von einer Aktionsmethode zurückzugeben?

8

Was sind die Vorteile oder Nachteile von beiden?

    
DaveDev 08.08.2010, 12:54
quelle

2 Antworten

17

Meine Richtlinien waren immer am spezifischsten und allgemeinsten.

Je allgemeiner Ihr Datentyp ist, desto weniger kennt der Code, der ihn verwendet, den Datentyp. Wenn eine Methode beispielsweise eine Auflistung zurückgibt, würde ich die neu erstellte Sammlung zurückgeben, die von der Methode erstellt wurde. Wenn es eine interne Datenstruktur zurückgibt, würde ich es auf IEnumerable<T> stoßen.

Wenn jedoch ein Array oder List<T> zurückgegeben wird, weil es intern erstellt wurde, hat der Code, der Ihre Daten erfasst, jetzt Zugriff auf weitere Funktionen in Ihrer Sammlung.

Das andere Ende des Spektrums, um den allgemeinsten (innerhalb der Grenzen) Datentyp zurückzugeben, würde bedeuten, dass Sie immer IEnumerable<T> oder ähnliches für alle Sammlungen zurückgeben, auch wenn die Methode intern ein neues Array erstellt und das zurückgegeben hat. Der aufrufende Code muss nun den Inhalt der Sammlung manuell in ein neues Array oder eine neue Liste kopieren, wenn der aufrufende Code dies benötigt.

Dies bedeutet mehr und in den meisten Fällen unnötige Arbeit.

Wie bei der Eingabe, gehe ich für den allgemeinsten Typ, den ich verwenden kann, also für Sammlungen, wenn ich nicht ausdrücklich ein Array oder eine Liste oder ähnliches brauche, werde ich IEnumerable<T> akzeptieren. Auf diese Weise stelle ich sicher, dass der aufrufende Code weniger Arbeit zu erledigen hat. Dies kann bedeuten, dass ich intern etwas arbeiten muss, also ist es ein Kompromiss.

Das Wichtigste ist, ein Gleichgewicht zu erreichen. Sei nicht zu allgemein oder zu spezifisch, immer und jedes Mal. Finden Sie den richtigen Typ heraus, der sinnvoll ist, und überlegen Sie, was der aufrufende Code tun muss, um Daten zu übergeben oder ausgehende Daten von Ihrem Code zu akzeptieren. Je weniger Arbeit, desto besser.

    
Lasse Vågsæther Karlsen 08.08.2010, 13:01
quelle
2

Im Allgemeinen würde ich für den allgemeineren Typ gehen. Auf diese Weise werde ich keinen Client brechen, der die Informationen über den Rückgabetyp verwenden könnte.

Wenn ich einen allgemeineren Typ zurückgebe, kann ich bei der Implementierung der Aktionsmethode immer den Typ in etwas anderes ändern. Stellen Sie sich das folgende Szenario vor: Sie geben ein Ergebnis einer benutzerdefinierten Aktion zurück, das von ActionResult abgeleitet wird. Irgendwo in Ihrer Codebasis gibt es eine Annahme, dass der Rückgabewert MyCustomActionResult ist. In diesem Fall würden Sie, wenn Sie den Rückgabewert ändern, den Client-Code unterbrechen.

BTW: Ich mache das gleiche - gebe den geeignetsten allgemeinen Typ zurück - für alle Methoden nicht nur für Aktionsmethoden.

Bearbeiten: Bitte beachte, dass dies nicht bedeutet, dass ich object zurückgeben würde. Die Herausforderung besteht darin, den Typ zu finden, der die "geeignetste" Abstraktion darstellt.

    
Manfred 08.08.2010 12:59
quelle