ARP y La estrategia del patrón ViewLocator

Uno de los frameworks basados en patrones para AS2.0 que más me gusta es ARP. Este aunque no sea perfecto si que tiene un montón de ventajas a la hora de plantearnos un proyecto que lo hacen muy atractivo. El motivo básico para usar un framework de este tipo es el de disponer de un armazón inicial apartir del cual empezaremos a construir nuestra futura aplicación de manera que gracias a su organización esta sea mantenible y escalable.

El framework es (a grandes rasgos) una implementación MVC basada en patrones y cuyo workflow está controlado por eventos (como debe de ser). Básicamente disponemos de una serie de vistas que estarán registradas en un controlador que ejerce el papel de “pegamento” o nodo central entre las diferentes partes de la aplicación. Las acciones se llevan a cabo mediante comandos que simplifican y abstraen el flujo de la aplicación haciendo que tareas como conectarse a servicios remotos (normalmente con Flash Remoting) sea un juego de niños.

Muchos de los que usamos dicho framework tarde o temprano podemos llegar a pequeños y relativos callejones sin salida (y digo lo de relativos porque todo depende siempre de la pericia del desarrollador y de su arsenal de trucos y conocimientos para salir de los atolladeros). En mi caso y después de usar el framework en una aplicación de tamaño considerable he necesitado hacerle algunos arreglos. Estos arreglos se basan en otros patrones que podemos encontrar en otro framework muy parecido: Cairngorm. Este otro framework orientado ha Flex tiene una naturaleza muy parecida a ARP pero trae algunos trucos añadidos muy útiles.

Uno de los puntos a mejorar en ARP es la localización de las vistas. Cuando nos encontramos en un comando a menudo es necesario no solo usar la vista que ha provocado su ejecución (guardada en la variable viewRef heredada de CommandTemplate). Esta tarea podemos simplificarla si implementamos un ViewLocator como en Cairngorm, de esta manera con un código como el siguiente conseguiremos la vista requerida:

private var viewLocator:ViewLocator;
private var theNeededView :TheNeededView 
...
viewLocator = ViewLocator.getInstance();
theNeededView = TheNeededView (viewLocator.getViewHelper("TheNeededView"));
...

Ahora bien, para conseguir que dicho ViewLocator funcione, es necesario que las vistas implementen otro patrón conocido como ViewHelper. Este patrón aparte de aportar la funcionalidad necesaria para que la vista funcione hará que dicha vista se registre en el ViewLocator mediante un código como el siguiente:

// --- Fill ViewHelper properties
view = this;
name = "TheNeededView";

De esta manera luego podremos ejecutar el método viewLocator.getViewHelper del snippet anterior y conseguiremos el tener acceso a cualquier vista de manera sencilla desde cualquier comando.

Esta funcionalidad es muy sencilla de adaptar si tomamos como modelo la implementación de Cairngorm.

Por último decir que si usas ARP verás que uno de los recursos que te invita a utilizar son los ARPForms. Estos en lineas generales son implementaciones más ligeras que los Forms que vienen con Flash MX 2004. Personalmente no son de mi agrado pues obligan a que la vista engorde excesivamente y a la larga termina englobando toda la funcionalidad. La aproximación del combo ViewHelperViewLocator me parece mucho más acertada ya que además no obliga a que la clase que controla las acciones de la vista tenga que ser el propio MovieClip. Espero que en las siguientes actualizaciones del framework tengan encuenta estos patrones.

1 Comentario

  1. Hola carlos, como va?
    llegue la mismo cuello de botella, necesito que un comando haga un update en dos vistas. A partir de leer tu post, me baje Cairngorm y estaba viendo ambas clases: ViewLocator y ViewHelper.
    No entiendo bien como implementaste la solucion…. o mejor dicho quizas no entiendo bien como registrar mas de una vista y luego llamarlas desde un comando.
    Agregaste estas dos clases a la carpeta view en arp? las tenes publicadas en alguna url.
    desde ya gracias.
    Diego.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *