Reemplazar sentencias if o switch por patron de diseño o polimorfismo

Iniciado por gonzaloi, 8 Abril 2011, 14:53 PM

0 Miembros y 1 Visitante están viendo este tema.

gonzaloi

Que tal gente, tengo un problema de diseño y queria ver si alguien me podia dar una mano. El problema es el siguiente:

Supongamos que tenemos dos colecciones que almacenan elementos de acuerdo a un criterio diferente:
-ColeccionUno almacena solo letras minusculas
-ColeccionDos almacena solo letras mayusculas

Que me aconsejan para reemplazar algo del estilo:

Si ( la letra es minuscula ) entonces agregarla a la coleccionUno;
sino agregarla a la coleccionDos;

Lo que quiero es NO usar if anidados o switch. El ejemplo que expongo es sencillo a fines de que me entiendan a lo que apunto, pero imaginense que tengo muchas colecciones y cada una almacena elementos de acuerdo a un criterio diferente...quedaria muy feo el codigo.

Entonces mi duda es...como puedo solucinarlo de una forma mas elegante ?? hay algun patron de diseño que se aplique a este caso ?? o tendria que pensar en el uso de polimorfismo ??

Akai

Si trabajas con un lenguaje orientado a objetos, el polimorfismo es una opción. Otra puede ser usar herencia. Y estoy seguro que habrá otras opciones (en las cuales no caigo en estos momentos)

En cualquier caso, la idea se reduce a tener una clase base, llámese contenedor de las cadenas, con métodos comunes a todos los casos que vayas a desarrollar (lectura, escritura, destructores, constructores etc etc etc) Y luego utilizando la idea que te parezca apropiada, derivar de esa las diferentes especializaciones que necesites.

Hasta este punto hemos tratado el cómo facilitar el desarrollo para la parte que se encargará de almacenar y tratar lo que recibiremos, pero seguimos sin responder a tu pregunta. En principio lo que sigue debería ser independiente a un lenguaje orientado o no a objetos. (mayor o menor facilidad de implementación, pero  utilizable de cualquier manera.)

¿Como seleccionar?

De alguna forma u otra vas a tener que establecer una estructura condicional o algún método para separar los elementos de un conjunto de los elementos de otro. Ten en mente que NO puedes escapar de dichas condiciones y su tratamiento, por la propia lógica de tu problema, pero SI puedes amortiguar su coste, o reducir / esconder su presencia.

¿Opciones?

Tablas de dispersión (o al menos el concepto de dispersión) (hash tables).
Supongamos que tienes 3 conjuntos diferentes (Mayúsculas, minúsculas y cualquier otra cosa). La idea sería preparar una función de dispersión (hash) que devuelva a qué conjunto pertenece el elemento que recibe.

Sabemos que según la tabla ASCII las mayúsculas (conjunto 1) van del 65 al 99. Las minúsculas (conjunto 2) del 97 al 122, y todo lo demás será del conjunto 3.

Preparamos una función o método que nos resuelva esto y cada vez que necesitemos seleccionar en qué conjunto va un elemento, la usamos.

De esta forma NO replicas la lógica sino que la llamas en repetidas ocasiones.

Ventajas: Si únicamente estás usando una función para determinar la permanencia o no de un elemento al conjunto que sea, cualquier cambio en la lógica no supondría en teoría demasiado esfuerzo ni repercusión en el resto del programa.

Si antes teníamos sólo 3, y añadimos 3 conjuntos más pero estos caen en los números 4 5 y 6, nuestra lógica anterior no se ve afectada.

Desventajas: Hay que hacer un buen diseño de la función hash para evitar falsos positivos o falsos negativos. (que te dijese que un numero cae como mayúscula, que una minúscula no lo es, cosas así)

Imagino que otros podrán ver más opciones, yo en estos momentos, veo esta.

gonzaloi

La idea es aplicar polimorfismo porque estoy trabajando con el paradigma de objetos.

Tengo un idea vaga de como hacerlo de la forma que planteas al principio, pero no estaba seguro si iba por buen camino. Con tu comentario me das mas seguridad para seguir por este lado.

Muchas gracias !!!

Novlucker

No se si has entendido, pero por más que uses herencia y poliformismo en algún punto tienes que clasificar los elementos que van a las colecciones, así que vas a seguir necesitando de if o switch

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

gonzaloi

Que cagada !!

Bueno, no me va a quedar otra entonces que laburar con un hash !!

Muchas gracias !!

Eagle75AR

Hola!
Tal vez un poco tarde, pero quizàs sirva para alguien en tu misma situaciòn. El patròn de diseño que estàs necesitando es el de "cadena de responsabilidad" (Chain of Responsibility).

http://es.wikipedia.org/wiki/Chain_of_Responsibility_%28patr%C3%B3n_de_dise%C3%B1o%29

Espero sea de ayuda.
Saludos! y Èxitos!! ;-)