2010-08-08 29 views

Respuesta

17

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.

2

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

¿Así que devuelve 'object' de todo? – Timwi

+1

Ciertamente no. Aparentemente no pude aclarar eso en mi respuesta. Voy a aclarar eso. – Manfred

Cuestiones relacionadas