<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CFGIGOLÔ &#187; Cairngorm</title>
	<atom:link href="http://www.cfgigolo.com/category/cairngorm/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cfgigolo.com</link>
	<description>Tecnologia no dos outros é refresco</description>
	<lastBuildDate>Tue, 17 Jan 2012 11:11:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Introdução ao Cairngorm</title>
		<link>http://www.cfgigolo.com/2008/07/introducao-ao-cairngorm/</link>
		<comments>http://www.cfgigolo.com/2008/07/introducao-ao-cairngorm/#comments</comments>
		<pubDate>Sat, 19 Jul 2008 17:07:58 +0000</pubDate>
		<dc:creator>Fabio Terracini</dc:creator>
				<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.cfgigolo.com/?p=1919</guid>
		<description><![CDATA[Nada como um post sobre Cairngorm e Flex para tirar um pouco de pó deste blog! Nos últimos tempos eu não tenho trabalhado com o Flex (e conseqüentemente nem com o Cairngorm&#8230;) mas eventualmente eu dou uma navegada na Internet em sites e blogs sobre esses assuntos para me manter informado e sentir aquela nostalgia.. [...]]]></description>
			<content:encoded><![CDATA[<p>Nada como um post sobre Cairngorm e Flex para tirar um pouco de pó deste blog! Nos últimos tempos eu não tenho trabalhado com o Flex (e conseqüentemente nem com o Cairngorm&#8230;) mas eventualmente eu dou uma navegada na Internet em sites e blogs sobre esses assuntos para me manter informado e sentir aquela nostalgia..</p>
<p>Enfim, o ponto é que a Adobe disponibilizou um treinamento do Cairngorm que é parte integrando do treinamento oficial. É um documento sucinto, com pouco mais de 40 páginas. Acredito que ele <b>não </b>deva ser utilizado como única fonte de informação sobre o assunto, mas é uma excelente introdução explicando inclusive oo propósito do Cairngorm (e não apenas sua codificação, como ocorre em outros tutoriais/artigos/etc).</p>
<p>Leia mais no post &#8220;<a href="http://www.adobe.com/devnet/flex/articles/introducing_cairngorm.html">Introducing Cairngorm</a>&#8221; no site da Adobe. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.cfgigolo.com/2008/07/introducao-ao-cairngorm/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Flex Coding Guidelines e Cairngorm</title>
		<link>http://www.cfgigolo.com/2008/03/flex-coding-guidelines-e-cairngorm/</link>
		<comments>http://www.cfgigolo.com/2008/03/flex-coding-guidelines-e-cairngorm/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 23:57:54 +0000</pubDate>
		<dc:creator>Fabio Terracini</dc:creator>
				<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.cfgigolo.com/?p=1913</guid>
		<description><![CDATA[Wojciech Jakub Ptak, um desenvolvedor Flex da Noruega com um nome um tanto complicado de se escrever, aproveitou o Adobe Flex Coding Guidelines que escrevi na DClick (que também conta versão em português) e estendeu o documento, acrescentando alguns tópicos interessantes. Achei fantástica a iniciativa de complementar o documento! Se ele concorda com o que [...]]]></description>
			<content:encoded><![CDATA[<p>Wojciech Jakub Ptak, um desenvolvedor Flex da Noruega com um nome um tanto complicado de se escrever, aproveitou o <a href="http://blog.dclick.com.br/2007/02/13/adobe_flex_coding_guidelines_english/">Adobe Flex Coding Guidelines</a> que escrevi na DClick (que também conta <a href="http://blog.dclick.com.br/2007/02/10/adobe-flex-coding-guidelines/">versão em português</a>) e <a href="http://nordicnets.com/main/?p=18">estendeu o documento, acrescentando alguns tópicos interessantes</a>.</p>
<p>Achei fantástica a iniciativa de complementar o documento! Se ele concorda com o que está ali, não há necessidade de criar algo completamente novo simplesmente para chamar de seu. Esse é um modelo, aliás, pelo qual outros documentos e artigos poderiam evoluir naturalmente.</p>
<p>Bem, ainda não li o documento que ele disponibilizou por inteiro, mas ele é basicamente o que está disponível no site da DClick com três tópicos novos: Adobe Cairngorm, E4X Guidelines e Regular Expressions.</p>
<p>Particularmente, embora eu acho interessante ter um &#8220;Cairngorm Coding Guidelines&#8221;, eu não acho que este deva estar dentro de um &#8220;Flex Coding Guidelines&#8221;. Fazendo assim, presume-se que o Cairngorm deve ser utilizado sempre que se utilizar o Flex, e isso não é todo verdade. Aliás, nenhum framework é tão perfeito e abrangente que resolve todos os problemas. Frameworks resolvem problemas específicos, então só os use se você tiver os problemas que ele visa resolver. Ou ainda, <a href="http://blog.dclick.com.br/2008/03/14/flex-e-o-mvc/#comments">como diz o Beck</a>, não se deve achar que um framwork sozinho é a solução, e sim que ele é apenas um ponto de partida.</p>
<p>Nessa linha, há um antigo post do Steven Webster que continua válido: <a href="http://weblogs.macromedia.com/swebster/archives/2006/08/why_i_think_you.cfm">Why I think you shouldn&#8217;t use Cairngorm</a>. Pensei que já havia publicado esse link auqi no CFGigolô, mas não o achei. De qualquer modo, a leitura é bem interessante, principalmente para os iniciantes em desenvolvimento.</p>
<p>Por favor, não me levem ao extremo: eu acho o Cairngorm fantástico e recomendo a todos os desenvolvedores que dêem uma olhada nele pois <a href="http://www.dclick.com.br">ele já se provou muito eficiente</a> e tive ótimas experiências com ele.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cfgigolo.com/2008/03/flex-coding-guidelines-e-cairngorm/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MVC: Model View Controller e os Três Macacos</title>
		<link>http://www.cfgigolo.com/2008/01/mvc-model-view-controller-e-os-tres-macacos/</link>
		<comments>http://www.cfgigolo.com/2008/01/mvc-model-view-controller-e-os-tres-macacos/#comments</comments>
		<pubDate>Mon, 07 Jan 2008 03:57:01 +0000</pubDate>
		<dc:creator>Fabio Terracini</dc:creator>
				<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Tecnologia]]></category>

		<guid isPermaLink="false">http://www.cfgigolo.com/?p=1902</guid>
		<description><![CDATA[Muito se fala sobre MVC, e no desenvolvimento de aplicativos em Flex comenta-se muito em relação a ele também. Embora o próprio modelo de desenvolvimento de aplicativos em Flex já possibilite o desenvolvimento de aplicativos em MVC, o advento de frameworks e micro-arquiteturas como o Cairngorm fomenta ainda mais a discussão sobre o MVC. E [...]]]></description>
			<content:encoded><![CDATA[<p>Muito se fala sobre MVC, e no desenvolvimento de aplicativos em Flex comenta-se muito em relação a ele também. Embora o próprio modelo de desenvolvimento de aplicativos em Flex já possibilite o desenvolvimento de aplicativos em MVC, o advento de frameworks e micro-arquiteturas como o Cairngorm fomenta ainda mais a discussão sobre o MVC.</p>
<p>E a estrutura para entender o MVC, uma vez que ele é um padrão de arquitetura (alguns o chamam de framework, de paradigma, etc.. mas acredito que chamá-lo de arquitetural seja mais significativo) é o mesmo do entendimento de um design pattern: entender o problema (que é a motivação para o surgimento de um padrão), entender o padrão, e por fim entender como o padrão resolve o nosso problema.</p>
<p>A partir do momento que o software começa a ficar grande e complexo demais e que muitos dados são apresentados para o usuário, sentimos a necessidade de separar os dados (model) da interface (a view), de modo que as mudanças na UI não mudem o modo como gerenciamos os dados. E isso é feito desacoplando (removendo a relação direta) da user interface do acesso aos dados através de um elemento adicional, o controller, que irá intermediar essa relação.</p>
<p>Assim, a responsabilidade de cada um dos três elementos fica bem definida:</p>
<p>O <b>Model</b> representa as informações do domínio do aplicativo (a Folha de Pagamento, por ex) e fornece funções para operar os dados (calcular o total da Folha, por ex.), isto é, ele que expõe as funcionalidade do aplicativo. O Model também é responsável por notificar a View quando os dados forem alterados.</p>
<p>A <b>View</b>, objetivamente, deve renderizar o Model e possibilitar a interação do usuário, bem como consultar ao Model quando este notificá-la de que houve alterações nos dados afim de manter a consistência entre ambos.</p>
<p>O <b>Controller</b>, o maestro da orquestra, responde às ações dos usuários (um clique, por exemplo), possibilita mudanças no Model (fazer uma requisição ao servidor e obter novos dados, por exemplo) e seleciona a View correspondente.</p>
<p>E deste modo, desacoplando a View do Model e com a separação de responsabilidade, reduz-se consideravelmente o nível de complexidade do software, permitindo também uma maior especialização e foco do desenvolvedor, algo de extrema importância hoje em dia com a necessidade cada vez maior de interfaces com o usuários mais efetivas.</p>
<p>Esse fluxo pode ser sintetizado conforme a imagem abaixo, cujo original é da Sun:</p>
<p><a href="http://www.cfgigolo.com/unsorted/mvc_diagrama_sun.jpg"><img alt="mvc_diagrama_sun.jpg" src="http://www.cfgigolo.com/unsorted/mvc_diagrama_sun-thumb.jpg" width="400" height="242" /></a></p>
<p>Um ponto importante aqui é não confundir o MVC com desenvolvimento em Três Camadas. Desenvolvimento em Três Camadas é uma arquitetura para softwares cliente-servidor, e as camadas representam sistemas distintos (camada de apresentação, camada de negócios e camada de dados, que podem, análoga e respectivamente, ser um aplicativo em Flex, o código Java no servidor e um banco de dados). E fundamentalmente a camada de apresentação nunca pode acessar os dados diretamente, isto é, deve passar pela camada intermediária (ou pelas camadas, já que há sistemas com mais de três camadas).</p>
<p>E embora MVC e Três Camadas pareçam significar a mesma coisa, o nível em que eles atuam é bem diferente. Enquanto o MVC trata do código do aplicativo propriamente dito, o desenvolvimento em Três Camadas refere-se a um nível topologicamente mais alto (entre os sistemas). Outra diferença vital é que em Três Camadas o fluxo é linear (da camada de apresentação para a de negócios, de negócios para dados, voltando de dados para negócios e de negócios para dados), em MVC é triangular (a View envia um comando para o Controller, que por sua vez atualiza o Model e a View é consulta os novos dados no Model). Portanto, não vamos confundir as coisas!</p>
<p>E as implementações em MVC variam de acordo com a linguagem, claro. Mas nada disso é realmente novo, e há algo mais que gostaria de apresentar aqui, agora que já estamos contextualizados.</p>
<p>Eu e Beck Novaes, quando trabalhávamos juntos em um projeto educacional e de treinamento em desenvolvimento em Adobe Flex e Cairngorm, criamos uma série de idéias e conceitos, dos quais uma delas era relacionada à MVC.</p>
<p>Você provavelmente já escutou a história dos Três Macacos Sábios, não é mesmo? Muito possivelmente associada a Gandhi, que sempre levava consigo os três totens dos macaquinhos.  Um os macacos está tampando os olhos, outro tampando os ouvidos e o terceiro tampando a boca, representando “não veja o mal, não ouça o mal, não fale o mal”.</p>
<p>Da mesma forma, apresento os <b>Macacos MVC</b> (ou MVC Monkeys para os gringos&#8230;):</p>
<ul>
<li>A <b>View é muda</b>, mas faz gestos (<i>user gestures</i>) para o Controller e escuta mudanças no Model;</li>
<li>O <b>Model é cego</b>, mas escuta o Controller e fala para a View sobre as  mudanças nele próprio;</li>
<li>O <b>Controller é surdo</b>, fala para o Model quando mudar de estado e vê os gestos da View.</li>
</ul>
<p><a href="http://www.cfgigolo.com/unsorted/mvc_monkeys.jpg"><img alt="mvc_monkeys.jpg" src="http://www.cfgigolo.com/unsorted/mvc_monkeys-thumb.jpg" width="400" height="284" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cfgigolo.com/2008/01/mvc-model-view-controller-e-os-tres-macacos/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Cairngorm &#8211; Parte 6</title>
		<link>http://www.cfgigolo.com/2006/03/cairngorm-parte-6/</link>
		<comments>http://www.cfgigolo.com/2006/03/cairngorm-parte-6/#comments</comments>
		<pubDate>Thu, 30 Mar 2006 11:01:29 +0000</pubDate>
		<dc:creator>Fabio Terracini</dc:creator>
				<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.cfgigolo.com/?p=1624</guid>
		<description><![CDATA[Essa é a sexta e última parte (parte 1, parte 2, parte 3, parte 4 e parte 5) do conjunto de artigos sobre o Cairngorm. Essa última parte apresenta um resumo sobre o funcionamento da microatquitetura proposta, bem como um interessante exemplo de implementação de uma nova funcionalidade no Cairngorm Store (o Flex Store convertido [...]]]></description>
			<content:encoded><![CDATA[<p>Essa é a sexta e última parte (<a href="http://www.cfgigolo.com/archives/2006/03/cairngorm_parte_1.html">parte 1</a>, <a href="http://www.cfgigolo.com/archives/2006/03/cairngorm_parte_2.html">parte 2</a>, <a href="http://www.cfgigolo.com/archives/2006/03/cairngorm_parte_3.html">parte 3</a>, <a href="http://www.cfgigolo.com/archives/2006/03/cairngorm_parte_4.html">parte 4</a> e <a href="http://www.cfgigolo.com/archives/2006/03/cairngorm_parte_5.html">parte 5</a>) do conjunto de artigos sobre o Cairngorm. Essa última parte apresenta um resumo sobre o funcionamento da microatquitetura proposta, bem como um interessante exemplo de implementação de uma nova funcionalidade no Cairngorm Store (o Flex Store convertido para o Cairngorm).</p>
<p>Novamente, reitero que é interessante ler o <a href="http://www.macromedia.com/devnet/flex/articles/cairngorm_pt6_print.html">artigo original de Steven Webster na íntegra</a> para um melhor entendimento. Essas sínteses apresentadas aqui no blog são apenas como referência e fazem parte de um estudo que conduzi com minha equipe atual. E nem estes devem ser considerados únicas fontes de informação de arquiteturas de aplicação &#8211; aspecto vital para um bom produto final.</p>
<p><span id="more-1624"></span><br />
<b>Cairngorm Architecture Review</b><br />
1. Front Controller espera User Gesture<br />
- Um User Gesture (clique, dragging, etc) disparam eventos no Cairngorm<br />
- EventBroadcast divulga o acontecemento do evento<br />
- FrontController está escutando por eventos, gerenciando &#8220;quem faz o quê&#8221;<br />
2. Commands realizam o trabalho<br />
- FrontController manda para o Command correspondente realizar o trabalho<br />
3. Delega lógica de negócio do servidor para o Business Delegate<br />
- Frequentemente o Command requer que o servidor realiza uma tarefa<br />
- Command não quer saber como, apenas que seja feito<br />
- Commands delegam a responsabilidade da lógico de negócio server-side para outra classe<br />
4. Localizar o serviço com o Service Locator<br />
- O Business Delegate provê uma interface entre o Command e qualquer serviço no servidor<br />
- Para o Delegate, não importa com o que está conectando-se<br />
- O detalhe da implementação dessse serviço está encapsulado no Service Locator<br />
- Service Locator é um diretório de serviços que a aplicação poderá utilizar<br />
- Resultado pode voltar para o onReult() ou o onFault() do Command que originou a chamada<br />
5. Transferir dados como Value Objects<br />
- Encapsular dados como VO que descrevem o que estes são dados em termos de negócio ao invés de termos técnicos<br />
6. Guardar estado no Model Locator e notificar a View<br />
- Model Locator armazena o estado da aplicação<br />
- Views possuem bindings (ligações) com o Model, de modo que atualizações no Model notificam a View para atualizar a interface com o usuário e refletir os novos dados</p>
<p><b>Cairngorm Flow of Control</b><br />
1. Nova funcionalidade na aplicação<br />
- Registrar o evento e o Command no Front Controller<br />
- Implementar um novo Command, com o execute() para realizar o trabalho, onResult() para gerenciar o resultado, atualizando o Model Locator<br />
- Adicionar novas chamadas a serviço necessárias no Business Delegate, que o novo Command por ventura faça uso<br />
- Se um novo serviço for necessário, cria-lo no Service Locator<br />
2. VOs<br />
- Criar VOs caso estes sejam necessários para passar dados do Command para o Business Delegate, e deste para o servidor, ou guardar no Model Locator<br />
- VOs possivelmente já existirão na aplicação e serão reutilizados<br />
3. Debugging<br />
- Verifique se o evento está registrado no Front Controller<br />
- Verifique se o execute() é chamado no Command pelo Controller<br />
- Verifique se o método apropriado do delegate está sendo chamado<br />
- Verifique se o onResult() do Command é chamado<br />
- Verifique se o estado é atualizado no Model Locator</p>
<p><b>In Perspective</b><br />
1. Entender os benefícios de construir uma RIA com a microarquitetura Cairngorm<br />
2. Benefícios demonstrados quando a aplicação cresce em termos de funcionalidades<br />
3. Decompor requerimentos de negócio em tarefas técnicas implementadas com o Cairngorm, ajudando a estimar custos e esforços<br />
4. Com o Cairngorm, desenvolvedores mais fácilmente podem tornar-se generalistas, aptos a implementar recursos através de toda a aplicação 5. Generalização (ao invés da especialização) significa melhor aproveitamento do skill da equipe, entre outros benefícios.<br />
6. Cairngorm não é o único modo de construir RIAs. Os conceitos podem ser utilizados de diferentes modos para resolver os problemas no desenvolvimento.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cfgigolo.com/2006/03/cairngorm-parte-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cairngorm &#8211; Parte 5</title>
		<link>http://www.cfgigolo.com/2006/03/cairngorm-parte-5/</link>
		<comments>http://www.cfgigolo.com/2006/03/cairngorm-parte-5/#comments</comments>
		<pubDate>Wed, 29 Mar 2006 14:20:02 +0000</pubDate>
		<dc:creator>Fabio Terracini</dc:creator>
				<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.cfgigolo.com/?p=1623</guid>
		<description><![CDATA[Dando seqüência à quarta parte, esta quinta e penúltima discute as implementações do Service Locator e do Business Delegate. Um dos principais pontos é que cada Command é de um use case, e ainda assim pode chamar o mesmo método no servidor, o que justifica o delegate (veja mais sobre as responsabilidade de cada pattern [...]]]></description>
			<content:encoded><![CDATA[<p>Dando seqüência à <a href="http://www.cfgigolo.com/archives/2006/03/cairngorm_parte_4.html">quarta parte</a>, esta quinta e penúltima discute as implementações do Service Locator e do Business Delegate. Um dos principais pontos é que cada Command é de um <i>use case</i>, e ainda assim pode chamar o mesmo método no servidor, o que justifica o delegate (veja mais sobre as responsabilidade de cada pattern do Cairngorm <a href="http://www.cfgigolo.com/archives/2005/10/cairngorm_framework_para_rias.html">nesse post</a>. Também é comentado sobre o desenvolvedor responsável pela integração com o server-side e o desenvolvedor do cliente.</p>
<p>Novamente, recomendo que o <a href="http://www.macromedia.com/devnet/flex/articles/cairngorm_pt5_print.html">artigo original</a> seja lido na íntegra para um melhor aproveitamento. Esse conjunto de posts é referente a um estudo realizado e não deve ser considerado única fonte de referência no assunto.</p>
<p><span id="more-1623"></span><br />
<b>Integrating with Flex RPC Services</b><br />
1. Desafio: qual funcionalidade deve ser executada no cliente e qual deve ser executada no servidor.<br />
- Impactos em performance, escalabilidade, segurança e experiência<br />
2. RIA resolve, integrando com o servidor de forma uniforme<br />
- Usuários não percebe o que é processado no servidor ou no cliente<br />
3. Mecanismos de integrar com dados server-side: Flex Remote Procedure Call (RPC) Services<br />
- HTTPService: XML ou strings simples<br />
- WebService: SOAP<br />
- RemoteObject: AMF, tradução de objetos do Java e do CF para AS.<br />
4. Muitos usos para um serviço e diferentes serviços<br />
- Cairngorm implementa dois patterns para esse gerenciamento</p>
<p><b>Locating Services with the Service Locator</b><br />
1. ServiceLocator é um repositório de todos os serviços que a RIA precisará<br />
- Centralizar e reutilizar os serviços<br />
2. Abstrai do desenvolvedor qual o tipo de serviço<br />
- Independe se é Java, WebService ou HTTP<br />
- Trata-os da mesma maneira<br />
- Encapsula os detalhes da implementação dos serviços<br />
3. Best practices<br />
- Named services: não expor ao cliente detalhes da implementação de conexão, por segurança<br />
- Sempre implementar um result e fault handler direcionando para quem os chamou<br />
4. Command poderia chamar diretamente o ServiceLocator, mas Cairngorm sugere mais uma camada de abstração</p>
<p><b>Proxying Services with the Business Delegate</b><br />
1. Um serviço (ou método getProducts(), por exemplo) pode ser chamado em diferentes lugares da aplicação<br />
- De modo que o resultado dessa chamada seja tratado de maneiras diferentes, dependendo do contexto que o serviço foi chamado<br />
- Ou seja, o Command é por Use Case, e diferentes Commands podem chamar o mesmo método no servidor, mas realizando tarefas distintas nos handlers de result e fault.<br />
2. Delegar a responsabilidade de lógica de negócio de localizar o servico e invocar o método no servidor em uma classe separada<br />
- Business Delegate<br />
3. Funcionamento<br />
- Command cria uma instância do Delegate, passando si próprio como construtor do Delegate<br />
- Desse modo, Delegate têm para quem passar o resultado, um &#8220;Responder&#8221;<br />
- Agindo como o Responder, o Command implementa a interface Responder<br />
- Métodos onResult() e onFault()<br />
4. Ponto de interface entre o cliente e o servidor<br />
- Separar a equipe responsável por implementações server-side e client-side.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cfgigolo.com/2006/03/cairngorm-parte-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cairngorm &#8211; Parte 4</title>
		<link>http://www.cfgigolo.com/2006/03/cairngorm-parte-4/</link>
		<comments>http://www.cfgigolo.com/2006/03/cairngorm-parte-4/#comments</comments>
		<pubDate>Tue, 28 Mar 2006 14:01:45 +0000</pubDate>
		<dc:creator>Fabio Terracini</dc:creator>
				<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.cfgigolo.com/?p=1622</guid>
		<description><![CDATA[Essa é a parte 4 do artigo (que contém exemplos práticos, baseados no Cairngorn Store). Este é referente a microarquitetura Service to Worker, que envolve os design patterns Front Controller, Event Broadcaster e Command, que em conjunto integram-se com o Model Locator e o Value Object. O original em inglês está disponível aqui. Um dos [...]]]></description>
			<content:encoded><![CDATA[<p>Essa é a parte 4 do artigo (que contém exemplos práticos, baseados no Cairngorn Store). Este é referente a microarquitetura Service to Worker, que envolve os design patterns Front Controller, Event Broadcaster e Command, que em conjunto integram-se com o <a href="http://www.cfgigolo.com/archives/2006/03/cairngorm_parte_2.html">Model Locator e o Value Object</a>. O original em inglês está disponível <a href="http://www.macromedia.com/devnet/flex/articles/cairngorm_pt4_print.html">aqui</a>.</p>
<p>Um dos maiores paradigmas desse estilo de desenvolvimento está nesse trecho do artigo: &#8220;No more scattering of business logic across an ever-growing ecosystem of MXML components. No more monolithic classes that state <i>&#8216;if the application just did this, then do that; but if it did this, then do the next thing&#8230;&#8217;</i>&#8221;</p>
<p><span id="more-1622"></span><br />
<b>Engaging in Rich Conversations</b><br />
1. Rich<br />
- Descreve uma melhor user experience do que a apresentada por aplicativos web tradicionais<br />
- Riqueza na interatividade: comunicação rica entre usuário e aplicativo<br />
2. Cairngorm<br />
- Utiliza uma colaboração de design patterns que a comunidade J2EE costuma utilizar para gerenciar a comunicação entre homem e máquina</p>
<p><b>The Service to Worker Microarchitecture</b><br />
1. Front Controller<br />
2. Event Broadcaster<br />
3. Command</p>
<p><b>Service to Worker: Mapping User Gestures and System Occurrences to Events</b><br />
1. Usuário executa features a partir de user gestures<br />
- Usuário ordena produtos clicando em um botão<br />
- Usuário filtra produtos ao arrastar o slider<br />
- Usuário adiciona produtos em um carrinho por arrastar o produto até omesmo.<br />
2. Desenvolvimento web tradicional<br />
- Cada característica requer um request HTTP<br />
- Processamento no servidor e refresh de página<br />
3. Execução sem user gesture<br />
- Pegar dados na inicialização da aplicação<br />
4. Cairngorm trata &#8220;user gestures&#8221; e &#8220;system events&#8221; do mesmo modo: &#8220;Cairngorm Event&#8221;<br />
- User request agora são eventos internos que componentes podem transmitir quando reconhecerem um user gesture ou um system event.</p>
<p><b>Service to Worker: Listening for Events with the Front Controller</b><br />
1. Quando um user gesture indicar a execução de uma característica (executea feature), o Cairngorm requer o broadcast de um evento apropriado.<br />
2. Executing a feature: Command Pattern<br />
- Implementação em classes<br />
- Método execute() para um terceiro chamar a classe sem precisar saber o queeste faz.<br />
- Worker classes<br />
3. Command Classes (exemplo)<br />
- Interface Command obriga a ter um método execute(), que age como ponto de entrada: permite o Cairngorm executar o Command sem saber o que exatamente ele faz<br />
- execute() recebe um objeto do tipo Event, uma classes do Cairngorm que descreve o tipo do evento e dados associados.<br />
- Binding com o ModelLocator: user experience irá refletir as atualizações de acordo<br />
4. Helper Classes<br />
- Classes para retirar a lógica de negócios dos Commands<br />
- Extract class refactoring<br />
- Permite unit test<br />
5. Controller<br />
- Um conjunto de trabalhadores (workers) sem um responsável é muito ruim!<br />
- Controller garante que workers façam sem trabalho quando requerido<br />
- Ponto de entrada para todos os eventos no Cairngorm<br />
- Best practice: todos os eventos como constantes<br />
- Um broadcast errado de &#8220;addProduct&#8221; (como string) só será percebido como errado (e o certo era &#8220;addProductToCart&#8221; em tempo de execução. Utilizando variáveis constantes (ShopController.EVENT_ADD_PRODUCT) o erro será pego em tempo de compilação.</p>
<p><b>Service to Worker: Broadcasting Cairngorm Events with the Event Broadcaster</b><br />
1. Peça final é dar o broadcast destes eventos<br />
2. Singleton Event Broadcaster<br />
3. Best Practice: métodos simples que descrevem o broadcast de um evento em termos de negócio.<br />
4. Exemplo<br />
- Componente ProductDetails expõe o evento addProduct, que contém o produto e a quantidade que o user gesture adicionou.<br />
- Esse evento faz o broadcast para o FrontController utilizando o Event Broadcaster de uma constante (Controller.EVENT_ADD_PRODUCT_TO_CART)<br />
- Cairngorm chama AddProductToCartCommand, atualizando o ModelLocator<br />
- Integração do Service to Worker microarchitecture (Front Controller, Event Broadcaster e Command) com Model Locator e value Object</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cfgigolo.com/2006/03/cairngorm-parte-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cairngorm &#8211; Parte 3</title>
		<link>http://www.cfgigolo.com/2006/03/cairngorm-parte-3/</link>
		<comments>http://www.cfgigolo.com/2006/03/cairngorm-parte-3/#comments</comments>
		<pubDate>Mon, 27 Mar 2006 12:10:12 +0000</pubDate>
		<dc:creator>Fabio Terracini</dc:creator>
				<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.cfgigolo.com/?p=1620</guid>
		<description><![CDATA[Dando continuidade da série (parte 1, parte 2) esta terceira parte é referente à view. O original, de Steven Webster, no qual baseio esse estudo que conduzi com minha equipe, está aqui. Os pontos mais interessante foram as best practices sugeridas, dentre elas uma que sempre sugeri: nomes semânticos para os elementos (componentes, telas e [...]]]></description>
			<content:encoded><![CDATA[<p>Dando continuidade da série (<a href="http://www.cfgigolo.com/archives/2006/03/cairngorm_parte_1.html">parte 1</a>, <a href="http://www.cfgigolo.com/archives/2006/03/cairngorm_parte_2.html">parte 2</a>) esta terceira parte é referente à <i>view</i>. O original, de Steven Webster, no qual baseio esse estudo que conduzi com minha equipe, está <a href="http://www.macromedia.com/devnet/flex/articles/cairngorm_pt3_print.html">aqui</a>.</p>
<p>Os pontos mais interessante foram as best practices sugeridas, dentre elas uma que sempre sugeri: <b>nomes semânticos</b> para os elementos (componentes, telas e afins) &#8211; não me venha com nomes em código!; e a questão de <b>disparar eventos</b>, muito mais utilizado agora no Cairngorm 2 (e reformulado no Flex 2).</p>
<p><span id="more-1620"></span><br />
<b>Architecting the View</b><br />
1. User Experience deve:<br />
- Representar o estado atual da aplicação<br />
- Mostrar telas específicas<br />
- Renderizar o model<br />
2. Rich Internet Application<br />
- Comunicação entre o usuário e a aplicação<br />
- A melhor forma de comunicação é a bidirecional<br />
- User Experience &#8220;fala&#8221; para o usuário renderizando a view de acordo com o estado<br />
- User Experience &#8220;escuta&#8221; o que op usuário gostaria de fazer, e responde de acordo<br />
- User gesture</p>
<p><b>Binding the Model to the View</b><br />
1. Cairngorm garante que dados dinâmicos mostrados no MXML venham do ModelLocator, apenas.<br />
2. Model notifica a View da mudança através do data-binding<br />
- Desenvolvedor não precisa se preocupar em atualizar vários elementos para refletir mudança</p>
<p><b>Best Practices for MXML Development</b><br />
1. Desenvolver pensando em componentes<br />
- Fácil de criar componentes que extendem tags base<br />
- Significado semântico (ex: detalhe do produto): facilidade de ler código, inclusive de outros<br />
2. Acople os componentes mas não fixe-os<br />
- Crie seus eventos que descrevam o que está ocorrendo no nível do usuário (não no nível do Flex)<br />
- De &#8220;click=&#8221; para &#8220;ocorreu o evento productAdded&#8221;<br />
- Clareza em pontos de integração</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cfgigolo.com/2006/03/cairngorm-parte-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cairngorm &#8211; Parte 2</title>
		<link>http://www.cfgigolo.com/2006/03/cairngorm-parte-2/</link>
		<comments>http://www.cfgigolo.com/2006/03/cairngorm-parte-2/#comments</comments>
		<pubDate>Sun, 26 Mar 2006 22:04:45 +0000</pubDate>
		<dc:creator>Fabio Terracini</dc:creator>
				<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.cfgigolo.com/?p=1619</guid>
		<description><![CDATA[Na seqüência do primeiro artigo, essa segunda parte discute os desafios do desenvolvimento das RIAs, e foca no primeiro deles: manter o estado no cliente, e discute a solução desses problemas com os patterns VO (ou DTO, Data Transfer Object) e ModelLocator. O original no qual esse estudo é baseado está disponível do Developer Center. [...]]]></description>
			<content:encoded><![CDATA[<p>Na seqüência do <a href="http://www.cfgigolo.com/archives/2006/03/cairngorm_parte_1.html">primeiro artigo</a>, essa segunda parte discute os desafios do desenvolvimento das RIAs, e foca no primeiro deles: manter o estado no cliente, e discute a solução desses problemas com os patterns VO (ou DTO, Data Transfer Object) e ModelLocator.</p>
<p>O original no qual esse estudo é baseado está <a href="http://www.macromedia.com/devnet/flex/articles/cairngorm_pt2_print.html">disponível do Developer Center</a>.</p>
<p><span id="more-1619"></span><br />
<b>Cairngorm Store</b><br />
1. Flex Store<br />
- Aplicação de demonstração<br />
2. airngorm Store<br />
- Reconstruído utilizando o Cairngorm<br />
- Rápido, escalável e de fácil manutenção</p>
<p><b>The Cairngorm Store: Four Key Challenges</b><br />
1. Visões de um desenvolvimento de aplicação<br />
- Como solução de problema de negócio<br />
- Sistema que implementa a solução<br />
- Arquitetura técnica para software customizado<br />
- Nível detalhada de implementação das classes<br />
2. Quatro desafios principais de alto nível<br />
- Manter estado (state) no cliente<br />
- Arquitetar a visualização<br />
- Desenvolvimento baseado em requerimentos (FDD, modelo de desenvolvimento ágil)<br />
- Invocar serviços de servidores</p>
<p><b>Keeping State on the Client</b><br />
1. Em RIAs, o cliente mantém estados<br />
- Web tradicional era request/response, com uso de cookies, sessão, etc.<br />
2. MVC<br />
- O cliente mantém os dados<br />
- O state é o Model: objetos que têm significado<br />
- Mapas: o object model contém ruas, rotas, referências, postos de gasolina, etc.<br />
3. Sincronização<br />
- Um estado no cliente normalmente reflete o estado em outra ponta (o servidor)<br />
- No desenvolvimento de aplicações server-side, o estado está entre duas camadas: business e integration tier<br />
- No desenvolvimento de aplicações enterprise, o sistema é apresentado através de um middle-tier (ou business tier): manter o estado entre as camadas<br />
- Manter o estado é complicado pois a representação relacional em uma ponta (banco de dados, por exemplo) é diferente da outra, com objetos (Java, por ex).<br />
- Problema de consistência: manter o mesmo dado em dois lugares<br />
- Problemas de concurrency, lock, transactions, rollbacks, etc.<br />
- Desenvolvimento RIA: model do business tier ser igual ao presentation tier<br />
- Basta um Object model consistente!<br />
4. Value Object ou Data Transfer Object Pattern<br />
- Representar &#8220;coisas&#8221; e seus valores<br />
- Estrutura intercambiável entre as camadas<br />
- Transformação de dados de significados técnicos (RecordSets, ResultSets, Data Sets) em objetos com significados de negócio (pessoas, mapas, etc)<br />
- Coleção de atributos que descreve uma entidade</p>
<p><b>Keeping a Consistent Object Model Between Flex and Java</b><br />
1. Tradução automática entre VOs do Flex e do Java<br />
2. XDoclet cria VOs em ActionScript baseados no Java<br />
3. VOs permitem:<br />
- Best practice em representar dados no cliente com significados do object model<br />
- Manter consistência do object model no cliente e no servidor<br />
- Utilizar a capacidade do Flex em traduzir VOs entre o Java e o ActionScript</p>
<p><b>Binding the Model and View Together</b><br />
1. R do RIA: Apresentar dados de maneira rica e profunda<br />
2. Databinding<br />
- Mudanças na origem refletem no destino<br />
- Dados e visualização, por exemplo<br />
- Model e View<br />
3. &#8220;Responsiveness&#8221; à mudanças no Model<br />
4. Dificuldade em variáveis de dados intercambiáveis entre diferentes contextos da aplicação</p>
<p><b>Enter the Model Locator Pattern</b><br />
1. Lugar único onde o state é guardado, e Views podem achar os dados<br />
2. Uso do databinding<br />
3. Variáveis estáticas, singleton</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cfgigolo.com/2006/03/cairngorm-parte-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cairngorm &#8211; Parte 1</title>
		<link>http://www.cfgigolo.com/2006/03/cairngorm-parte-1/</link>
		<comments>http://www.cfgigolo.com/2006/03/cairngorm-parte-1/#comments</comments>
		<pubDate>Sat, 25 Mar 2006 19:37:44 +0000</pubDate>
		<dc:creator>Fabio Terracini</dc:creator>
				<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.cfgigolo.com/?p=1618</guid>
		<description><![CDATA[O Cairngorm é uma micro-arquitetura de desenvolvimento para RIAs em Flex, e um projeto opensource e tem sido considerado pela comunidade uma excelente solução para os problemas recorrentes de desenho de RIAs. Essa é a primeira parte é de um conjunto de seis posts baseados nos artigos do Steven Webster no Flex Developer Center. Procurando [...]]]></description>
			<content:encoded><![CDATA[<p>O Cairngorm é uma micro-arquitetura de desenvolvimento para RIAs em Flex, e um projeto <a href="http://www.iterationtwo.com/open_source_cairngorm.html">opensource</a> e tem sido considerado pela comunidade uma excelente solução para os problemas recorrentes de <a href="http://www.cfgigolo.com/archives/2005/10/cairngorm_framework_para_rias.html">desenho de RIAs</a>.</p>
<p>Essa é a primeira parte é de um conjunto de seis posts baseados nos artigos do Steven Webster no <a href="http://www.macromedia.com/devnet/flex/">Flex Developer Center</a>.</p>
<p>Procurando orientar a comunidade sobre as melhores práticas do uso do Cairngorm, Steven Webster escreveu um conjunto de seis artigos no <a hre="http://www.macromedia.com/devnet/flex/">Flex Developer Center</a> sobre o Cairngorm, projeto do qual ele faz parte.</p>
<p>Esse post é referente à <a href="http://www.macromedia.com/devnet/flex/articles/cairngorm_pt1_print.html">primeira parte do artigo</a>, com os principais pontos traduzidos de forma livre, a fim de conduzir a equipe com quem trabalho hoje sobre as melhores práticas de desenvolvimento de RIAs.</p>
<p>Ou seja, aqui estão apenas alguns dos pontos que eu anotei como sendo importantes na hora de transmitir essa informação à equipe, de modo que a leitura completa dos artigos (bem mais completo do que as sínteses que irei apresentar) é bastante proveitosa.</p>
<p>Um dos pontos chaves dessa primeira parte é no final, em que ele discute que o Cairngorm não é a solução de todos os problemas, embora por experiência ele tem atendido muito bem.Frequentemente me perguntam qual o melhor framework para ColdFusion: Mach II, FuseBox, ModelGlue, Tartan, etc. Não há um melhor, claro, pois cada um deles pretende resolver problemas específicos de arquitetura, desenho e eventualmente de camadas.</p>
<p><span id="more-1618"></span><br />
<b>Frameworks</b><br />
1. Application Frameworks<br />
- Class libraries<br />
- Componentes<br />
- Provê funcionalidades básicas, flexíveis e integráveis.<br />
2. Architectural Frameworks<br />
- Esqueleto de aplicação<br />
- Estrutura arquitetônica para construir aplicações sobre.</p>
<p><b>Design Patterns</b><br />
1. Pattern: Solução de engenharia para problema específico e recorrente.<br />
- Exemplo: apenas uma instancia dessa classe (Singleton)<br />
2. Pattern overload: cuidado com o excesso desvairado e abdicação extrema de responsabilidade.</p>
<p><b>Microarquitetura</b><br />
1. Problema maior e mais genérico<br />
- Intercepectar um user gesture e certificar que a classe responsável sssuma a responsabilidade<br />
2. Microarquitetura = conjunto de design patterns<br />
3. Cairngorm: architectural framework (óbvio)<br />
- Desafios da contrução de RIas<br />
- Ponto de partida para artquitetura de RIAs, visando resolver problemas frequentes anteriormente já resolvidos.</p>
<p><b>Cairngorm</b><br />
1. iteration::two<br />
2. Livro eality J2EE: Architecting for Macromedia Flash MX<br />
3. Flex, com sua linguagem declarativa, possibilitou soluções mais elegantes que as apresentadas anteriormente</p>
<p><b>Ensinamentos do Cairngorm</b><br />
1. Gerenciar user gestures no cliente<br />
2. Encapsular lógicas de negócio (e interação com servidor)<br />
3. Gerenciamento de estados da aplicação e sua representação na UI</p>
<p><b>Estágio atual do Cairngorm</b><br />
1. Versão 0.99<br />
2. Versão 2.0 em conjunto com Flex 2 (iteration::two agora é Adobe Consulting)<br />
- Versão muito similar, mas aproveita novas funcionalidades.<br />
3. Cairngorm *não* é a única maneira de construir RIAs em Flex<br />
- Frameworks resolvem problemas. Que problemas você tem?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cfgigolo.com/2006/03/cairngorm-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cairngorm 2 Alpha</title>
		<link>http://www.cfgigolo.com/2006/02/cairngorm-2-alpha/</link>
		<comments>http://www.cfgigolo.com/2006/02/cairngorm-2-alpha/#comments</comments>
		<pubDate>Thu, 02 Feb 2006 13:43:32 +0000</pubDate>
		<dc:creator>Fabio Terracini</dc:creator>
				<category><![CDATA[Cairngorm]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.cfgigolo.com/?p=1593</guid>
		<description><![CDATA[E o pessoal da Adobe Consulting já disponibilizou a versão Alpha da nova versão do Cairngorm, para desenvolvimento de aplicativos em Flex. Uma versão interessante, com algumas novidades, principalmente na utilização do ModelLocator e no tratamento de eventos, não mais com o EventBroadcaster e sim sugerindo ao desenvolvedor que crie seus próprios eventos e os [...]]]></description>
			<content:encoded><![CDATA[<p>E o pessoal da Adobe Consulting já disponibilizou <a href="http://www.richinternetapps.com/">a versão Alpha</a> da nova versão do <a href="http://www.cfgigolo.com/archives/2005/10/cairngorm_framework_para_rias.html">Cairngorm</a>, para desenvolvimento de aplicativos em Flex.</p>
<p>Uma versão interessante, com algumas novidades, principalmente na utilização do ModelLocator e no tratamento de eventos, não mais com o EventBroadcaster e sim sugerindo ao desenvolvedor que crie seus próprios eventos e os &#8220;dispare&#8221; utilizando o novo modelo de eventos do Flash (com dispatchEvent()).</p>
<p>A equipe responsável por esta nova versão pede o feedback da comunidade na lista <a href="http://groups.yahoo.com/groups/flexcoders">FlexCoders</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cfgigolo.com/2006/02/cairngorm-2-alpha/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

