Cairngorm III: Commands

Tal como comentamos en los artículos anteriores una aplicación RIA potencia el desarrollo orientado a prestaciones (featured oriented development) es por ello que aparece la necesidad de poder aislar y reutilizar todas las funcionalidades de los aplicativos que diseñemos. Minimizando las prestaciones y funcionalidades individuales potenciamos la reutilización. Mejor tener muchos elementos especializados que pocos y muy poco especializados, esta es otra de las bases de la microarquitectura de Cairngorm.

Un patrón command es la solución implementacional a la ejecución de una funcionalidad concreta requerida. Los comandos también son transversales y pueden ser invocados desde cualquier capa. Evidentemente existirán comandos especializados en las distintas capas. La transversalidad es posible gracias a que son stateless, es decir son totalmente ortogonales e independientes al entorno y circunstacias de invocación. Simplemente tienen acceso a los datos que requieren en todo momento para poder ser ejecutados.


Los commands son la parte más importante de nuestras apliaciones ya que en ellos reside la lógica (business logic) de nuestra aplicación. En primera instancia en los Commands no se tiene en cuenta la capa visual ni cómo se van a ejecutar. Un Command sólo es responsable de saber qué hacer cuando alguien o algo lo ejecute.

Por la su propia naturaleza, los commands se pueden anidar (siguiendo un patrón Composite) dando como resultado un MacroCommand, que sería la creación de un command a partir de otros más simples pero encadenando su ejecución, dando como resultado un comando conceptualmente más amplio e implementacionalmente hablando más complejo. En Cairngorm esto se consigue a traves de lo que han llamado SequenceCommand.

Los commands aislan totalmente la funcionalidad de tal forma que el que los ejecute los puede ver como cajas negras que aportan funcionalidad.

Veamos ejemplos conceptuales de distintos commands:

  • Dada una url lanzarla como link en un nuevo navegador (similar a lo que haría un link de html con el parámetro target seteado a _blank.
  • Dada una clase que herede de UIComponent lanzar una instancia en un PopUp integrado en nuestro aplicativo utiliznado PopUpManager.
  • Ejecutar un método concreto de un servicio SOAP y recoger los resultados.
  • Consumir los datos XML de una url y recoger los resultados.
  • En una aplicación que use en algun punto navegación por tabs, crear un nuevo Tab.
  • etc.

En el plano implementacional, un Command tiene que ser una clase (por convenio en el package commands) que implemente la interface com.adobe.cairngorm.commands.Command Esta interface sólo implica que en la clase exista un método execute con la firma execute (event:CairngormEvent):void

En breve veremos qué es event, para qué nos sirve y de dónde sale. Antes de eso veamos un ejemplo de un command.

[ftf w=”500″ h=”230″]
package com.mif.cairngormTutorial1.commands
{
import com.adobe.cairngorm.control.CairngormEvent;
import com.adobe.cairngorm.commands.Command;
import mx.controls.Alert;

public class HelloWorldCommand implements Command
{
public function execute(event:CairngormEvent):void
{
Alert.show (“Hello world”, “Command ejecutado”);
}
}
}[/ftf]

Este primer comando lo único que hará en el momento de ejecutarse es presentar por pantalla un caja de Alerta con un texto determinado. Tal como iremos viendo la complejidad de los commands oscilará mucho dependiendo de la complejidad de nuestra aplicación. Pero por norma general y teniendo en cuenta que es una de las bases de la microarquitectura de Cairngorm, los Commands serán clases relativamente cortas. En contra partida podemos llegar a tener muchos Commands (del orden de cientos en grandes aplicaciones).

Para ejecutar este Command lo podríamos llegar a hacer de una forma muy sencilla:

[ftf w=”500″ h=”500″]













[/ftf]

Lo único que hemos hecho es instanciar la clase HelloWorldCommand y ejectuar el método execute.

Aunque esta forma de ejecución funciona correctamente y seguramente es la más tradicional, podríamos decir que no es la más óptima ni la que más beneficios nos aporta, no es la que Cairngorm fomenta.

Por definición los Commands son la unidad mínima funcional de nuestra aplicación, son stateless (entre distintas ejecuciones no guardan el estado) y a nivel conceptual deberían poderse ejecutar desde cualquier lugar de nuestra aplicación. Un Command debe encapsular su lógica interna y debe ser intercambiable por otro command sin ninguna repercusión a nivel implementacional (obviamente sí a nivel funcional).

Viendo que todos los commands se ejecutan de la misma forma (llamando al método execute), Cairngorm implementa una solución para la invocación basada en el patrón FrontController.

Xavi es un Technical Arquitect de Aplicaciones RIA basadas en la Plataforma Flash trabajando para Adobe en Londres. Especializado en aplicaciones colaborativas en tiempo real, e-learning y CMS (Content Management Systems) utiliza Flex, LCDS, BlazeDS, FMS y Java principalmente.

Sitio Web:http://www.code4net.com

4 Comentarios

  1. Adrián

    excelente artículo, pero estoy de acuerdo con aamoncada, el ejemplo no acompaña, quizá hubiese sido más propio un caso algo más real

  2. Chino

    Xavi, creo que te falta incorporar información respecto a la ejecución de los command, si esta se realiza de forma sincrónica o asíncrona en un nuevo hilo de ejecución permitiendo ejecutar tareas en segundo plano. ¿Como se podría ejecutar un command asíncrono?
    Además haces mención a que la forma que planteas de ejecutar un command no es la Cairngorm fomenta, ¿Cuál seria esta?

Deja un comentario

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

Acerca de Made In Flex

Made In Flex es una comunidad de desarrolladores de Apache Flex creada en 2006.

Apache Flex, anteriormente conocido como Adobe Flex, es un SDK (kit de desarrollo de software) para crear aplicaciones enriquecidas - multiplataforma basadas en Adobe Flash donado por Adobe a la fundación Apache in 2011 y promocionado a proyecto de primer nivel en Diciembre de 2012.

Actualmente estamos cambiando muchos aspectos del sitio web para ofrecer un sitio útil para toda la comunidad que tenga en cuenta las necesidades actuales.

Últimas Fotos

Instalador de Apache Flex

Entrar o Registrase