¿Cuáles son los beneficios o detrimentos de cualquiera de ellos?¿Es mejor devolver el tipo más específico o más general de un método de acción?
Respuesta
Mis directrices siempre ha sido más específica, y más en general en.
El más general el tipo de datos es, menor es el código que utiliza que sabe sobre el tipo de datos. Por ejemplo, si un método devuelve una colección, devolvería la colección recién creada que produjo el método. Si devuelve una estructura de datos interna, la subiría al IEnumerable<T>
.
Sin embargo, si devuelve una matriz, o List<T>
porque eso es lo que creó internamente, el código que obtiene sus datos ahora tiene acceso a más funciones en su colección.
El otro extremo del espectro, para devolver el tipo de datos más general (dentro de los límites) significa que siempre devuelve IEnumerable<T>
o similar para todas las colecciones, incluso si el método construyó una nueva matriz internamente y la devolvió. El código de llamada ahora tiene que copiar manualmente los contenidos de la colección en una nueva matriz o lista, si eso es lo que necesita el código de llamada.
Esto significa más, y en la mayoría de los casos, trabajo innecesario.
En cuanto a la entrada, voy por el tipo más general que puedo usar, por lo que para colecciones, a menos que necesite específicamente una matriz o una lista o similar, aceptaré IEnumerable<T>
. Al hacerlo, me aseguro de que el código de llamada tenga menos trabajo por hacer. Esto podría significar que tengo que trabajar un poco internamente, por lo que es una solución de compromiso.
Lo importante es alcanzar un equilibrio. No seas demasiado general o demasiado específico, todo el tiempo, todo el tiempo. Determine el tipo correcto que tenga sentido y tenga en cuenta lo que tiene que hacer el código de llamada para pasar datos o aceptar datos salientes de su código. Cuanto menos trabajo, mejor.
En general, iría por el tipo más general. De esa forma no romperé ningún cliente que pueda usar la información sobre el tipo de devolución.
Si devuelvo un tipo más general, en la implementación del método de acción siempre puedo cambiar el tipo a algo diferente. Tenga en cuenta la situación siguiente: devuelve un resultado de acción personalizado que deriva de ActionResult
. En algún lugar de su base de código, se parte de la suposición de que el valor de retorno es MyCustomActionResult
. En ese caso, si cambiaras el valor de retorno, romperías el código del cliente.
BTW: Hago lo mismo - devolviendo el tipo general más apropiado - para todos los métodos, no solo para los métodos de acción.
Editar: Tenga en cuenta que esto no significa que devolvería object
. El desafío es encontrar el tipo que represente la abstracción "más apropiada".
- 1. ¿Es bueno detectar un tipo más general de Excepción?
- 2. ¿Es mejor devolver una consulta grande o algunas más pequeñas?
- 3. ¿Es esta inferencia tipo Haskell en acción, o algo más?
- 4. ¿Por qué una implementación de interfaz no puede devolver un tipo más específico?
- 5. Reflection GetMethod. seleccione un método más específico
- 6. ¿Es timsort de propósito general o específico de Python?
- 7. ¿Qué es más eficiente? Más núcleos o más CPU
- 8. ¿Cuál es el tipo de python más general al que puedo agregar atributos?
- 9. ¿Cuál es el algoritmo óptimo "más general unificador"?
- 10. C#, ¿Escribir método más largo o método más corto?
- 11. Almacenar fotos en Blobstore o como blobs en Datastore - ¿Cuál es mejor/más eficiente/más barato?
- 12. ¿Qué debo devolver si el tipo de devolución de un método es nulo? (No se anulará!)
- 13. Comportamiento de falla NSNumberFormatter más específico
- 14. ¿Qué tipo de herencia es más preferible?
- 15. ¿El conteo de Linq() es más rápido o más lento que List.Count o Array.Length?
- 16. ¿Qué es más rápido, INSTR o LIKE?
- 17. ¿Cuál es el método más rápido/más seguro para iterar sobre un HashSet?
- 18. ¿Quién es más rápido: PEG o GLR?
- 19. Mejor + Más fuerte método de encriptación para bases de datos
- 20. LINQ y cómo devolver una lista de un tipo específico
- 21. ¿Qué es más aleatorio, hashlib o urandom?
- 22. Double.TryParse o Convert.ToDouble - ¿Qué es más rápido y más seguro?
- 23. ¿es una mejor práctica devolver un objeto complejo o utilizar parámetros de referencia/salida?
- 24. ¿Cuál es el estilo de CSS más rápido/más eficiente
- 25. ¿Cuál es el más utilizado? RSS o Atom? y de cuál es mejor construir?
- 26. MySQL Compruebe si hay 3 o más consecutivos (específico) entradas
- 27. Carga más rápida ListView, más rápido que el método Viewholder
- 28. ¿Por qué la ejecución de propiedades es más lenta que la ejecución de campo o método?
- 29. Comprobando si un cierto tipo es un delegado de Acción
- 30. ¿Cuál es el código de estado HTTP más apropiado para devolver si falta un encabezado requerido?
¿Así que devuelve 'object' de todo? – Timwi
Ciertamente no. Aparentemente no pude aclarar eso en mi respuesta. Voy a aclarar eso. – Manfred