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.

ActionScript

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

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:

ActionScript

  1. var teste = "display";
  2. function display() {
  3.     trace("testando função dinâmica");
  4. }
  5. this[teste]();

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:

ActionScript

  1. import mx.remoting.Service;
  2. import mx.services.Log;
  3. import mx.rpc.RelayResponder;
  4. import mx.rpc.FaultEvent;
  5. import mx.remoting.DataGlue;
  6. import mx.rpc.ResultEvent;
  7. import mx.remoting.PendingCall;
  8. import mx.remoting.RecordSet;
  9. class RemotingConnection {
  10.     var _urlGateway:String = "http://localhost/flashservices/gateway.php";
  11.     var _service:Service;
  12.     var _pc:PendingCall;
  13.     var _callback:Function;
  14.     var _class:String;
  15.     var _args:Array;
  16.     var _method:String;
  17.     /**
  18.      * Construtor
  19.      *
  20.      * @return false;
  21.      */
  22.     public function RemotingConnection() {
  23.         trace("Constructor");
  24.     }
  25.     public function setService(classe:String):Void {
  26.         this._class = classe;
  27.         this._service = new Service(this._urlGateway, new Log(), this._class, null, null);
  28.     }
  29.     public function get Service():Service {
  30.         return this._service;
  31.     }
  32.     public function setMethod(method:String, callback:Function, args:Array):Void {
  33.         this._callback = callback;
  34.         this._args = args;
  35.         this._method = method;
  36.         if (this._args.length == 0) {
  37.             this._pc = this._service[this._method]();
  38.         } else {
  39.             this._pc = this._service[this._method](this._args);
  40.         }
  41.         this._pc.responder = new RelayResponder(this, "Remoting_Result", "Remoting_Fault");
  42.     }
  43.     public function Remoting_Result(re:ResultEvent) {
  44.         if (re.result) {
  45.             this._callback(re.result);
  46.         } else {
  47.             this._callback(false);
  48.         }
  49.     }
  50.     public function Remoting_Fault(fault:FaultEvent) {
  51.         trace(fault.fault.faultstring);
  52.         this._callback(false);
  53.     }
  54. }

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:

ActionScript

  1. if (this._args.length == 0) {

é 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:

  1. < ?php
  2.     class teste{
  3.  
  4.     function teste(){
  5.     $this->methodTable = array(
  6.     "ola" => array(
  7.     "description" => “testando o AMFPHP�?,
  8.     "access" => “remote�?, // available values are private, public, remote
  9.     "arguments" => array (�?arg�?)
  10.     )
  11.     );
  12.     }
  13.  
  14.     function ola($args=array()){
  15.     $msg = $args[0];
  16.     return $msg;
  17.     }
  18.     }
  19.     ?>

E um exemplo de uso da classe:

ActionScript

  1. import RemotingConnection;
  2. var remoting:RemotingConnection = new RemotingConnection();
  3. var args:Array = new Array("Ola Flash Remoting!!!");
  4. function getTeste():Void {
  5.     var method:String = "ola";
  6.     var classe:String = "teste";
  7.     remoting.setService(classe);
  8.     remoting.setMethod(method, getTesteResult,args);
  9. }
  10. function getTesteResult(obj) {
  11.     trace(obj);
  12. }

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-

AMFPHP, Flash, Flash Platform, Flash Remoting, PHP, Principal, RIA

7 comments


  1. Bruno Ribeiro

    Bem interessante.

    []’s

  2. 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

  3. 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).

  4. Bem interessante o Cairngorm Fabio, vou começar a estuda-lo e sim Wendel, o Action Script 3.0 aceita variavéis dinâmicas.

  5. Leonardo.. como você adiciona essas caixas plain text no post?

  6. valeu pela dica cara

Leave a Reply