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: Constructor:
Métodos para agregar y para obtener un elemento:
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:
Y por ultimo un método para emplear con el For Each
Para probarla use una aplicación de consola como siempre:
El resultado es:
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í:
Nuestra colección quedo de esta forma:
Declaraciones y propiedades:
Constructor:
Métodos para agregar y para obtener un elemento:
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:
Un método para emplear con un For Each:
Las clases deben implementar nuestra Interface, este es el ejemplo de una de ellas:
Para probarla use una aplicación de consola como siempre:
El resultado es:
No hay comentarios:
Publicar un comentario