Una de las cosas que me gustaría ver es un CycleFramework libre de dependencias del SDK de Flex. Si os preguntáis el por qué de este deseo, la respuesta es sencilla: haciéndolo independiente del SDK de Flex podremos utilizarlo sin ningún problema en otros proyectos ActionScript puros, sin mencionar con que la librería quedaría bastante más ligera (no obstante si la compilamos como referencia externa este problema de peso, nos lo quitamos de encima).
Hasta ahora la mayoría de nuestros proyectos los hemos realizado en Flex, si bien ciertas partes ActionScript puras acaban teniendo su pequeño hueco en ellos, nunca hemos tenido la necesidad de utilizar un micro-framework MVC para ActionScript3. Pese a esto, tengo la espina clavada de querer liberar a CycleFramework, y aunque ahora mismo tenga más fuerza la cabezonería que la necesidad, me puse manos a la obra.
Actualmente la versión principal de CycleFramework tiene dos dependencias importantes con el SDK de Flex: ArrayCollection y ChangeWatcher.
Recordando nuestro propio ejemplo para ponernos en situación:
- utilizamos
ArrayCollectionpara almacenar el camino visual que queremos representar en nuestra aplicación en un determinado momento. Este camino visual no es más que un lista elementos que identifican de forma unívoca nodos en nuestra jerarquía de vistas.
new ArrayCollection(['vm','userManager',"retrieve"])
donde ese ArrayCollection identifica que deseamos realizar una navegación hacia la vista ‘retrieve’ que cuelga de ‘userManager’ que a su vez cuelga de ‘vm’: vm > userManager > retrieve.
ChangeWatcherse utiliza para observar cambios en la vista actual que se está visualizando, de tal modo que podamos navegar hacia una vista diferente.
El primer paso para eliminar estas dependencias ha sido deshacernos de la clase ArrayCollection. La clase ChangeWatcher implica un trabajo extra adicional para poder eliminarla ya que en ActionScript puro no existen las clases de utilidad para binding con lo que hay que llegar a alguna solución a medida − ya he empezado a investigar en este sentido, pero lo dejaremos para más adelante.
Las razones por las cuales queremos deshacernos (y podemos) de esta clase son:
- Nos hace dependientes del SDK de Flex y no lo necesitamos (ni lo queremos).
- Se trata de una clase que envuelve a la clase
Array(mantiene la lista en el atributosource). Esto implica una capa adicional para acceder a la fuente, añadiendo tiempo de acceso y procesamiento que empeoran el rendimiento. - No necesitamos ninguno de los métodos que
ArrayCollectionhereda deListCollectionView. - Las operaciones necesarias para realizar y gestionar navegaciones son mucho más rápidas con la clase
Array. - No necesitamos manejar cambios provocados en la colección:
COLLECTION_CHANGE. Una de las ventajas deArrayCollectiones que permite añadir manejadores para detectar inserciones, borrados, modificaciones en la lista. Esto facilita el trabajo a la hora de modificar el comportamiento de nuestra interfaz, pudiendo incluso bindar variables con expresiones tales como:arrayCollection.getItemAt(index);. No obstante, no lo necesitamos en CycleFramework. - Hace engorrosa la tarea de querer lanzar navegaciones. Cada vez que queremos navegar, necesitamos hacer un
new ArrayCollection(['vm','userManager','retrieve']);. Utilizando simplemente unArray, ahora nos bastará con hacer['vm','userManager','retrieve']. Escribiremos menos líneas de código, y además será más rápida la instanciación.
En nuestro caso es fácil deshacernos de esta clase, ya que realmente nosotros solo necesitamos un lista de identificadores que refleje la navegación que se quiere realizar. Para esto nos basta simplemente con utilizar la clase nativa Array. En el propio CycleFramework, supuso eliminar todas las operaciones sobre ArrayCollection y sustituirlas por las operaciones “pares” en Array:
new ArrayCollection([])=>[]list.getItemAt(index)=>array[index]list.removeItemAt(list.getItemIndex(item))=>array.splice(array.indexOf(item),1)list.addItem(item)=>array[array.length] = item- etc.
Ahora, en nuestras aplicaciones, simplemente debemos sustituir:
new ViewStateChangeEvent(ViewStateChangeEvent.MODIFY_VIEW,new ArrayCollection(['vm','init'])).dispatch();
por:
new ViewStateChangeEvent(ViewStateChangeEvent.MODIFY_VIEW,['vm','init']).dispatch();
Y esto es todo; en breve hablaré de cómo quitar la dependencia con ChangeWatcher. De momento, este código no está incluído en la rama principal del proyecto en Google Code. Se ha creado una rama específica para el mismo, que muy pronto se incluirá en la rama principal. Si queréis jugar con ella, os dejo aquí los datos de acceso. Esperamos vuestros comentarios al respecto
# Non-members may check out a read-only working copy anonymously over HTTP.
svn checkout http://cycleframework.googlecode.com/svn/branches/CycleFrameworkArray cycleframework-read-only
[...] This post was mentioned on Twitter by Alberto García, Miguel Martín-Forero. Miguel Martín-Forero said: RT @cycle_it CycleFramework menos dependiente de Flex: sin ArrayCollection http://bit.ly/dw93qB <= Ahí os hinchéis de post
[...]
u00a1Buen trabajo, Miguel! El framework estu00e1 quedando fino, fino.
u00bfquiu00e9n quiere un ChangeWatcher… pudiendo tener un Proxy?
Uno de los caminos por donde tenu00eda intenciu00f3n de pasar, aunque estaba barajando la posibilidad de evitar extender Proxy y utilizar simplemente un EventDispatcher interno para manejar los cambios del u00fanico atributo que queremos escuchar.
Me ha gustado este mucho senor!nnSi solo es para navegar entre vistas, por aqui usamos un PageManager para gestionar las vistas, cuando necesitamos cambiar de una a otra simplemente la anadimos a un diccionario de paginas y que el manager se encargue de todo, sin watcher de por medio. Y no funciona nada mal por si te sirviese de algo.nnpd: la ortografia no es culpa mia, ya tu sabes
.
Habru00eda que ver vuestro PageManager
. u00bfForma parte de algu00fan framework MVC de terceros? u00bfEs vuestro? u00bfO es algo mucho mu00e1s sencillito?nCycleFramework ya estu00e1 totalmente liberado de flex y me he deshecho de los ChangeWatcher. Tengo que encontrar el hueco para poder postearlo y explicarlo, pero el cu00f3digo por lo menos su00ed que puedes verlo en google code
nnNada, eso de estar por tierras anglosajonas te estu00e1 matando
Es propio, se lo hizo un iluminado de aqui, bastante sencillito pero funciona muy bien, aunque algun quebradero me ha dado alguna vez
[...] ya no es dependiente de Flex TweetEn el anterior post sobre CycleFramework, empezamos a independizar nuestro pequeño framework del SDK de Flex. Para ello, si lo recordais, nos deshicimos de la [...]