Acelerando o Desenvolvimento de RIA’s com Design Patterns

Há um tempo venho tentando criar uma classe genérica para usar com o Flash Remoting, estava cansado de toda vez importar todas as classes do remoting, setar a conexão com o gateway e criar uma função para receber os dados etc. Em virtude de meus estudos iniciais sobre Design Pattern, mais precisamente sobre o design pattern proxy, resolvi fazer isso enquanto estava na Ad-Infinitum, consegui criar uma classe mas que não estava funcionando exatamente como queria. Até que encontrei uma classe bem parecida e com o detalhe que estava faltando para minha funcionar perfeitamente.

Primeiramente vamos explicar como iremos trabalhar, o objetivo é que a gente mande o nome da classe em PHP (no caso estou usando o AMFPHP), o nome dos métodos e seus argumentos dinamicamente, para isso sabemos que o Action Script aceita variaveis criadas dinamicamente. por exemplo.


[as]
var teste = "proxy";
this.proxy = "testando variável dinâmica";
trace(this[teste]);
[/as]

A saida deve ser “testando variável dinâmica”, porque o valor da variável teste(proxy) é passado dinamicamente usando os colchetes [], assumindo como trace(this.proxy).
Mas não são somente as variáveis que podemos criar dinamicamente, as funções também podem ser implementadas desse modo, por exemplo:

[as]
var teste = "display";
function display() {
trace("testando função dinâmica");
}
this[teste]();
[/as]

A saída deve ser “testando função dinâmica”, portando já podemos visualizar o leque de possibilidades que temos, não somente para o Flash Remoting mas para o que pudermos imaginar em se tratando de aplicativos RIA.

Agora veremos um exemplo pratico, escrevi um artigo sobre como instalar o AMFPHP então vamos utilizar a mesma classe php para comparação.
A classe para conexão com o remoting é a seguinte:

[as]
import mx.remoting.Service;
import mx.services.Log;
import mx.rpc.RelayResponder;
import mx.rpc.FaultEvent;
import mx.remoting.DataGlue;
import mx.rpc.ResultEvent;
import mx.remoting.PendingCall;
import mx.remoting.RecordSet;
class RemotingConnection {
var _urlGateway:String = "http://localhost/flashservices/gateway.php";
var _service:Service;
var _pc:PendingCall;
var _callback:Function;
var _class:String;
var _args:Array;
var _method:String;
/**
* Construtor
*
* @return false;
*/
public function RemotingConnection() {
trace("Constructor");
}
public function setService(classe:String):Void {
this._class = classe;
this._service = new Service(this._urlGateway, new Log(), this._class, null, null);
}
public function get Service():Service {
return this._service;
}
public function setMethod(method:String, callback:Function, args:Array):Void {
this._callback = callback;
this._args = args;
this._method = method;
if (this._args.length == 0) {
this._pc = this._service[this._method]();
} else {
this._pc = this._service[this._method](this._args);
}
this._pc.responder = new RelayResponder(this, "Remoting_Result", "Remoting_Fault");
}
public function Remoting_Result(re:ResultEvent) {
if (re.result) {
this._callback(re.result);
} else {
this._callback(false);
}
}
public function Remoting_Fault(fault:FaultEvent) {
trace(fault.fault.faultstring);
this._callback(false);
}
}
[/as]

Resolvi deixar setado dentro da classe o endereço do gateway porque foi mais prático para mim, mas você pode deixar seu valor como parametro da classe.
No método setService, é passado o nome da classe que chamaremos no AMFPHP, já no método setMethod são passados como parametros o nome do método que chamaremos no AMFPHP, a função que receberá a resposta do AMFPHP e os argumentos que serão enviados com o método.
Na linha:
[as]if (this._args.length == 0) {[/as]
é onde verificamos se há argumentos para passar para o servidor, caso não tenha, chamaremos só a função sem argumentos.

No caso da classe utilizada no AMFPHP, precisaremos mudar a forma de como são recebidos os parâmetros:

[php]
< ?php class teste{ function teste(){ $this->methodTable = array(
"ola" => array(
"description" => “testando o AMFPHP�?,
"access" => “remote�?, // available values are private, public, remote
"arguments" => array (�?arg�?)
)
);
}

function ola($args=array()){
$msg = $args[0];
return $msg;
}
}
?>
[/php]

E um exemplo de uso da classe:


[as]
import RemotingConnection;
var remoting:RemotingConnection = new RemotingConnection();
var args:Array = new Array("Ola Flash Remoting!!!");
function getTeste():Void {
var method:String = "ola";
var classe:String = "teste";
remoting.setService(classe);
remoting.setMethod(method, getTesteResult,args);
}
function getTesteResult(obj) {
trace(obj);
}
[/as]

Isso já esta agilizando bastante o desenvolvimento de meus projetos, espero que ti ajude também.

Para saber mais:

AMFPHP
http://www.amfphp.org/

Flash Remoting Developer Center
http://www.adobe.com/devnet/flashremoting/

Design Pattern Proxy
http://www-128.ibm.com/developerworks/java/library/j-jtp08305.html?ca=drs-

7 thoughts on “Acelerando o Desenvolvimento de RIA’s com Design Patterns

  1. Fabio Terracini

    Interessante Leonardo! Eu e minha equipe costumamos utilizar o framework Cairngorm (veja em labs.adobe.com a versão 2) para o desenvolvimento de RIAs em Flex. Eu fiz um post sobre os design patterns envolvidos no Cairngorm: http://www.cfgigolo.com/archives/2005/10/cairngorm_framework_para_rias.html, mas há diversos posts sobre esse framework lá no CFGigolo.

    Temos utilizado extensivamente o Cairngorm, e com muito sucesso. Falando em Flash, nós chegamos a utilizar o ARP, mas depois de um tempo fizemos nossas implementação do Cairngorm no Flash, que você pode ver um exemplo (talvez um pouco diferente do que é hoje) no blog da DClick: http://www.dclick.com.br/blog/index.cfm/2006/1/21/flashcairngorm

    Para você ter uma idéia de como o Cairngorm tem atendido bem as nossas necessidades de desenvolvimento de RIAs, além de utilizamos no Flex e no Flash, utilizamos até mesmo em aplicações em Flash Lite 2!

    []s

  2. wendel

    muito bom leo, o interessante que achei foi a chamada dinâmica de objetos, mesmo de funções, e com certeza a partir de agora vou passar a esse recurso no meu código.

    Dúvida: funciona no AS3/Flex?

    (ps: chamada dinâmicas é um dos recursos que vou usar para montar meu ‘Flex MVC’ para renderizar lista/formulários a partir de tabelas de um banco de dados).

Leave a Reply