martes, 5 de junio de 2007

El Patrón Estrategia en VFP

Para implementar el patrón estrategia en Visual Fox Pro vamos a tomar el mismo ejemplo que trabajamos con C#.

Debemos crear el contexto, la estrategia abstracta, etc, etc...

Veamos un poco de código:




*Interfaz

DEFINE CLASS IComponente as Custom

FUNCTION procesarNombres()

LPARAMETERS nombre,apellido

endfunc

ENDDEFINE





*estrategia concreta

DEFINE CLASS puente as Icomponente



Caracter= ", "



PROCEDURE Caracter_ACCESS

RETURN THIS.Caracter

ENDPROC



PROCEDURE Caracter_ASSIGN

LPARAMETERS Valor

THIS.Caracter=Valor

ENDPROC



FUNCTION procesarNombres()

LPARAMETERS nombre,apellido

RETURN ALLTRIM(Apellido) + this.Caracter + ALLTRIM(nombre)

ENDFUNC



ENDDEFINE



*estrategia concreta

DEFINE CLASS NombreApellido as Icomponente



Caracter= " "



PROCEDURE Caracter_ACCESS

RETURN THIS.Caracter

ENDPROC



PROCEDURE Caracter_ASSIGN

LPARAMETERS Valor

THIS.Caracter=Valor

ENDPROC



FUNCTION procesarNombres()

LPARAMETERS nombre,apellido

RETURN ALLTRIM(nombre) + this.Caracter + ALLTRIM(Apellido)

ENDFUNC



ENDDEFINE



*estrategia concreta

DEFINE CLASS Enriquecido as Icomponente



Caracter= " - "



PROCEDURE Caracter_ACCESS

RETURN THIS.Caracter

ENDPROC



PROCEDURE Caracter_ASSIGN

LPARAMETERS Valor

THIS.Caracter=Valor

ENDPROC



FUNCTION procesarNombres()

LPARAMETERS nombre,apellido

RETURN "Apellido: " + ALLTRIM(Apellido) + this.Caracter + "Nombre: " + ALLTRIM(nombre)

ENDFUNC



ENDDEFINE



*clase de contexto

DEFINE CLASS contexto as Custom





MiClase= null



PROCEDURE MiClase_ACCESS

RETURN THIS.MiClase

ENDPROC



PROCEDURE MiClase_ASSIGN

LPARAMETERS Valor

THIS.MiClase=Valor

ENDPROC



PROCEDURE init()

LPARAMETERS Clase

This.MiClase=Clase

ENDPROC



ENDDEFINE



*estrategia abstracta

DEFINE CLASS Estrategia as Icomponente



contexto= " "



PROCEDURE contexto_ACCESS

RETURN THIS.contexto

ENDPROC



PROCEDURE contexto_ASSIGN

LPARAMETERS Valor

THIS.contexto=Valor

ENDPROC



PROCEDURE init()

LPARAMETERS Clase

This.contexto=Clase

ENDPROC



FUNCTION procesarNombres()

LPARAMETERS nombre,apellido

RETURN this.contexto.MiClase.procesarNombres(nombre,apellido)

ENDFUNC



ENDDEFINE






Se agregaron dos estrategias además de Puente: NombreApellido y Enriquecido. Las misma realizan distintas acciones para tener de ejemplo.





Veamos ahora como utilizar esto en un formulario:



Al presionar cada botón estamos utilizando una estrategia distinta.

El código del primer botón:


Estrategia = NEWOBJECT("Estrategia",'','',NEWOBJECT("contexto",'','',NEWOBJECT("NombreApellido")))
ThisForm.txt1.Value=Estrategia.procesarnombres(thisform.txtNombre.Value,thisform.txtApellido.Value)
RELEASE Estrategia

El código del segundo botón:


Estrategia = NEWOBJECT("Estrategia",'','',NEWOBJECT("contexto",'','',NEWOBJECT("Puente")))
ThisForm.txt2.Value=Estrategia.procesarnombres(thisform.txtNombre.Value,thisform.txtApellido.Value)
RELEASE Estrategia

El código del tercer botón:


Estrategia = NEWOBJECT("Estrategia",'','',NEWOBJECT("contexto",'','',NEWOBJECT("Enriquecido")))
ThisForm.txt3.Value=Estrategia.procesarnombres(thisform.txtNombre.Value,thisform.txtApellido.Value)
RELEASE Estrategia

En el init del formulario:


SET PROCEDURE TO "estrategia.prg"

donde "estrategia.prg" es el archivo donde están escritas las clases.

Cambiar de una estrategia a otra es muy simple. En entornos donde la tasa de cambios es muy alta este tipo de metodología es excelente.

En las siguientes publicaciones veremos cómo utilizar varios patrones a la vez.-

No hay comentarios.: