SlideShare uma empresa Scribd logo
1 de 46
Desmistificando o Cairngorm Eric Cavalcanti [email_address] @ericoc 06 de Fevereiro de 2010
Sobre mim ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
O que é o Cairngorm? ,[object Object]
História ,[object Object],[object Object],[object Object],[object Object],[object Object]
Pontos fortes ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Pontos fracos ,[object Object],[object Object],[object Object],[object Object]
Vamos desmistificá-lo!
[object Object],[object Object],[object Object]
Fluxo Básico do Cairngorm
Aplicação de exemplo
VO (Value Object) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Controller CairngormEvent FrontController Command
CairngormEvent Olá! Eu sou o  FrontController ! Chame  um  CairngormEvent  sempre que precisar  alterar  o  Model !
CairngormEvent Eu sou o  AdicionarContatoEvent ! É só me  instanciar passando  o  ContatoVO  que deverá ser  adicionado  e me  lançar ! public   class   AdicionarContatoEvent   extends   CairngormEvent { public   static   const   EVENT_ID :String =  "ADICIONAR_CONTATO_EVENT" ; public   var   contato:ContatoVO ;  public   function  AdicionarContatoEvent( contato:ContatoVO ) { super ( EVENT_ID ); this . contato = contato; } }
CairngormEvent Vejam como é simples me utilizar!! // Cria um contato e atribui as informações var  contato:ContatoVO =  new  ContatoVO(); contato.nome  =  txtNome.text; contato.telefone  =  txtTelefone.text; contato.email  =  txtEmail.text; // Cria um evento do tipo AdicionarContatoEvent informando o contato a  ser adicionado var   contatoEvent :AdicionarContatoEvent =  new  AdicionarContatoEvent(contato); // Lança o evento contatoEvent .dispatch();
FrontController Eu  capturo  o  evento  e tenho um  mapeamento  que diz qual  Command  deverá ser chamado para cada  evento !
FrontController Por exemplo: para um  AdicionarContatoEvent  eu chamo o  AdicionarContatoCommand !
FrontController public   class  AgendaController  extends  FrontController { public   function  AgendaController() { addCommand( AdicionarContatoEvent.EVENT_ID, AdicionarContatoCommand ); addCommand( AtualizarContatoEvent.EVENT_ID, AtualizarContatoCommand ); addCommand( ExcluirContatoEvent.EVENT_ID, ExcluirContatoCommand); } } Vejam como eu faço o  mapeamento  entre um  CairngormEvent  e um  Command !!
Command Eu  capturo  os  dados  contidos no  CairngormEvent  que me chamou e  altero  o  Model .
Command Eu  faço  isso através do meu método  execute . ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Epa!! Você não pode dizer que vai atualizar o Model sem antes me apresentar! Eu sou o  ModelLocator , o cara que  centraliza  e  armazena  as informações do  Model . Então o  Command  deve alterar as informações que  EU   TENHO !
ModelLocator package  com.flexforkids.model { ... [ Bindable ] public   class  AgendaModelLocator { public   var  contatos:ArrayCollection =  new  ArrayCollection(); public   var  contatoAtual:ContatoVO; public   static   const  TELA_PRINCIPAL : uint = 0; public   static   const  TELA_FORM_USUARIO : uint = 1; public   var  applicationView:uint = TELA_PRINCIPAL; ... private   static   var  _instance:AgendaModelLocator; public   function  AgendaModelLocator(param: ForceInstance ){} public   static   function   getInstance() :AgendaModelLocator { if  (_instance== null ) { _instance =  new  AgendaModelLocator( new  ForceInstance()); } return  _instance; } } } class   ForceInstance  { } Aqui estou eu!
Atualizando o Model public   class   AdicionarContatoCommand   implements  ICommand { public   function  execute(event:CairngormEvent): void { var  adicionarContatoEvent:AdicionarContatoEvent; adicionarContatoEvent = event  as  AdicionarContatoEvent; AgendaModelLocator.getInstance().contatos.addItem(adicionarContatoEvent.contato); } } Agora que nosso amigo se apresentou,  vejam como eu o  atualizo !
Views e ModelLocator [ Bindable ] private   var  _model:AgendaModelLocator = AgendaModelLocator.getInstance(); <view:ContatosView  contatos=&quot; { _model.contatos } &quot; > </view:ContatosView> [ Bindable ] public   var  contatos:ArrayCollection; <mx:DataGrid  dataProvider=“ { contatos } &quot; > <mx:columns> <mx:DataGridColumn  headerText=&quot; Nome &quot; dataField=&quot; nome ” /> <mx:DataGridColumn  headerText=&quot; Telefone &quot;  dataField=&quot; telefone &quot; /> <mx:DataGridColumn  headerText=&quot; E-mail &quot; dataField=&quot; email “  /> </mx:columns> </mx:DataGrid> E como as  views  recebem referências aos dados do  ModelLocator , elas são automaticamente  atualizadas ! AgendaKids.mxml ContatosView.mxml
MVC do Cairngorm ,[object Object],[object Object],[object Object],[object Object],[object Object]
Revisão do Fluxo Básico do Cairngorm
Ei!! Dessa forma que vocês mostraram os  dados  estão  locais . E se esses  dados  precisarem  representar  informações vindas de um  back-end ? Desenvolvedor
Business Delegate Olá! Eu tenho uma proposta pra vocês! Me chamo  Business   Delegate ! Forneço serviços de  back-end ! É só solicitar pra mim, que eu me encarrego de acessar o  back-end !
O acordo! Então de agora em diante sempre que eu precisar  acessar  o  back-end  eu chamo você?
O acordo! Exato! Mas tem uma coisa, você precisa me dizer para quem devo  responder  quando eu trouxer os  dados  do  back-end ! E sendo assim, quem for receber o resultado ( Responder)  deverá atualizar o  Model .
O acordo! Ok! Não se preocupe, no caso, você responderá para mim mesmo. Ou seja, além de  Command  eu também serei um  Responder .
Command Turbinado! ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Aqui estou eu reformulado para utilizar o  Business Delegate !
Service Locator Pessoal, esse é o  Service Locator  que trabalha para mim! Ele é quem armazena os  RemoteObject ,  WebService  e  HTTPService .
Service Locator <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> <cairngorm:ServiceLocator   xmlns:cairngorm=&quot; com.adobe.cairngorm.business.* &quot;  xmlns:mx=&quot; http://www.adobe.com/2006/mxml &quot; > <mx:RemoteObject  id=&quot; ro &quot; destination=&quot; zend &quot;  endpoint=&quot; http://localhost/agendakids/server.php &quot;  source=&quot; AgendaService &quot; /> </cairngorm:ServiceLocator> Nesse caso específico, eu tenho um  RemoteObject  que faz acesso ao  PHP  via  Zend AMF !
Business Delegate public   class  ContatoDelegate { private   var  _responder:IResponder; private   var  _service:Object; public   function  ContatoDelegate( responder:IResponder ) { this ._responder = responder; this ._service = ServiceLocator.getInstance().getRemoteObject( &quot;ro&quot; ); } public   function   salvarContato(contato:ContatoVO ): void  { var  token:AsyncToken =  this ._service.salvarContato(contato); token.addResponder( this ._responder); } ... } Não vão contar para o  Command ! Mas é assim que eu trabalho internamente!
Fluxo Completo do Cairngorm
Estrutura de Pastas e Arquivos
Bem! Eu acho que agora comecei a entender de verdade esse Cairngorm. Mas a pergunta que não quer calar:  “É possível reduzir a quantidade de classes necessárias?” Desenvolvedor
SIM! Vamos ver uma das possibilidades!
Imersão no CairngormEvent
Front Controller ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Usando o data do CairngormEvent // Cria um contato e atribui as informações var   contato:ContatoVO =  new  ContatoVO(); contato.nome =  &quot;Eric Cavalcanti&quot; ; contato.email =  &quot;ecavalcanti@gmail.com&quot; ; contato.telefone =  &quot;99999999&quot; ; // Cria um evento do tipo AdicionarContatoEvent informando o contato a  ser adicionado var   contatoEvent :AdicionarContatoEvent =  new  AdicionarContatoEvent(contato); // Lança o evento contatoEvent .dispatch(); // Cria um contato e atribui as informações var   contato:ContatoVO =  new  ContatoVO(); contato.nome =  &quot;Eric Cavalcanti&quot; ; contato.email =  &quot;ecavalcanti@gmail.com&quot; ; contato.telefone =  &quot;99999999&quot; ; // Cria um evento do tipo CairngormEvent var   contatoEvent :CairngormEvent =  new  CairngormEvent(AgendaController.ADICIONAR_CONTATO_EVENT); // Atribui o contato ao data do Evento contatoEvent .data = contato; // Lança o evento contatoEvent .dispatch();
Usando o data no Command ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Comparando
Links ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Obrigado! Eric Cavalcanti [email_address] @ericoc

Mais conteúdo relacionado

Mais procurados

Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Frameworkelliando dias
 
C#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaC#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaGiovanni Bassi
 
HTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJSHTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJSRodrigo Branas
 
Criando serviços com AngularJS
Criando serviços com AngularJSCriando serviços com AngularJS
Criando serviços com AngularJSRodrigo Branas
 

Mais procurados (6)

ApresentaçãO Mvc
ApresentaçãO MvcApresentaçãO Mvc
ApresentaçãO Mvc
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Framework
 
C#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaC#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variância
 
HTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJSHTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJS
 
Criando serviços com AngularJS
Criando serviços com AngularJSCriando serviços com AngularJS
Criando serviços com AngularJS
 
Java script2
Java script2Java script2
Java script2
 

Destaque

FireScrum - Ontem, Hoje e o Futuro
FireScrum - Ontem, Hoje e o FuturoFireScrum - Ontem, Hoje e o Futuro
FireScrum - Ontem, Hoje e o FuturoEric Cavalcanti
 
Titanium Mobile apresentado na Campus Party Recife
Titanium Mobile apresentado na Campus Party RecifeTitanium Mobile apresentado na Campus Party Recife
Titanium Mobile apresentado na Campus Party RecifeEric Cavalcanti
 
Desenvolvendo aplicações Adobe AIR para Android
Desenvolvendo aplicações Adobe AIR para AndroidDesenvolvendo aplicações Adobe AIR para Android
Desenvolvendo aplicações Adobe AIR para AndroidEric Cavalcanti
 
Aplicações móveis multi-plataforma com Titanium - Geek Night
Aplicações móveis multi-plataforma com Titanium - Geek NightAplicações móveis multi-plataforma com Titanium - Geek Night
Aplicações móveis multi-plataforma com Titanium - Geek NightEric Cavalcanti
 
Utilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações FlexUtilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações FlexEric Cavalcanti
 
Titanium Mobile - Campus Party Recife 2
Titanium Mobile - Campus Party Recife 2Titanium Mobile - Campus Party Recife 2
Titanium Mobile - Campus Party Recife 2Eric Cavalcanti
 

Destaque (6)

FireScrum - Ontem, Hoje e o Futuro
FireScrum - Ontem, Hoje e o FuturoFireScrum - Ontem, Hoje e o Futuro
FireScrum - Ontem, Hoje e o Futuro
 
Titanium Mobile apresentado na Campus Party Recife
Titanium Mobile apresentado na Campus Party RecifeTitanium Mobile apresentado na Campus Party Recife
Titanium Mobile apresentado na Campus Party Recife
 
Desenvolvendo aplicações Adobe AIR para Android
Desenvolvendo aplicações Adobe AIR para AndroidDesenvolvendo aplicações Adobe AIR para Android
Desenvolvendo aplicações Adobe AIR para Android
 
Aplicações móveis multi-plataforma com Titanium - Geek Night
Aplicações móveis multi-plataforma com Titanium - Geek NightAplicações móveis multi-plataforma com Titanium - Geek Night
Aplicações móveis multi-plataforma com Titanium - Geek Night
 
Utilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações FlexUtilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações Flex
 
Titanium Mobile - Campus Party Recife 2
Titanium Mobile - Campus Party Recife 2Titanium Mobile - Campus Party Recife 2
Titanium Mobile - Campus Party Recife 2
 

Semelhante a Desmistificando o cairngorm

Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?Stefanini
 
2009 05 20 Floripa Flex
2009 05 20 Floripa Flex2009 05 20 Floripa Flex
2009 05 20 Floripa FlexEduardo Kraus
 
Javascript truquesmagicos
Javascript truquesmagicosJavascript truquesmagicos
Javascript truquesmagicosponto hacker
 
Integração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPIntegração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPelliando dias
 
Pilares do desenvolvimento Mobile no Nubank
 Pilares do desenvolvimento Mobile no Nubank Pilares do desenvolvimento Mobile no Nubank
Pilares do desenvolvimento Mobile no NubankDevCamp Campinas
 
Utiizando o Celular no Apoio à Gerência de configuração
Utiizando o Celular no Apoio à Gerência de configuraçãoUtiizando o Celular no Apoio à Gerência de configuração
Utiizando o Celular no Apoio à Gerência de configuraçãoJaguaraci Silva
 
Técnicas de Refactoring
Técnicas de RefactoringTécnicas de Refactoring
Técnicas de RefactoringRodrigo Branas
 
Comet - ReverseAjax com DWR - Resumo
Comet - ReverseAjax com DWR - ResumoComet - ReverseAjax com DWR - Resumo
Comet - ReverseAjax com DWR - ResumoHanderson Frota
 
Formulários para Plone: um passeio pelo framework z3c.form
Formulários para Plone: um passeio pelo framework z3c.formFormulários para Plone: um passeio pelo framework z3c.form
Formulários para Plone: um passeio pelo framework z3c.formRuda Filgueiras
 
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Daniel Makiyama
 

Semelhante a Desmistificando o cairngorm (20)

Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
 
Tutorial Dwr - Configuração e Uso
Tutorial Dwr - Configuração e UsoTutorial Dwr - Configuração e Uso
Tutorial Dwr - Configuração e Uso
 
Mvc delphi
Mvc delphiMvc delphi
Mvc delphi
 
2009 05 20 Floripa Flex
2009 05 20 Floripa Flex2009 05 20 Floripa Flex
2009 05 20 Floripa Flex
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
Javascript truquesmagicos
Javascript truquesmagicosJavascript truquesmagicos
Javascript truquesmagicos
 
Integração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPIntegração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHP
 
Hello vue
Hello vueHello vue
Hello vue
 
Pilares do desenvolvimento Mobile no Nubank
 Pilares do desenvolvimento Mobile no Nubank Pilares do desenvolvimento Mobile no Nubank
Pilares do desenvolvimento Mobile no Nubank
 
Apresentação M V C
Apresentação M V CApresentação M V C
Apresentação M V C
 
Utiizando o Celular no Apoio à Gerência de configuração
Utiizando o Celular no Apoio à Gerência de configuraçãoUtiizando o Celular no Apoio à Gerência de configuração
Utiizando o Celular no Apoio à Gerência de configuração
 
Técnicas de Refactoring
Técnicas de RefactoringTécnicas de Refactoring
Técnicas de Refactoring
 
Html dom, eventos, jquery
Html dom, eventos, jqueryHtml dom, eventos, jquery
Html dom, eventos, jquery
 
Comet - ReverseAjax com DWR - Resumo
Comet - ReverseAjax com DWR - ResumoComet - ReverseAjax com DWR - Resumo
Comet - ReverseAjax com DWR - Resumo
 
Php 05 Mvc
Php 05 MvcPhp 05 Mvc
Php 05 Mvc
 
Formulários para Plone: um passeio pelo framework z3c.form
Formulários para Plone: um passeio pelo framework z3c.formFormulários para Plone: um passeio pelo framework z3c.form
Formulários para Plone: um passeio pelo framework z3c.form
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
 
Python 08
Python 08Python 08
Python 08
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 

Mais de Eric Cavalcanti

Mais de Eric Cavalcanti (7)

React Native - JSday
React Native - JSdayReact Native - JSday
React Native - JSday
 
Agile
AgileAgile
Agile
 
Introdução ao Titanium Mobile
Introdução ao Titanium MobileIntrodução ao Titanium Mobile
Introdução ao Titanium Mobile
 
Scrum
ScrumScrum
Scrum
 
Scrum Adoption in an Academic Distributed Environment
Scrum Adoption in an Academic Distributed EnvironmentScrum Adoption in an Academic Distributed Environment
Scrum Adoption in an Academic Distributed Environment
 
