Busqueda local

Loading

jueves, 7 de abril de 2011

Diferentes objetos una sola colección

A veces nos hacemos una idea y nos aferramos a ella, a veces creemos que algo es posible y nos sentimos motivados cuando avanzamos en la solución y vemos que lo que nos imaginamos se va materializando frente a nuestros ojos. A veces este tipo de situaciones crean un espejismo que nos impide ver lo que en realidad estamos haciendo. Hoy me enfrasque en una tarea que me llevo a codificar un ejemplo para verificar que si era posible lo que me estaba imaginando.
 

Requerimientos

El proyecto en el que estoy trabajando contiene internamente varios componentes que generan información de diferente tipo, el problema es que debo devolver esta información de diferente tipo por medio de una sola clase. El reto consiste en poder almacenar cualquier tipo de dato, que pudiera ser agregado a la colección para ser devuelto posteriormente y manipulado en donde se reciba.
 

Análisis

Para poder almacenar objetos de diferentes tipos en una colección podemos usar Arreglos, sin embargo la implementación es muy pobre y deja poco margen de maniobra, así que me decidí por usar un diccionario.
 

Solución Aparente

Solo necesite dos clases para poder llevar a cabo esta prueba. Una Clase que contuviera internamente los diccionarios de tipos de dato y de objetos. Y otra más para poder exponer los elementos de forma individual. La primera clase se llamo Colección y estaba codificada de esta forma:
Declaraciones y propiedades:
dif1
Constructor:
dif2
Métodos para agregar y para obtener un elemento:
dif3
Para el método que se emplea en el For Each, se creo una clase que se llamo Par y esta codificada de esta manera:
dif4
Y por ultimo un método para emplear con el For Each
dif10
Para probarla use una aplicación de consola como siempre:
dif5
El resultado es:
dif6

 

Revisión de la solución aparente

A pesar que aparentemente soluciona nuestro problema, no es la forma correcta de hacerlo. En .NET se han creado todo tipo de colecciones para que puedan ser tipificadas, por lo que hacer algo que use objetos no específicos, es ir en contra de la evolución. Para recuperar objetos es necesario saber de antemano el tipo de objeto que queremos obtener.
En situaciones como esta lo que debemos hacer es detenemos un momento a pensar en los requerimientos, analizarlos con cuidado, si nos fijamos en el texto podemos identificar donde se creó el espejismo, fue en la parte que dice: “información de diferente tipo… por medio de una sola clase”; esto no quiere decir que nosotros debamos implementar un código para manejar objetos de diferente tipo en una misma clase.
 

Interfaces al rescate

Dentro del .NET podemos crear interfaces, que son un elemento muy valioso para proyectos con este tipo de complejidades. Si creamos una interface que contenga las propiedades que son comunes a todos los componentes, las que deben ser expuestas y verificamos que todos los componentes que creemos la implementen, entonces podremos crear una sola colección que reciba diferentes objetos pero que al implementar la misma interface, pueden ser tratados como uno mismo tipo.
 

Solución apropiada

Se requiere una interface y una colección que reciba objetos que implementen esta interface.
La interface quedo así:
dif7
Nuestra colección quedo de esta forma:
Declaraciones y propiedades:
dif8
Constructor:
dif13
Métodos para agregar y para obtener un elemento:
dif9
Podemos observar que nuestros métodos esperan la interface.
La clase para el método GetCurrent se llamo Pair y esta codificada de esta manera:
dif15
Un método para emplear con un For Each:
dif11
Las clases deben implementar nuestra Interface, este es el ejemplo de una de ellas:
dif17
Para probarla use una aplicación de consola como siempre:
dif12
El resultado es:
dif14

 

Conclusión

Siempre es importante que nos cuestionemos si lo que estamos haciendo es lo correcto, una solución aparente puede traernos muchos problemas con el tiempo.

No hay comentarios:

Publicar un comentario