miércoles, 2 de abril de 2008

Cairngorm: Secuenciado de Commands

En según qué ocasiones podemos requerir que nuestra aplicación ejecute una serie de Commands de forma asíncrona siguiendo un órden determinado.
Cairngorm viene de serie con la capacidad de encadenar Commands asíncronamente. La clase com.adobe.cairngorm.commands.SequenceCommand es la que se ocupa de que esto sea posible.
En esta entrada veremos dos formas de implementar el secuenciado. Una de forma estática y la otra de forma dinámica.

Encadenado estático

De forma nativa Cairngorm soporta encadenado estático de Commands, esto significa que para una secuencia dada deberemos crear una serie de Commands exclusiva para ésta.
El principal problema que se nos puede plantear en este caso es que si queremos reutilizar un Command que ya forma parte de una secuencia no podremos. Nos veremos forzados a duplicar código.
La causa de este problema viene del hecho que la clase SequenceCommand, la clase de la que extienden nuestros Commands a secuenciar, utiliza una propiedad nextEvent que es la que decide cuál es el siguiente Evento (y por consiguiente Command) que se va a ejecutar. La forma en la que los Commands son lanzados hace que sea imposible parametizar esta propiedad y por lo tanto se mantega estática.

Un ejemplo de un Command que forma parte de una secuencia:

HolaCommand.as (ejemplo estático)

Encadenado dinámico

El encadenado dinámico es mucho más flexible que el estático dado que permite crear de forma dinámica las secuencias de Commands, de este modo podremos reutilizar un mismo Command para formar parte de diferentes secuencias o para ser lanzado individualmente.
Para conseguir este objetivo nos vamos a servir de una colaboración que Bjorn Schultheiss ha hecho al repositorio de recursos para Cairngorm: cairngormdocs.com.
Se trata de dos clases: com.bjorn.event.ChainEvent y com.bjorn.event.EventChainFactory.
La clase ChainEvent es un wrapper de com.adobe.cairngorm.control.CairngormEvent que añade la propiedad nextChainedEvent:ChainEvent, y la clase EventChainFactory es la que se ocupa de enlazar dinámicamente las diferentes instancias de eventos que queremos secuenciar. Se le pasa un Array de instancias de ChainEvent y va asignando de mayor a menor (en índice) cual es su nextEvent.

Un ejemplo de un Command que se añade dinámicamente a una secuencia, su evento relacionado y la forma de crear la secuencia:

HolaCommand.as (ejemplo dinámico)

HolaEvent.as (ejemplo dinámico)

Creación dinámico de la secuencia

Proyectos de ejemplo

Incluyo dos proyectos muy simples de ejemplo. Uno para secuenciado estático y otro para secuenciado dinámico:

No hay comentarios:

Publicar un comentario