Introdução
Quem está habituado a recorrer a arquitecturas MVC saberá certamente o quão chato é ter que criar vários ficheiros (commands, delegates, vos, etc) e dezenas de linhas de código apenas para adicionar uma pequena funcionalidade à aplicação.
Sabendo isso, já algumas pessoas criaram aplicações para gerar o esqueleto de novos projectos baseados em Cairngorm (a mais utilizada framework MVC para Flex/Air), tais como o Cairngen, Cairngorm Creator, ou o Flex Builder Enterprise Plugin.
Responder às mudanças no levantamento de requisitos
Tendo investigado estas aplicações, cheguei à conclusão de que apesar de serem extremamente úteis, possuem uma falha grave: assumem que à partida, antes de se iniciar a implementação de um projecto, já todos os requisitos estão levantados, sendo aí gerado o código para todas as funcionalidades que o Information Architect considerou.
Porém, na realidade é sabido que os requisitos mudam ao longo do tempo. É sabido que em projectos de grande dimensão, é preferível dividi-los em fases. É sabido que cada vez mais a realidade está em constante mudança, e as aplicações têm que se adaptar rapidamente a essa mudança. Pelo que os geradores referidos acima são apenas válidos para uma fase inicial, tornando-se inúteis a partir daí. Se um cliente nos disser “quero uma nova funcionalidade que permita inserir produtos”, teremos que criar os VO’s, Commands, Delegates, etc, etc “manualmente”.
O FlexFuel
Insatisfeitos com isto, e com vontade de aumentar a nossa velocidade de resposta à mudança, na Webfuel decidimos criar uma aplicação que permitisse não só criar a estrutura inicial de um projecto, como também ir adicionando funcionalidades a projectos já existentes. E foi assim que nasceu o FlexFuel, uma aplicação em Adobe Air construída no espaço de uma semana.
Esta aplicação é muito específica e foi construída de acordo com a nossa realidade e método de trabalho. Resumidamente, permite:
- Criar a estrutura de um projecto a partir do zero, tanto do código server-side (em PHP recorrendo a AMFPHP) como do código client-side.
- Adicionar novos Value Objects
- Adicionar novas propriedades a Value Objects existentes
- Adicionar novos serviços ao projecto
- Adicionar novos métodos a serviços já existentes.
Ecrân Configurações
O primeiro ecrân da aplicação - Config - permite-nos definir a configuração base do nosso projecto. Esta configuração é gravada num Local Shared Object pelo que sempre que abrimos a aplicação, a configuração criada na última execução é carregada.
Esta configuração resume-se a definir a directoria onde está o projecto e o nome do package do mesmo.

Ecrân Gerar Estrutura
Tendo isto feito, podemos então passar para o ecrân seguinte, Gerar.

Neste ecran temos apenas um botão “Gerar estrutura”. O objectivo é criar do zero:
- a estrutura de pastas client-side e server-side
- colocar no server side o amfphp 1.9b2 e alguns ficheiros da framework da Webfuel
- criar o ModelLocator.as
- criar o Controller.as
- criar o Services.mxml
- criar o services-config.xml
Assim, tendo inicialmente esta pasta:

Após clicarmos no botão obtemos:

É possível ver que os ficheiros criados vão de encontro à configuração que definimos no primeiro ecrân. Por exemplo, o Controller.as possui o package correcto:

Ecrân Criar Value Object
O ecrân seguinte, Criar VO, permite criar um novo Value Object. A estrutura é simples: o utilizador define o nome do Value Object, insere as propriedades, e clica em Criar.

Na caixa nova propriedade, a combobox permite escolher um tipo de dados, mostrando os tipos básicos e ainda outros Value Objects que existam no projecto, permitindo por exemplo criar um ClienteVO que além de um id:Number e um nome:String, possui também um ultimoProdutoVisto:ProdutoVO. Após se clicar em criar VO, é possível ver abaixo que são criados os ficheiros server side e client side:

A imagem seguinte mostra o conteudo do ficheiro ProdutoVO.

Ecrân Alterar Value Object
Imaginemos que mais tarde o cliente se vira para nós e diz “queremos começar a enviar encomendas pelo correio, pelo que ter o peso dos produtos é importante”. Lá teremos que adicionar uma nova propriedade ao ProdutoVO.as e ao ProdutoVO.php . Para isso, utilizamos o ecran “Alterar VO”, mostrado seguidamente:

Após se carregar em Adicionar Propriedade, podemos constatar que os ficheiros ProdutoVO.as e .php foram devidamente actualizados:

Ecrân Criar Serviço
Temos seguidamente o ecrân Criar Serviço. Este possui apenas uma caixa de texto para definirmos o nome do serviço. Imaginemos que o cliente nos pede que a aplicação permita gerir produtos. Temos então que criar um serviço GestorDeProdutos:

Carregando em criar, é então gerado do lado do cliente o correspondente GestorDeProdutosDelegate.as, é criado o Services.mxml, e do lado do servidor são criados o GestorDeProdutosManager.php e o GestorDeProdutosService.php:

Nas imagens seguintes podemos ver o código gerado do GestorDeProdutosDelegate.as e do services.mxml:


Ecrân Adicionar Método a Serviço
Chega então o último ecrân, que é talvez o mais importante - adicionar um método a um serviço. Imaginando que o GestorDeProdutosService precisa da funcionalidade de se inserir um novo produto. Temos então que criar o método adicionaProduto, que receberá um produto e devolverá um booleano indicando se este foi inserido com sucesso. Assim, temos então o seguinte ecrân:

Onde podemos ver que foram criados o AdicionaProdutoCommand.as, o AdicionaProdutoEvent.as, foi adicionado o mapeamento de ambos no Controller, foi adicionado o método ao GestorDeProdutosDelegate, e do lado do servidor a assinatura do método foi criada no GestorDeProdutosService e no GestorDeProdutosManager:

O código gerado do AdicionaProdutoCommand.as:

E o método adicionado ao GestorDeProdutosDelegate.as:

Conclusões
A aplicação ainda não está terminada, tendo alguns pequenos bugs (por exemplo, constatei ao escrever este post que o nome da classe dos VO’s criados não está correcto - devia ser nomeVO), e como disse anteriormente é muito específica ao método de trabalho da Webfuel.
O FlexFuel foi criado no espaço de uma semana, por três dos nossos developers:
- Eu, João Saleiro
- Filipe Freitas
- Alberto Rodrigues
Ainda não foi decidido dentro da Webfuel se iremos de disponibilizar publicamente a aplicação (ou até o próprio código), no entanto quem se quiser candidatar a receber um beta privado da mesma, pode enviar-me um mail para joao|DOT|saleiro|AT|webfuel|DOT|pt apresentando-se e dizendo o que acha do futuro das RIAs em Portugal.
Os comentários melhor conseguidos receberão uma cópia da versão beta, e verão o seu comentário publicado num post no blog do riapt.