2008-08-27 19 views
5

Tengo un método de clase que devuelve una lista de empleados a través de los cuales puedo realizar una iteración. ¿Cuál es la mejor manera de devolver la lista? Normalmente, simplemente devuelvo una ArrayList. Sin embargo, según tengo entendido, las interfaces son más adecuadas para este tipo de acción. ¿Cuál sería la mejor interfaz para usar? Además, ¿por qué es mejor devolver una interfaz, en lugar de la implementación (por ejemplo, el objeto ArrayList)? Simplemente parece mucho más trabajo para mí.Comprensión de interfaces

Respuesta

4

Personalmente, usaría un List < Empleado> para crear la lista en el backend, y luego usar IList cuando regrese. Cuando usa interfaces, le da flexibilidad para cambiar la implementación sin tener que modificar quién está usando su código. Si quisiera seguir con una ArrayList, sería una IList no genérica.

1

La mejor manera de hacer algo como esto sería devolver, como dices, una lista, preferiblemente utilizando genéricos, por lo que sería la lista <Employee>.

Devolver una Lista en lugar de una Lista de Arrays significa que si más adelante decide utilizar, por ejemplo, una Lista Vinculada, no tiene que cambiar el código para crear el objeto (es decir, el llamar a "nueva ArrayList())".

0

El tipo de devolución para su método debe ser IList<Employee>.

Eso significa que la persona que llama de su método puede usar cualquier cosa que IList ofrezca pero no puede usar cosas específicas de ArrayList. Luego, si en algún momento siente que LinkedList o YourCustomSuperDuperList le ofrece un mejor rendimiento u otras ventajas, puede usarlo de manera segura y sin perjudicar a quienes lo llamen.

Eso es más o menos hace interfaz 101. ;-)

0

Una interfaz es un contrato entre la aplicación y el usuario de la aplicación.

Al usar una interfaz, permite que la implementación cambie todo lo que quiera siempre que mantenga el contrato para los usuarios.

También permite que múltiples implementaciones utilicen la misma interfaz para que los usuarios puedan reutilizar el código que interactúa con la interfaz.

0

Usted no dice de qué idioma está hablando, pero en algo .NETish, entonces no es más trabajo devolver un IList que una Lista o incluso una ArrayList, aunque la mera mención de esa clase obsoleta me hace piensa que no estás hablando de .NET.

2

@ Jason

usted puede también volver IList <> debido a una serie de hecho implementa esta interfaz.

1

Si todo lo que hace es iterar por la lista, puede definir un método que devuelva la lista como IEnumerable (para .NET).

Al devolver la interfaz que proporciona solo la funcionalidad que necesita, si aparece algún tipo de colección nuevo en el futuro que sea mejor/más rápido/una mejor coincidencia para su aplicación, siempre que implemente IEnumerable puede reescribir completamente su método, utilizando el nuevo tipo dentro de él, sin cambiar el código que lo llama.

0

Una interfaz es esencialmente un contrato que una clase tiene ciertos métodos o atributos; la programación en una interfaz en lugar de una implementación directa permite un código más dinámico y manejable, ya que puede cambiar completamente las implementaciones siempre que el "contrato" aún se mantenga.

En el caso que usted describe, pasando de una interfaz no le da una ventaja particular, si fuera yo, me gustaría pasar el ArrayList con el tipo genérico, o pasar la matriz en sí: list.toArray()

1

¿Hay alguna razón por la cual la colección necesita ser ordenada? ¿Por qué no simplemente devuelve un IEnumerable<Employee>? Esto le da el mínimo requerido: si más tarde deseaba otra forma de almacenamiento, como una bolsa o conjunto o árbol o lo que sea, su contrato se mantendría intacto.

0

En realidad no deberías devolver una Lista si eso es un marco, al menos no sin pensarlo, la clase recomendada para usar es una Colección. La clase List tiene algunas mejoras de rendimiento a costa de los problemas de extensibilidad del servidor. De hecho, es una regla de FXCop.

Usted tiene el razonamiento de que, en this article

1

estoy de acuerdo con la premisa de que es mejor para devolver una interfaz. Mi razón es que quiere maximizar la utilidad que expone un bloque de código dado.

Teniendo esto en cuenta, una interfaz funciona para aceptar un elemento como argumento. Si un parámetro de función requiere una matriz o ArrayList, es lo único que puede pasarle. Si un parámetro de función requiere un IEnumerable, aceptará cualquiera de ellos, así como otros objetos. Es más útil

El valor de retorno, sin embargo, funciona al revés. Cuando devuelve un IEnumerable, lo único que puede hacer es enumerarlo. Si tiene una Lista a mano y la devuelve, entonces el código que llama a su función también puede hacer otras cosas, como obtener un conteo.

Sin embargo, estoy de acuerdo con aquellos que le aconsejaron que se aleje de ArrayList. Los genéricos son mucho mejor.