viernes, 2 de diciembre de 2011

IEnumerable en vez de List para propiedades

Hoy toca un post muy sencillo y básico pero que puedes preguntarte en algunas ocasiones.

Hoy le he hecho una pregunta a mi amigo y maestro Pedro Santos que me estaba rondando por la cabeza, ¿por qué exponer una propiedad como IEnumerable en vez de List, si yo internamente la voy a definir como una List?

Su respuesta ha sido muy clarificadora:

Al exponerla como IEnumerable tu no expones (encapsulas) su estructura interna, además así limitas las operaciones a realizar con esta propiedad y puedes aplicar las reglas de negocio que te interesen, como por ejemplo, que tenga un cierto comportamiento concreto al añadir un nuevo elemento a la lista.

Si tu expones una propiedad como List, también le estas exponiendo la opción de añadir sin que tu controles como se han de añadir estos elementos a tu colección.

Pues bueno, a partir de ahora, todas mis colecciones irán como IEnumerable y cuando me interese le expondré el método AddNewFooItem(FooItem item). Por último, lo ideal también sería exponer el setter de la lista como private o protected, para que no puedan “settearte” una nueva colección.

1 comentario:

José dijo...

En Cocoa existe lo que se llama KVC (Key Value Coding) que son unas prácticas orientadas a poder acceder a las propiedades de un objeto de una forma estándar para facilitar el patrón de diseño Observer o para dar soporte a persistencia transparente mediante Core Data, entre otras cosas. Te puede servir como ejemplo de como encapsular el acceso a colecciones mutables e inmutables aunque no obtengas el resto de beneficios que tendrías si programaras para Cocoa ;o)

Te pongo el enlace:

Key-Value Coding Programming Guide: Ensuring KVC Compliance