2 Stimmen

Ist es besser, den Datentyp einer Methode so spezifisch wie möglich oder eher allgemein zu halten?

In ASP.Net MVC, wenn ich eine Methode auf einem Controller, die eine Ansicht zurückgibt sollte diese Methode vom Typ ViewResult oder die allgemeinere ActionResult sein?

4voto

David Hoerster Punkte 27923

Eine ähnliche Frage wurde in den ASP.NET-Foren gestellt: http://forums.asp.net/t/1423519.aspx

Im Grunde kommt es auf den Stil an - in OOP versucht man, den spezifischsten Typ zurückzugeben, den man in der gegebenen Situation zurückgeben kann. Man gibt nicht zurück object für jede Methode, die Sie haben - manchmal geben Sie string manchmal List , manchmal eine benutzerdefinierte Klasse.

In den Antworten im Forum zitiert jemand Stephen Walther aus seinem Buch:

HINWEIS Diese Aktionsmethode umfasst insbesondere deklariert, dass sie eine Instanz von ViewResult zurückgibt. Sie würde genau so funktionieren funktionieren, wenn stattdessen der Rückgabetyp der Methode ActionResult wäre (die Basisklasse für alle Aktionsergebnisse). In der Tat, einige ASP.NET MVC Programmierer deklarieren alle ihre Aktionsmethoden als Rückgabe einer unspezifisches ActionResult zurück, auch wenn sie sicher wissen, dass sie immer eine bestimmte Unterklasse zurückgibt. Es ist jedoch ein etablierter Grundsatz in der objektorientierten Programmierung, dass Methoden den den spezifischsten Typ zurückgeben sollten, den sie können (und und die allgemeinsten Parametertypen Parametertypen akzeptieren können). Nach diesem Prinzip maximiert die Bequemlichkeit und Flexibilität für Code, der Ihre Methode aufruft, wie z.B. Ihre Unit-Tests.

Die Verwendung des spezifischeren ViewResult vorzuziehen, vor allem aus der Sicht von Unit-Tests.

2voto

Mark Cidade Punkte 95914

Eine Methode ist am nützlichsten, wenn ihre Parameter so allgemein wie möglich sind (z.B., IEnumerable<T> anstelle eines Arrays) und sein Rückgabewert ist so spezifisch wie möglich (z.B., IList<T> anstelle von IEnumerable ).

Beim Rückgabewert ist es jedoch immer noch besser, Schnittstellen oder abstrakte Typen anstelle von konkreten Typen zu verwenden (z. B., IList<T> anstelle von List<T> ), was Ihnen eine gewisse Flexibilität bei der Änderung der Implementierung bietet oder zumindest die Kopplung mit dem aufrufenden Code minimiert.

Wenn Sie nicht vorhaben, das Ergebnis in eine andere Art von ActionResult zu ändern, können Sie es ein ViewResult zurückgeben lassen. Wenn Sie nicht vorhersehen, dass ein Aufrufer das ViewResult nutzen wird, kann es als ActionResult zurückgegeben werden, aber es spielt keine Rolle, wie auch immer.

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