2010-08-25 9 views
13

He notado en el código de otras personas que los métodos que devuelven colecciones genéricas casi siempre devolverán una interfaz (por ejemplo, IEnumerable<T> o IList<T>) en lugar de una implementación concreta.¿Por qué devolver una interfaz de colección en lugar de un tipo concreto?

Tengo dos preguntas relacionadas. En primer lugar, ¿por qué (si es que lo hace) se considera mejor devolver una interfaz? En segundo lugar, ¿existe una interfaz de colección que incluya el método Sort (como List<T>)?

Respuesta

5

De C# - List or IList

Si usted está exponiendo su clase a través de una biblioteca que otros usarán, usted generalmente desea exponerlo a través de las interfaces en lugar de implementaciones concretas . Esto ayudará si decide cambiar la implementación de su clase más adelante para usar una clase concreta diferente. En ese caso, el usuario de su biblioteca no necesitará actualizar su código ya que la interfaz no cambia.

Si solo lo está utilizando internamente, es posible que no le interese demasiado, y usar La lista puede estar correcta.

+0

Gracias por esto, muy útil. Y esta es la cuestión: no estoy escribiendo una biblioteca para uso externo. Estoy escribiendo una intranet para una empresa en la que soy el único desarrollador. Puede hacer que sea más difícil para mí ver el propósito en algunas de estas cosas. – David

+0

Sí, si es puramente interno y está seguro de que no estará expuesto al público o a varias partes de su software, devolver un objeto List debería estar bien. Pero si, por ejemplo, es una biblioteca de clases, y aunque solo se usa en su aplicación por ahora, es posible que desee extender su aplicación y usar esa biblioteca nuevamente, por lo tanto, se verá obligado a List en lugar de su propia implementación. –

20

Para la primera pregunta: si devuelve una interfaz, conserva más flexibilidad. Puede cambiar la implementación más tarde para devolver un tipo concreto diferente. Por otro lado, obviamente le da a la persona que llama menos información, por lo que es posible que no pueda realizar ciertas operaciones. (Por ejemplo, si devuelve List<T>, la persona que llama puede usar ConvertAll, etc., que no pueden si solo declara que devuelve IList<T>). En algunas situaciones, vale la pena especificar el tipo concreto; I generalmente prefiero al menos comenzar con interfaces, y solo mover para poner el tipo concreto como el tipo de retorno si encuentro que con frecuencia quiero usar los métodos adicionales disponibles.

En segundo lugar, ninguna interfaz de colección estándar tiene un método Sort. Por otro lado, puede escribir un método de extensión para ordenar cualquier IList<T>. Personalmente, generalmente prefiero los métodos LINQ OrderBy, OrderByDescending, ThenBy y ThenByDescending ... aunque devuelven una secuencia nueva, en lugar de ordenarla en su lugar.

+2

Brilliant! Gracias por la respuesta clara a mi pregunta. – David

1

No puedo hablar por todos, pero en general lo hago solo porque me gusta devolver solo lo que necesito. ¿Por qué restituir una colección completa cuando todo lo que necesita es una colección enumerable que puede repetirse?

En cuanto a la otra parte de su pregunta que siempre puede utilizar un IList y luego utilizar LINQ para ordenar:

list.OrderBy(a=>a.Id); 
+0

@downvoter importa comentar? – spinon

+0

Gracias, lo entiendo ahora. No sabía que tenía disponible OrderBy porque es un método de extensión, y no estaba usando el espacio de nombres. – David

+0

Genial. Sí, los métodos de extensión para LINQ son geniales. – spinon

2

Utilizamos interfaces para darnos más flexibilidad en nuestra implementación. Por lo tanto, si su método tiene el tipo de devolución de IEnumerable, puede cambiar el objeto que devuelve de una lista a una matriz sin alterar los objetos que dependen del método.

también es expresiva: si devuelve un IEnumerable, cuando se está utilizando el objeto es claro para el codificador que sólo nos importa que es una especie de colección, en lugar de un tipo específico

Cuestiones relacionadas