O documento apresenta o framework Cairngorm para desenvolvimento de aplicações em Adobe Flex, descrevendo seus principais conceitos como Model-View-Controller (MVC), Fluxo de eventos, Commands e ModelLocator. Explica como reduzir classes utilizando dados no próprio CairngormEvent em vez de classes separadas.
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 = "ADICIONAR_CONTATO_EVENT" ; 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 !
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=" { _model.contatos } " > </view:ContatosView> [ Bindable ] public var contatos:ArrayCollection; <mx:DataGrid dataProvider=“ { contatos } " > <mx:columns> <mx:DataGridColumn headerText=" Nome " dataField=" nome ” /> <mx:DataGridColumn headerText=" Telefone " dataField=" telefone " /> <mx:DataGridColumn headerText=" E-mail " dataField=" 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
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="1.0" encoding="utf-8"?> <cairngorm:ServiceLocator xmlns:cairngorm=" com.adobe.cairngorm.business.* " xmlns:mx=" http://www.adobe.com/2006/mxml " > <mx:RemoteObject id=" ro " destination=" zend " endpoint=" http://localhost/agendakids/server.php " source=" AgendaService " /> </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( "ro" ); } 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!
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
42. Usando o data do CairngormEvent // Cria um contato e atribui as informações var contato:ContatoVO = new ContatoVO(); contato.nome = "Eric Cavalcanti" ; contato.email = "ecavalcanti@gmail.com" ; contato.telefone = "99999999" ; // 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 = "Eric Cavalcanti" ; contato.email = "ecavalcanti@gmail.com" ; contato.telefone = "99999999" ; // 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();