Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



domingo, 19 de enero de 2014

Combinar Patrones de Diseño: Ejemplo de aplicación de varios patrones de diseño en un mismo programa: Command y Strategy

Combinar Patrones de Diseño

Ejemplo de aplicación de varios patrones de diseño  (Command y Strategy) en un mismo programa: Organizador de Descargas 

versión 0.0.3




Ayer os en traje un programa para organizar la carpeta de descarga, internamente usaba el patrón Command, para ejecutar las ordenes de las reglas (mover, copiar o borrar).

En el módulo "AplicarComandos", usaba una orden Select Case para, según que orden, crear el comando correspondiente y luego ejecutarlo en una lista:



Bien, este diseño (el uso del Select Case), tiene el siguiente problema:

  • A medida que vayamos a añadir más órdenes ("Comprimir", "Crear Accesos Directos en el Escritorio", etc), vamos a tener que retocar él codigo en esa zona. Rompiendo uno de los principios la programación "SOLID de Open Closed": Nuestro código debería estar abierto a la extensión, pero cerrado a la modificación.  Es decir, que para añadir una nueva funcionalidad, no tengamos la necesidad de modificar los algoritmos que ya están programados.El Patrón strategy, es una alternativa al uso de bloques "switch" ( select case) ya que permite:
  • Que sea fácil mantener y ampliar nuevas funcionalidades
  • Fácil lectura del código

Vamos a aplicar el siguiente esquema, para convertir el Switch (Select Case) del programa al patrón Strategy:

Esta serán nuestras nuevas clases:
Clase InterfaceCrearComando (GuardeStrategy en el esquema):
->

Clase EstrategiaBorrar: (seria la GuardedStrategyA)
->

Clase EstrategiaCopiar:(seria la GuardedStrategyA)
->

Clase EstrategiaMover:(seria la GuardedStrategyA)
->

SwitchStrategyCrearComando:
->

Y ahora en el módulo AplicarComando, habria que hacer 3 cambios:
Añadir una instancia privada de la clase SwitchStrategyCrearComando
->

Añadir una subrutina donde añadiremos las estrategias que existen (estrategiaCopia, estrategiaMover y estrategiaBorrar)
->

Y la zona del select case se sustituye por esta:
->

El resultado de la ejecución del programa es el mismo, pero para realizar futuras ampliaciones ahora resulta mucho más sencillo:




Para añadir un nuevo comando, por ejemplo se haría asi:
1) Crear la nueva clase que hereda de Comando, por ejemplo "Descomprimir", donde definimos su método ejecutar()
2) Crear una nueva clase EstrategiaDescomprimir, donde definimos las propiedades del comando
3) Añadir  en la subrutina GenerarListaEstrategiasCrearComandoDisponibles(), la nueva estrategia:
Dim estrategiaDescomprimirtmp as new EstrategiaDescomprimir
...
SelectorEstrategias.add(EstrategiaDescomprimir)

Y para que el usuario la vea en el formulario, en el Fmain, añadimos al combobox la nueva orden mediante el método add:
ComboBoxAccion.Add(("Deescomprimir"))

Y ya la tenedriamos añadida.

Saludos

Enlace de descarga del archivo de instalación .deb: http://clasificaryordenar.blogspot.com.es/
Enlace de descarga del código fuente: enlace version 0.0.3 (en el blog de clasificaryordenar se puede ver el codigo fuente de la última version)


Nota:
23/01/2014: He realizado un pequeño blog donde esta la información completa del programa y las ultima revisión 0.0.5 http://clasificaryordenar.blogspot.com.es/


Fuentes:
http://www.cin.ufpe.br/~sugarloafplop/final_articles/02_SwitchStrategy%20_Spanish_.pdf
http://programandonet.com/web/patrones-de-diseno-strategy/