elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Reemplazar sentencias if o switch por patron de diseño o polimorfismo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Reemplazar sentencias if o switch por patron de diseño o polimorfismo  (Leído 11,927 veces)
gonzaloi

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Reemplazar sentencias if o switch por patron de diseño o polimorfismo
« en: 8 Abril 2011, 14:53 pm »

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 Desconectado

Mensajes: 823



Ver Perfil
Re: Reemplazar sentencias if o switch por patron de diseño o polimorfismo
« Respuesta #1 en: 8 Abril 2011, 15:27 pm »

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 Desconectado

Mensajes: 27


Ver Perfil
Re: Reemplazar sentencias if o switch por patron de diseño o polimorfismo
« Respuesta #2 en: 8 Abril 2011, 18:06 pm »

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 Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: Reemplazar sentencias if o switch por patron de diseño o polimorfismo
« Respuesta #3 en: 8 Abril 2011, 18:12 pm »

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 Desconectado

Mensajes: 27


Ver Perfil
Re: Reemplazar sentencias if o switch por patron de diseño o polimorfismo
« Respuesta #4 en: 8 Abril 2011, 23:33 pm »

Que cagada !!

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

Muchas gracias !!
En línea

Eagle75AR

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Re: Reemplazar sentencias if o switch por patron de diseño o polimorfismo
« Respuesta #5 en: 13 Marzo 2012, 21:29 pm »

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!! ;-)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

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 Último mensaje 22 Junio 2006, 17:06 pm
por Hans el Topo
Polimorfismo
Ejercicios
zenydark 1 3,838 Último mensaje 8 Junio 2010, 07:13 am
por leogtz
polimorfismo
Programación C/C++
carmen_iriarte 1 2,453 Último mensaje 13 Julio 2010, 04:37 am
por nicolas_cof
Sobre patrón de diseño abstract
Java
zonahurbana 6 3,474 Último mensaje 22 Octubre 2013, 20:44 pm
por zonahurbana
Polimorfismo c++ , restricciones del lenguaje- Ayuda Diseño
Programación C/C++
Leanic 0 1,714 Último mensaje 3 Noviembre 2016, 06:56 am
por Leanic
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines