SlideShare uma empresa Scribd logo
1 de 40
Utilizando o Padrão PresentationModel em Aplicações Flex Eric Cavalcanti ecavalcanti@gmail.com @ericoc
Sobre mim Eric Cavalcanti Mestre em Engenharia de Software pelo CESAR.EDU Certificado ScrumMaster pela ScrumAlliance Engenheiro de Software da ID S/A Background Trabalha com desenvolvimento de Software há mais de 10 anos .  Instrutor Adobe Flex da Imedia Brasil.  Professor no Curso de Especialização em Gestão Ágil de Projetos do CESAR.EDU e da Pós-Graduaçaõ em Front-EndEngineering & Design da Faculdade Marista Idealizador e principal desenvolvedor do projeto FireScrum (Flex e Java)  Idealizador do FireKanban (Flex e Java)
O Problema
O Problema Geralmente uma View em um aplicação contém controles que exibem dados do domínio de sua aplicação. O usuário pode alterar os dados e submeter tais alterações.
O Problema A View geralmente:  recupera os dados do domínio  manipula eventos dos usuários  altera outros controles da View em resposta a tais eventos submete as alterações efetuadas nos dados do domínio.
O Problema Incluir todo esse código na View pode torná-la uma classe complexa, difícil de manter e testar. Ocasionalmente, seria difícil compartilhar o código com uma outra View que necessita do mesmo comportamento.
Motivação Você quer aumentar a cobertura dos seus testes unitários automáticos (Views são difíceis de testar automaticamente). Você quer compartilhar o código entre Views que necessitam do mesmo comportamento Você quer separar a lógica de negócio da lógica de interface do usuário (UI) para que o código fique mais fácil de entender e manter.
Motivação Você quer permitir que o profissional de designer possa facilmente criar e modificar o visual da interface do usuário da sua aplicação. Os dados que você quer exibir necessitam de alguma conversão, validação ou formatação antes de serem exibidos na interface do usuário.
Solução
PresentationModel
O que é o PresentationModel?
PresentationModel em uma frase! 	“É uma forma de mover o estado e a lógica da view para uma outra classe.”
Uma imagem vale mais do que mil palavras! View PM Model ContatoDetalheView.mxml ContatoDetalhePM.as ContatoModel.as
Principais características O estado fica no PresentationModel A lógica fica no PresentationModel A Viewobserva o PresentationModel e atualiza de acordo com o mesmo O PresentationModelobserva o Model A View"conhece" o PresentationModel O PresentationModel"não conhece" a View Padrão recomendado pela Adobe com o novo Cairngorm 3. Padrão recomendado pela Microsoft para aplicações WPF e Silverlight com o nome de Model-View-ViewModel (MVVM)
Mais sobre o PresentationModel Um PresentationModel é uma "abstração" de uma View O PresentationModel representa o comportamento e o estado de uma View A View representa a projeção ou a renderização do PresentationModel na tela
ContatoDetalheView.mxml <fx:Script> <![CDATA[ import br.com.flexmania.event.ContatoEvent; import br.com.flexmania.event.ExibirTelaPrincipalEvent; import br.com.flexmania.model.presentation.ContatoDetalhePM; [Bindable] publicvarpm:ContatoDetalhePM; ]]> </fx:Script>
ContatoDetalhePM.as [Bindable] publicclassContatoDetalhePMextendsAbstractPM { publicvarisAtualizando:Boolean; publicvarcontatoAtual:ContatoVO; publicfunctionmanterContato(contato:ContatoVO):void   { ...   } ... AgendaFlexMania.mxml (Application) <presentation:ContatoDetalhePM id="contatoDetalhePM"  contatoAtual="{_model.contatoModel.contatoAtual}" isAtualizando="{_model.contatoModel.isAtualizando}"/>
E como é feito esse negócio da Viewobservar e representar o PresentationModel?
Simples!
Utilizando Data Binding!
Data Binding para o PresentationModel <fx:Script> ... [Bindable] publicvarpm:ContatosListaPM ... </fx:Script> <mx:DataGridwidth="100%" id="dgContato"               dataProvider="{pm.contatos}"  doubleClickEnabled="true"  change="pm.selecionarContato(dgContato.selectedItemasContatoVO);“ doubleClick="pm.exibirAtualizarContato(dgContato.selectedItemasContatoVO)"> <mx:columns> <mx:DataGridColumnheaderText="Nome" dataField="nome" width="40"/> ... </mx:columns> </mx:DataGrid>
Bidirecional (two-way) data binding do Flex 4 <fx:Declarations> <vo:ContatoVO id="contato" email="{pm.contatoAtual.email}"    nome="{pm.contatoAtual.nome}"   telefone="{pm.contatoAtual.telefone}" codigo="{pm.contatoAtual.codigo}"/> </fx:Declarations> <mx:Form width="100%" height="118" >  <mx:FormItemlabel="Nome">    <mx:TextInput width="236" id="txtNome" text="@{contato.nome}"/>  </mx:FormItem>  <mx:FormItemlabel="Telefone">    <mx:TextInput width="236" id="txtTelefone" text="@{contato.telefone}"/>  </mx:FormItem>  <mx:FormItemlabel="E-mail">    <mx:TextInput width="236" id="txtEmail" text="@{contato.email}"/>  </mx:FormItem> </mx:Form> <s:Button label="Submeter" width="93" click="pm.manterContato(contato)" />
Testabilidade Uma  vez que as classes PresentationModel são totalmente desacopladas da View, a lógica que elas contém são mais facilmente testadas.
Melhoria na separação de responsabilidades Se cada PresentationModel representa uma abstração de uma View, então, podemos considerar que a união dos PresentationModel  podem ser consideradas como o Modelo de toda sua User Interface. Comportamentos comuns de apresentação podem ser refatorados em classes base e compartilhada por todos os PresentationModel.
Classe base do PresentationModel publicclassAbstractPMextendsEventDispatcher { privatevarfirstShow:Boolean = true; protectedvardispatcher:IEventDispatcher = AppEventDispatcher.instance; publicfunctionhandleShow():void   { if(firstShow)     { handleFirstShow(); firstShow = false;     } else { handleSubsequentShows();     }    } publicfunctionhandleFirstShow():void   {     // to beoverriden   } publicfunctionhandleSubsequentShows():void   {     // to beoverriden   } }
E o quanto de estado e lógica devem ser extraídas da View?
Tanto quanto possível!
Exemplos Dados da View (ex. uma lista de produtos filtrada) O Estado da View (ex. o selectedIndex da ViewStack) Lógica da View (ex. determinar o estado de um botão em um form)
Mas certos tipos de lógica talvez seja melhor serem deixadas na View
Comportamento fortemente acoplados a parte gráfica ou ao framework como por exemplo animações e operações de Drag-and-Drop, são candidatas a ficarem na View
Abordagens do PresentationModel Hierárquica Componentizada
Hierárquica
Componentizada
Resposta à mudanças Hierárquica View 3 precisa ser movida para View 2
Resposta à mudanças Componentizada View 3 precisa ser movida para View 2
Arquitetura da Aplicação ViewLayer PresentationLayer DomainLayer IntegrationLayer Model View Business Delegate CMD PM Controller CMD Back-End CMD
Código por favor!!
Conclusão O PresentationModel é um padrão útil para aplicações Flex testáveis Ao mover o estado e a lógica usados na apresentação de dados e na manipulação de eventos do usuário para o PresentationModel, ele pode ser mais facilmente testado e entendido do que colocado diretamente na View no bloco Script. Como a interface com usuário é algo muito volátil é preferível utilizar a abordagem componentizada em vez da hierárquica
Referências Presentation Model, Martin Fowler, http://martinfowler.com/eaaDev/PresentationModel.html Presentation Patterns - Presentation Model, Paul Williams, http://blogs.adobe.com/paulw/archives/2007/10/presentation_pa_3.html Applying the Presentation Model in Flex, Tom Sugden, http://blogs.adobe.com/tomsugden/2009/08/applying_the_presentation_mode.html PresentationModel, Microsoft, http://msdn.microsoft.com/en-us/library/ff647585.aspx Flex Client Architecture & Best Practices, Børre Wessel - Adobe Consulting, http://blogs.adobe.com/borre/Flex_Client_Architecture_and_Best_Practices.pdf Flex Development with Cairngorm, Alistair McLeod, http://blogs.adobe.com/amcleod/2008/12/max_milan_-_fle.html Refatorando o ModelLocator do Cairngorm, Pablo Souza, http://blog.dclick.com.br/2008/11/16/refatorando-o-modellocator-do-cairngorm-parte-i/pt/
Obrigado! Eric Cavalcanti ecavalcanti@gmail.com @ericoc

Mais conteúdo relacionado

Destaque

Arte & Marketing, by Martha Gabriel no ProXXIma 2013
Arte & Marketing, by Martha Gabriel no ProXXIma 2013Arte & Marketing, by Martha Gabriel no ProXXIma 2013
Arte & Marketing, by Martha Gabriel no ProXXIma 2013Martha Gabriel
 
Europas BlaBlaCar pitch
Europas BlaBlaCar pitchEuropas BlaBlaCar pitch
Europas BlaBlaCar pitchVanina Schick
 
Some tips on selling from Ogilvy
Some tips on selling from OgilvySome tips on selling from Ogilvy
Some tips on selling from OgilvyOgilvyOne Worldwide
 
10 Disruptive Quotes for Entrepreneurs
10 Disruptive Quotes for Entrepreneurs10 Disruptive Quotes for Entrepreneurs
10 Disruptive Quotes for EntrepreneursGuy Kawasaki
 
26 Top Crowdfunding Sites (Infographic)
26 Top Crowdfunding Sites (Infographic)26 Top Crowdfunding Sites (Infographic)
26 Top Crowdfunding Sites (Infographic)Wrike
 
How To Assemble a High Converting eBook
How To Assemble a High Converting eBookHow To Assemble a High Converting eBook
How To Assemble a High Converting eBookUberflip
 
Pitching Ideas: How to sell your ideas to others
Pitching Ideas: How to sell your ideas to othersPitching Ideas: How to sell your ideas to others
Pitching Ideas: How to sell your ideas to othersJeroen van Geel
 
IQ Work Hacks - Productivity
IQ Work Hacks - ProductivityIQ Work Hacks - Productivity
IQ Work Hacks - ProductivityInterQuest Group
 
Social Proof Tips to Boost Landing Page Conversions
Social Proof Tips to Boost Landing Page ConversionsSocial Proof Tips to Boost Landing Page Conversions
Social Proof Tips to Boost Landing Page ConversionsAngie Schottmuller
 
Email Marketing 101: The Welcome Email
Email Marketing 101: The Welcome EmailEmail Marketing 101: The Welcome Email
Email Marketing 101: The Welcome EmailSendGrid
 
Business Model Design and Innovation for Competitive Advantage
Business Model Design and Innovation for Competitive AdvantageBusiness Model Design and Innovation for Competitive Advantage
Business Model Design and Innovation for Competitive AdvantageAlexander Osterwalder
 
The 10 Timeless Productivity Hacks
The 10 Timeless Productivity HacksThe 10 Timeless Productivity Hacks
The 10 Timeless Productivity HacksBernard Marr
 
Quick & Dirty Tips for : Better PowerPoint Presentations Faster
Quick & Dirty Tips for : Better PowerPoint Presentations FasterQuick & Dirty Tips for : Better PowerPoint Presentations Faster
Quick & Dirty Tips for : Better PowerPoint Presentations FasterEugene Cheng
 
The 150 Most Powerful Marketing & Sales Tools
The 150 Most Powerful Marketing & Sales ToolsThe 150 Most Powerful Marketing & Sales Tools
The 150 Most Powerful Marketing & Sales ToolsBrian Downard
 

Destaque (20)

PCE - Troia
PCE - TroiaPCE - Troia
PCE - Troia
 
Arte & Marketing, by Martha Gabriel no ProXXIma 2013
Arte & Marketing, by Martha Gabriel no ProXXIma 2013Arte & Marketing, by Martha Gabriel no ProXXIma 2013
Arte & Marketing, by Martha Gabriel no ProXXIma 2013
 
Alcoolha Mch 08
Alcoolha   Mch 08Alcoolha   Mch 08
Alcoolha Mch 08
 
Brand New World
Brand New WorldBrand New World
Brand New World
 
Europas BlaBlaCar pitch
Europas BlaBlaCar pitchEuropas BlaBlaCar pitch
Europas BlaBlaCar pitch
 
Some tips on selling from Ogilvy
Some tips on selling from OgilvySome tips on selling from Ogilvy
Some tips on selling from Ogilvy
 
10 Disruptive Quotes for Entrepreneurs
10 Disruptive Quotes for Entrepreneurs10 Disruptive Quotes for Entrepreneurs
10 Disruptive Quotes for Entrepreneurs
 
26 Top Crowdfunding Sites (Infographic)
26 Top Crowdfunding Sites (Infographic)26 Top Crowdfunding Sites (Infographic)
26 Top Crowdfunding Sites (Infographic)
 
How To Assemble a High Converting eBook
How To Assemble a High Converting eBookHow To Assemble a High Converting eBook
How To Assemble a High Converting eBook
 
The Ultimate Freebies Guide for Presentations by @damonify
The Ultimate Freebies Guide for Presentations by @damonifyThe Ultimate Freebies Guide for Presentations by @damonify
The Ultimate Freebies Guide for Presentations by @damonify
 
Pitching Ideas: How to sell your ideas to others
Pitching Ideas: How to sell your ideas to othersPitching Ideas: How to sell your ideas to others
Pitching Ideas: How to sell your ideas to others
 
IQ Work Hacks - Productivity
IQ Work Hacks - ProductivityIQ Work Hacks - Productivity
IQ Work Hacks - Productivity
 
Social Proof Tips to Boost Landing Page Conversions
Social Proof Tips to Boost Landing Page ConversionsSocial Proof Tips to Boost Landing Page Conversions
Social Proof Tips to Boost Landing Page Conversions
 
Email Marketing 101: The Welcome Email
Email Marketing 101: The Welcome EmailEmail Marketing 101: The Welcome Email
Email Marketing 101: The Welcome Email
 
Business Model Design and Innovation for Competitive Advantage
Business Model Design and Innovation for Competitive AdvantageBusiness Model Design and Innovation for Competitive Advantage
Business Model Design and Innovation for Competitive Advantage
 
Business Model Innovation Matters
Business Model Innovation MattersBusiness Model Innovation Matters
Business Model Innovation Matters
 
The 10 Timeless Productivity Hacks
The 10 Timeless Productivity HacksThe 10 Timeless Productivity Hacks
The 10 Timeless Productivity Hacks
 
Quick & Dirty Tips for : Better PowerPoint Presentations Faster
Quick & Dirty Tips for : Better PowerPoint Presentations FasterQuick & Dirty Tips for : Better PowerPoint Presentations Faster
Quick & Dirty Tips for : Better PowerPoint Presentations Faster
 
The 150 Most Powerful Marketing & Sales Tools
The 150 Most Powerful Marketing & Sales ToolsThe 150 Most Powerful Marketing & Sales Tools
The 150 Most Powerful Marketing & Sales Tools
 
How to Pitch B2B
How to Pitch B2BHow to Pitch B2B
How to Pitch B2B
 

Semelhante a Padrão PresentationModel em Aplicações Flex

Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Eric Gallardo
 
Desenvolvimento RIA com Silverlight 4
Desenvolvimento RIA com Silverlight 4Desenvolvimento RIA com Silverlight 4
Desenvolvimento RIA com Silverlight 4Rodrigo Kono
 
Desenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpDesenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpRodrigo Aramburu
 
Jsf – Java Sever Faces
Jsf – Java Sever FacesJsf – Java Sever Faces
Jsf – Java Sever Facesbielgott
 
Faça Sucesso Desenvolvendo com ASP.NET 4, ASP NET MVC e Visual Studio 2010
Faça Sucesso Desenvolvendo com ASP.NET 4, ASP NET MVC e Visual Studio 2010Faça Sucesso Desenvolvendo com ASP.NET 4, ASP NET MVC e Visual Studio 2010
Faça Sucesso Desenvolvendo com ASP.NET 4, ASP NET MVC e Visual Studio 2010Rodrigo Kono
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer FacesEduardo Bregaida
 
Apresentação mvc
Apresentação mvcApresentação mvc
Apresentação mvcleopp
 
Programação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com DojoProgramação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com Dojofabioginzel
 
Indo alem do_mvc_node_js
Indo alem do_mvc_node_jsIndo alem do_mvc_node_js
Indo alem do_mvc_node_jsgustavobeavis
 
Workshop soa, microservices e devops
Workshop soa, microservices e devopsWorkshop soa, microservices e devops
Workshop soa, microservices e devopsDiego Pacheco
 
Palestra MVC - Online tech day 2010
Palestra MVC - Online tech day 2010Palestra MVC - Online tech day 2010
Palestra MVC - Online tech day 2010Alexandre Tarifa
 
ASP.NET MVC Mini Curso
ASP.NET MVC Mini CursoASP.NET MVC Mini Curso
ASP.NET MVC Mini CursoVinicius Rocha
 

Semelhante a Padrão PresentationModel em Aplicações Flex (20)

Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Treinamento ASP.NET 2014
Treinamento ASP.NET 2014
 
Desenvolvimento RIA com Silverlight 4
Desenvolvimento RIA com Silverlight 4Desenvolvimento RIA com Silverlight 4
Desenvolvimento RIA com Silverlight 4
 
Mvc delphi
Mvc delphiMvc delphi
Mvc delphi
 
Desenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpDesenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephp
 
Asp.Net Mvc Dev Days09 V3 Pt
Asp.Net Mvc Dev Days09 V3 PtAsp.Net Mvc Dev Days09 V3 Pt
Asp.Net Mvc Dev Days09 V3 Pt
 
Jsf – Java Sever Faces
Jsf – Java Sever FacesJsf – Java Sever Faces
Jsf – Java Sever Faces
 
Faça Sucesso Desenvolvendo com ASP.NET 4, ASP NET MVC e Visual Studio 2010
Faça Sucesso Desenvolvendo com ASP.NET 4, ASP NET MVC e Visual Studio 2010Faça Sucesso Desenvolvendo com ASP.NET 4, ASP NET MVC e Visual Studio 2010
Faça Sucesso Desenvolvendo com ASP.NET 4, ASP NET MVC e Visual Studio 2010
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer Faces
 
Apresentação mvc
Apresentação mvcApresentação mvc
Apresentação mvc
 
Programação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com DojoProgramação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com Dojo
 
Indo alem do_mvc_node_js
Indo alem do_mvc_node_jsIndo alem do_mvc_node_js
Indo alem do_mvc_node_js
 
Workshop soa, microservices e devops
Workshop soa, microservices e devopsWorkshop soa, microservices e devops
Workshop soa, microservices e devops
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
Palestra MVC - Online tech day 2010
Palestra MVC - Online tech day 2010Palestra MVC - Online tech day 2010
Palestra MVC - Online tech day 2010
 
JavaServer Faces
JavaServer FacesJavaServer Faces
JavaServer Faces
 
Prog web 08-php-mvc
Prog web 08-php-mvcProg web 08-php-mvc
Prog web 08-php-mvc
 
ApresentaçãO Mvc
ApresentaçãO MvcApresentaçãO Mvc
ApresentaçãO Mvc
 
Apresentação M V C
Apresentação M V CApresentação M V C
Apresentação M V C
 
ASP.NET MVC Mini Curso
ASP.NET MVC Mini CursoASP.NET MVC Mini Curso
ASP.NET MVC Mini Curso
 
Asp net mvc
Asp net mvcAsp net mvc
Asp net mvc
 

Mais de Eric 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
 
Titanium Mobile - Campus Party Recife 2
Titanium Mobile - Campus Party Recife 2Titanium Mobile - Campus Party Recife 2
Titanium Mobile - Campus Party Recife 2Eric 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
 
Introdução ao Titanium Mobile
Introdução ao Titanium MobileIntrodução ao Titanium Mobile
Introdução ao Titanium MobileEric Cavalcanti
 
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 EnvironmentEric Cavalcanti
 
Desmistificando o cairngorm
Desmistificando o cairngormDesmistificando o cairngorm
Desmistificando o cairngormEric Cavalcanti
 
FireScrum - Ontem, Hoje e o Futuro
FireScrum - Ontem, Hoje e o FuturoFireScrum - Ontem, Hoje e o Futuro
FireScrum - Ontem, Hoje e o FuturoEric Cavalcanti
 

Mais de Eric Cavalcanti (13)

React Native - JSday
React Native - JSdayReact Native - JSday
React Native - JSday
 
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
 
Titanium Mobile - Campus Party Recife 2
Titanium Mobile - Campus Party Recife 2Titanium Mobile - Campus Party Recife 2
Titanium Mobile - Campus Party Recife 2
 
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
 
Agile
AgileAgile
Agile
 
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
 
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
 
Desmistificando o cairngorm
Desmistificando o cairngormDesmistificando o cairngorm
Desmistificando o cairngorm
 
FireScrum - Ontem, Hoje e o Futuro
FireScrum - Ontem, Hoje e o FuturoFireScrum - Ontem, Hoje e o Futuro
FireScrum - Ontem, Hoje e o Futuro
 
FireScrum Agiles2009
FireScrum Agiles2009FireScrum Agiles2009
FireScrum Agiles2009
 
FireScrum
FireScrumFireScrum
FireScrum
 

Padrão PresentationModel em Aplicações Flex

  • 1. Utilizando o Padrão PresentationModel em Aplicações Flex Eric Cavalcanti ecavalcanti@gmail.com @ericoc
  • 2. Sobre mim Eric Cavalcanti Mestre em Engenharia de Software pelo CESAR.EDU Certificado ScrumMaster pela ScrumAlliance Engenheiro de Software da ID S/A Background Trabalha com desenvolvimento de Software há mais de 10 anos . Instrutor Adobe Flex da Imedia Brasil. Professor no Curso de Especialização em Gestão Ágil de Projetos do CESAR.EDU e da Pós-Graduaçaõ em Front-EndEngineering & Design da Faculdade Marista Idealizador e principal desenvolvedor do projeto FireScrum (Flex e Java) Idealizador do FireKanban (Flex e Java)
  • 4. O Problema Geralmente uma View em um aplicação contém controles que exibem dados do domínio de sua aplicação. O usuário pode alterar os dados e submeter tais alterações.
  • 5. O Problema A View geralmente: recupera os dados do domínio manipula eventos dos usuários altera outros controles da View em resposta a tais eventos submete as alterações efetuadas nos dados do domínio.
  • 6. O Problema Incluir todo esse código na View pode torná-la uma classe complexa, difícil de manter e testar. Ocasionalmente, seria difícil compartilhar o código com uma outra View que necessita do mesmo comportamento.
  • 7. Motivação Você quer aumentar a cobertura dos seus testes unitários automáticos (Views são difíceis de testar automaticamente). Você quer compartilhar o código entre Views que necessitam do mesmo comportamento Você quer separar a lógica de negócio da lógica de interface do usuário (UI) para que o código fique mais fácil de entender e manter.
  • 8. Motivação Você quer permitir que o profissional de designer possa facilmente criar e modificar o visual da interface do usuário da sua aplicação. Os dados que você quer exibir necessitam de alguma conversão, validação ou formatação antes de serem exibidos na interface do usuário.
  • 11. O que é o PresentationModel?
  • 12. PresentationModel em uma frase! “É uma forma de mover o estado e a lógica da view para uma outra classe.”
  • 13. Uma imagem vale mais do que mil palavras! View PM Model ContatoDetalheView.mxml ContatoDetalhePM.as ContatoModel.as
  • 14. Principais características O estado fica no PresentationModel A lógica fica no PresentationModel A Viewobserva o PresentationModel e atualiza de acordo com o mesmo O PresentationModelobserva o Model A View"conhece" o PresentationModel O PresentationModel"não conhece" a View Padrão recomendado pela Adobe com o novo Cairngorm 3. Padrão recomendado pela Microsoft para aplicações WPF e Silverlight com o nome de Model-View-ViewModel (MVVM)
  • 15. Mais sobre o PresentationModel Um PresentationModel é uma "abstração" de uma View O PresentationModel representa o comportamento e o estado de uma View A View representa a projeção ou a renderização do PresentationModel na tela
  • 16. ContatoDetalheView.mxml <fx:Script> <![CDATA[ import br.com.flexmania.event.ContatoEvent; import br.com.flexmania.event.ExibirTelaPrincipalEvent; import br.com.flexmania.model.presentation.ContatoDetalhePM; [Bindable] publicvarpm:ContatoDetalhePM; ]]> </fx:Script>
  • 17. ContatoDetalhePM.as [Bindable] publicclassContatoDetalhePMextendsAbstractPM { publicvarisAtualizando:Boolean; publicvarcontatoAtual:ContatoVO; publicfunctionmanterContato(contato:ContatoVO):void { ... } ... AgendaFlexMania.mxml (Application) <presentation:ContatoDetalhePM id="contatoDetalhePM" contatoAtual="{_model.contatoModel.contatoAtual}" isAtualizando="{_model.contatoModel.isAtualizando}"/>
  • 18. E como é feito esse negócio da Viewobservar e representar o PresentationModel?
  • 21. Data Binding para o PresentationModel <fx:Script> ... [Bindable] publicvarpm:ContatosListaPM ... </fx:Script> <mx:DataGridwidth="100%" id="dgContato" dataProvider="{pm.contatos}" doubleClickEnabled="true" change="pm.selecionarContato(dgContato.selectedItemasContatoVO);“ doubleClick="pm.exibirAtualizarContato(dgContato.selectedItemasContatoVO)"> <mx:columns> <mx:DataGridColumnheaderText="Nome" dataField="nome" width="40"/> ... </mx:columns> </mx:DataGrid>
  • 22. Bidirecional (two-way) data binding do Flex 4 <fx:Declarations> <vo:ContatoVO id="contato" email="{pm.contatoAtual.email}" nome="{pm.contatoAtual.nome}" telefone="{pm.contatoAtual.telefone}" codigo="{pm.contatoAtual.codigo}"/> </fx:Declarations> <mx:Form width="100%" height="118" > <mx:FormItemlabel="Nome"> <mx:TextInput width="236" id="txtNome" text="@{contato.nome}"/> </mx:FormItem> <mx:FormItemlabel="Telefone"> <mx:TextInput width="236" id="txtTelefone" text="@{contato.telefone}"/> </mx:FormItem> <mx:FormItemlabel="E-mail"> <mx:TextInput width="236" id="txtEmail" text="@{contato.email}"/> </mx:FormItem> </mx:Form> <s:Button label="Submeter" width="93" click="pm.manterContato(contato)" />
  • 23. Testabilidade Uma vez que as classes PresentationModel são totalmente desacopladas da View, a lógica que elas contém são mais facilmente testadas.
  • 24. Melhoria na separação de responsabilidades Se cada PresentationModel representa uma abstração de uma View, então, podemos considerar que a união dos PresentationModel podem ser consideradas como o Modelo de toda sua User Interface. Comportamentos comuns de apresentação podem ser refatorados em classes base e compartilhada por todos os PresentationModel.
  • 25. Classe base do PresentationModel publicclassAbstractPMextendsEventDispatcher { privatevarfirstShow:Boolean = true; protectedvardispatcher:IEventDispatcher = AppEventDispatcher.instance; publicfunctionhandleShow():void { if(firstShow) { handleFirstShow(); firstShow = false; } else { handleSubsequentShows(); } } publicfunctionhandleFirstShow():void { // to beoverriden } publicfunctionhandleSubsequentShows():void { // to beoverriden } }
  • 26. E o quanto de estado e lógica devem ser extraídas da View?
  • 28. Exemplos Dados da View (ex. uma lista de produtos filtrada) O Estado da View (ex. o selectedIndex da ViewStack) Lógica da View (ex. determinar o estado de um botão em um form)
  • 29. Mas certos tipos de lógica talvez seja melhor serem deixadas na View
  • 30. Comportamento fortemente acoplados a parte gráfica ou ao framework como por exemplo animações e operações de Drag-and-Drop, são candidatas a ficarem na View
  • 31. Abordagens do PresentationModel Hierárquica Componentizada
  • 34. Resposta à mudanças Hierárquica View 3 precisa ser movida para View 2
  • 35. Resposta à mudanças Componentizada View 3 precisa ser movida para View 2
  • 36. Arquitetura da Aplicação ViewLayer PresentationLayer DomainLayer IntegrationLayer Model View Business Delegate CMD PM Controller CMD Back-End CMD
  • 38. Conclusão O PresentationModel é um padrão útil para aplicações Flex testáveis Ao mover o estado e a lógica usados na apresentação de dados e na manipulação de eventos do usuário para o PresentationModel, ele pode ser mais facilmente testado e entendido do que colocado diretamente na View no bloco Script. Como a interface com usuário é algo muito volátil é preferível utilizar a abordagem componentizada em vez da hierárquica
  • 39. Referências Presentation Model, Martin Fowler, http://martinfowler.com/eaaDev/PresentationModel.html Presentation Patterns - Presentation Model, Paul Williams, http://blogs.adobe.com/paulw/archives/2007/10/presentation_pa_3.html Applying the Presentation Model in Flex, Tom Sugden, http://blogs.adobe.com/tomsugden/2009/08/applying_the_presentation_mode.html PresentationModel, Microsoft, http://msdn.microsoft.com/en-us/library/ff647585.aspx Flex Client Architecture & Best Practices, Børre Wessel - Adobe Consulting, http://blogs.adobe.com/borre/Flex_Client_Architecture_and_Best_Practices.pdf Flex Development with Cairngorm, Alistair McLeod, http://blogs.adobe.com/amcleod/2008/12/max_milan_-_fle.html Refatorando o ModelLocator do Cairngorm, Pablo Souza, http://blog.dclick.com.br/2008/11/16/refatorando-o-modellocator-do-cairngorm-parte-i/pt/
  • 40. Obrigado! Eric Cavalcanti ecavalcanti@gmail.com @ericoc