Autor
|
Tema: Reemplazar sentencias if o switch por patron de diseño o polimorfismo (Leído 11,927 veces)
|
gonzaloi
Desconectado
Mensajes: 27
|
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 ??
|
|
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
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.
|
|
|
En línea
|
|
|
|
gonzaloi
Desconectado
Mensajes: 27
|
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 !!!
|
|
|
En línea
|
|
|
|
Novlucker
Ninja y
Colaborador
Desconectado
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
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
|
|
|
En línea
|
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
Desconectado
Mensajes: 27
|
Que cagada !!
Bueno, no me va a quedar otra entonces que laburar con un hash !!
Muchas gracias !!
|
|
|
En línea
|
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
problemilla con vb y las sentencias...
Programación Visual Basic
|
Hans el Topo
|
3
|
2,266
|
22 Junio 2006, 17:06 pm
por Hans el Topo
|
|
|
Polimorfismo
Ejercicios
|
zenydark
|
1
|
3,838
|
8 Junio 2010, 07:13 am
por leogtz
|
|
|
polimorfismo
Programación C/C++
|
carmen_iriarte
|
1
|
2,453
|
13 Julio 2010, 04:37 am
por nicolas_cof
|
|
|
Sobre patrón de diseño abstract
Java
|
zonahurbana
|
6
|
3,474
|
22 Octubre 2013, 20:44 pm
por zonahurbana
|
|
|
Polimorfismo c++ , restricciones del lenguaje- Ayuda Diseño
Programación C/C++
|
Leanic
|
0
|
1,714
|
3 Noviembre 2016, 06:56 am
por Leanic
|
|