FireScrum Agiles2009
FireScrum Agiles2009FireScrum Agiles2009
FireScrum Agiles2009
 
FireScrum
FireScrumFireScrum
FireScrum
 

Desmistificando o cairngorm

  • 1. Desmistificando o Cairngorm Eric Cavalcanti [email_address] @ericoc 06 de Fevereiro de 2010
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 8.
  • 9. Fluxo Básico do Cairngorm
  • 11.
  • 13. CairngormEvent Olá! Eu sou o FrontController ! Chame um CairngormEvent sempre que precisar alterar o Model !
  • 14. CairngormEvent Eu sou o AdicionarContatoEvent ! É só me instanciar passando o ContatoVO que deverá ser adicionado e me lançar ! public class AdicionarContatoEvent extends CairngormEvent { public static const EVENT_ID :String = &quot;ADICIONAR_CONTATO_EVENT&quot; ; public var contato:ContatoVO ; public function AdicionarContatoEvent( contato:ContatoVO ) { super ( EVENT_ID ); this . contato = contato; } }
  • 15. CairngormEvent Vejam como é simples me utilizar!! // Cria um contato e atribui as informações var contato:ContatoVO = new ContatoVO(); contato.nome = txtNome.text; contato.telefone = txtTelefone.text; contato.email = txtEmail.text; // Cria um evento do tipo AdicionarContatoEvent informando o contato a ser adicionado var contatoEvent :AdicionarContatoEvent = new AdicionarContatoEvent(contato); // Lança o evento contatoEvent .dispatch();
  • 16. FrontController Eu capturo o evento e tenho um mapeamento que diz qual Command deverá ser chamado para cada evento !
  • 17. FrontController Por exemplo: para um AdicionarContatoEvent eu chamo o AdicionarContatoCommand !
  • 18. FrontController public class AgendaController extends FrontController { public function AgendaController() { addCommand( AdicionarContatoEvent.EVENT_ID, AdicionarContatoCommand ); addCommand( AtualizarContatoEvent.EVENT_ID, AtualizarContatoCommand ); addCommand( ExcluirContatoEvent.EVENT_ID, ExcluirContatoCommand); } } Vejam como eu faço o mapeamento entre um CairngormEvent e um Command !!
  • 19. Command Eu capturo os dados contidos no CairngormEvent que me chamou e altero o Model .
  • 20.
  • 21. Epa!! Você não pode dizer que vai atualizar o Model sem antes me apresentar! Eu sou o ModelLocator , o cara que centraliza e armazena as informações do Model . Então o Command deve alterar as informações que EU TENHO !
  • 22. ModelLocator package com.flexforkids.model { ... [ Bindable ] public class AgendaModelLocator { public var contatos:ArrayCollection = new ArrayCollection(); public var contatoAtual:ContatoVO; public static const TELA_PRINCIPAL : uint = 0; public static const TELA_FORM_USUARIO : uint = 1; public var applicationView:uint = TELA_PRINCIPAL; ... private static var _instance:AgendaModelLocator; public function AgendaModelLocator(param: ForceInstance ){} public static function getInstance() :AgendaModelLocator { if (_instance== null ) { _instance = new AgendaModelLocator( new ForceInstance()); } return _instance; } } } class ForceInstance { } Aqui estou eu!
  • 23. Atualizando o Model public class AdicionarContatoCommand implements ICommand { public function execute(event:CairngormEvent): void { var adicionarContatoEvent:AdicionarContatoEvent; adicionarContatoEvent = event as AdicionarContatoEvent; AgendaModelLocator.getInstance().contatos.addItem(adicionarContatoEvent.contato); } } Agora que nosso amigo se apresentou, vejam como eu o atualizo !
  • 24. Views e ModelLocator [ Bindable ] private var _model:AgendaModelLocator = AgendaModelLocator.getInstance(); <view:ContatosView contatos=&quot; { _model.contatos } &quot; > </view:ContatosView> [ Bindable ] public var contatos:ArrayCollection; <mx:DataGrid dataProvider=“ { contatos } &quot; > <mx:columns> <mx:DataGridColumn headerText=&quot; Nome &quot; dataField=&quot; nome ” /> <mx:DataGridColumn headerText=&quot; Telefone &quot; dataField=&quot; telefone &quot; /> <mx:DataGridColumn headerText=&quot; E-mail &quot; dataField=&quot; email “ /> </mx:columns> </mx:DataGrid> E como as views recebem referências aos dados do ModelLocator , elas são automaticamente atualizadas ! AgendaKids.mxml ContatosView.mxml
  • 25.
  • 26. Revisão do Fluxo Básico do Cairngorm
  • 27. Ei!! Dessa forma que vocês mostraram os dados estão locais . E se esses dados precisarem representar informações vindas de um back-end ? Desenvolvedor
  • 28. Business Delegate Olá! Eu tenho uma proposta pra vocês! Me chamo Business Delegate ! Forneço serviços de back-end ! É só solicitar pra mim, que eu me encarrego de acessar o back-end !
  • 29. O acordo! Então de agora em diante sempre que eu precisar acessar o back-end eu chamo você?
  • 30. O acordo! Exato! Mas tem uma coisa, você precisa me dizer para quem devo responder quando eu trouxer os dados do back-end ! E sendo assim, quem for receber o resultado ( Responder) deverá atualizar o Model .
  • 31. O acordo! Ok! Não se preocupe, no caso, você responderá para mim mesmo. Ou seja, além de Command eu também serei um Responder .
  • 32.
  • 33. Service Locator Pessoal, esse é o Service Locator que trabalha para mim! Ele é quem armazena os RemoteObject , WebService e HTTPService .
  • 34. Service Locator <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> <cairngorm:ServiceLocator xmlns:cairngorm=&quot; com.adobe.cairngorm.business.* &quot; xmlns:mx=&quot; http://www.adobe.com/2006/mxml &quot; > <mx:RemoteObject id=&quot; ro &quot; destination=&quot; zend &quot; endpoint=&quot; http://localhost/agendakids/server.php &quot; source=&quot; AgendaService &quot; /> </cairngorm:ServiceLocator> Nesse caso específico, eu tenho um RemoteObject que faz acesso ao PHP via Zend AMF !
  • 35. Business Delegate public class ContatoDelegate { private var _responder:IResponder; private var _service:Object; public function ContatoDelegate( responder:IResponder ) { this ._responder = responder; this ._service = ServiceLocator.getInstance().getRemoteObject( &quot;ro&quot; ); } public function salvarContato(contato:ContatoVO ): void { var token:AsyncToken = this ._service.salvarContato(contato); token.addResponder( this ._responder); } ... } Não vão contar para o Command ! Mas é assim que eu trabalho internamente!
  • 36. Fluxo Completo do Cairngorm
  • 37. Estrutura de Pastas e Arquivos
  • 38. Bem! Eu acho que agora comecei a entender de verdade esse Cairngorm. Mas a pergunta que não quer calar: “É possível reduzir a quantidade de classes necessárias?” Desenvolvedor
  • 39. SIM! Vamos ver uma das possibilidades!
  • 41.
  • 42. Usando o data do CairngormEvent // Cria um contato e atribui as informações var contato:ContatoVO = new ContatoVO(); contato.nome = &quot;Eric Cavalcanti&quot; ; contato.email = &quot;ecavalcanti@gmail.com&quot; ; contato.telefone = &quot;99999999&quot; ; // Cria um evento do tipo AdicionarContatoEvent informando o contato a ser adicionado var contatoEvent :AdicionarContatoEvent = new AdicionarContatoEvent(contato); // Lança o evento contatoEvent .dispatch(); // Cria um contato e atribui as informações var contato:ContatoVO = new ContatoVO(); contato.nome = &quot;Eric Cavalcanti&quot; ; contato.email = &quot;ecavalcanti@gmail.com&quot; ; contato.telefone = &quot;99999999&quot; ; // Cria um evento do tipo CairngormEvent var contatoEvent :CairngormEvent = new CairngormEvent(AgendaController.ADICIONAR_CONTATO_EVENT); // Atribui o contato ao data do Evento contatoEvent .data = contato; // Lança o evento contatoEvent .dispatch();
  • 43.
  • 45.
  • 46. Obrigado! Eric Cavalcanti [email_address] @ericoc

Notas do Editor

  1. Falar do Desafio