Adobe Flex
Palestra Flex + PHP usando Zend Amf (Flex Mania)
09/07/09
Olá pessoal! Já está disponível a gravação da minha palestra sobre Flex + PHP usando Zend Amf no grande evento da Flex Mania. Peço desculpas pelo nervosismo, mas esta foi minha primeira palestra e tentei focar no objetivo que era integrar o Flex e PHP com o Zend Amf.
Os slides e o app de exemplo segue abaixo para download.
Agradeço a todos que me apoiaram e ao Igor Costa que me deu esta oportunidade para participar de um grande evento como foi o Flex Mania.
Acesse minha palestra aqui: http://tinyurl.com/lnphvc
Slides: http://tinyurl.com/m52dh6
App: http://tinyurl.com/m5xbrx
Também não percam as outras palestras do Flex Mania… é imperdível!!! Acesse e Assista: www.flexmania.com.br
Compreendendo a Arquitetura de uma Rich Internet Application
14/06/09
Se você está usando Flex, Ajax, Silverlight, JavaFx, ou outras tecnologias de RIA, a arquitetura básica vai ser muito semelhante… Na maioria dos casos você normalmente terá uma aplicação cliente osiosa e uma camada de serviços distintos no backend. É importante entender essa diferenciação e para compreender que este desempenha um papel importantíssimo na forma como você projeta e constroi suas aplicações.
RIA se presta mais ao desenvolvimento de cliente-servidor, do que o tradicional desenvolvimento web onde o estado é mantido no servidor em uma aplicação ou sessão. O cliente deste modo sabe de si mesmo, e tipos de dados que está solicitando. Será solicitado apenas os dados que precisa do servidor e nada mais. Isto leva frequentemente a uma camada de serviços mais limpa e menos complicado a requisição do servidor, ainda, em alguns casos, uma redução global de carga no servidor.

É também importante compreender a sub-arquiteturas dentro da arquitetura global da aplicação. Na imagem acima, você tem a comunicação do cliente com o servidor através de camada de serviços. Se você estiver usando AMF, XML sobre HTTP, JSON, ou SOAP, não faz nenhuma diferença neste assunto. Há prós e contras de cada uma dessas citadas e que pode ser discutido no futuro, mas agora estou focado na própria arquitetura. Cada componente da arquitetura, tem uma maior dimensão da sua própria arquitetura. Você pode ouvir pessoas discutindo o uso do MVC em suas aplicações, mas a interpletação do MVC depende de quem está fazendo e essa pessoa explicar de que forma está usando o padrão.
Model-View-Controller (MVC) é um padrão de arquitetura de software onde uma aplicação é quebrada dentro de camadas separadas para um modelo de dados, a interface do usuário (visão), e a lógica do negócio. A lógica, modelo e visões são desacopladas, e comunicam através de um controlador intermediario. Esse padrão permite completamente ambas abstração da lógica e reuso do código/componentes da aplicação. Você pode ler mais sobre MVC aqui.
Num desenvolvimento web tradicional, houve basicamente um MVC singular. Onde as páginas solicitadas fosse manipuladas por um controlador, qual delega como uma página é processada e como os dados são inseridos dentro da visão (ou como dados são recuperados dentro do modelo).
No mundo da RIA, você realmente tem duas camadas de MVC. Existe um MVC dentro da própria aplicação cliente, e um MVC no backend também. Nem todas as aplicações utiliza um MVC formal ou um super framework para manipular o cliente e serviços, mas cada lado tem pelo menos um tipo de funcionalidade do MVC.
O MVC no cliente gerencia a interação entre o usuário e sua interface. Você invoca comandos, atualizações das visões, carrega os dados e etc… O MVC cliente mantém o estado da aplicação, manipula todas as requisições de dados do servidor e controla como os dados são apresentados na visão.
O MVC no servidor manipula as requisições através do cliente. A camada de serviços do MVC, processa as requisições de uma aplicação cliente e delega ações para o servidor. Isto pode significar o salvamento dos dados em um banco de dados, atualizando o sistema de arquivos, algum tipo de tratamento analítico, ou retornando dados para o servidor. A grande diferença aqui é que não existe qualquer interface do usuário. Em vez da interface do usuário, o ponto de vista seria o formato dos dados que está sendo devolvido a aplicação cliente. Neste caso o ponto de vista poderia determinar o formato do resultado (JSON, XML, etc…). Outro benefício de uma camada de serviço diferenciada, é que você já pode ter a infra-estrutura construída para criar uma API pública em cima de suas lógicas de serviços, se você tiver a necessidade (ou vontade) para manter uma.
Não já escolha definitiva da tecnologia para RIA. Você pode fazer muitas coisas legais com muitas tecnologias diferentes. Backends podem ser escritos em Java, ColdFusion, PHP, Rails, .NET, etc… No lado cliente, são estabelecidos frameworks MVC para Flex/Actionscript e Ajax, alguns emergentes, para o Silverlight, e adaptando para frameworks Java para JavaFX. A determinação de ambos, back-end e front-end, deve ser determinada pelas necessidades e capacidades de sua aplicação e também de sua infra-estrutura existente.
Post original de Andrew Trice. Veja aqui.
Sim! Flash Builder 4 + Flash Catalyst
01/06/09
Segunda-feira, 1º de junho e não 1º de abril hehe, finalmente saiu o tal do Flash Builder, que era dúvida até algumas semanas atrás e junto com ele também está disponível para download o Flash Catalyst.
Ambos na versão Beta, podem ser baixados pelo site da Adobe Labs (http://labs.adobe.com/).
O Flex Builder foi renomeado para Flash Builder na versão 4, para distinguir entre a IDE que é paga e o framework Flex que é open-source.
O Flash Catalyst como muitos já devem ter ouvido falar, é uma ferramenta para integrar os trabalhos de um Designer de Interação ao Desenvolvedor, ou seja, os prototipos feitos no Adobe Photoshop/Adobe Fireworks/Adobe Flash/Adobe Illustrator podem ser exportados para o Flash Builder 4 e gerar todo o código para que o desenvolvedor prossiga o trabalho que o Designer fez sem perder nenhum recurso criado por ele.
Bom pessoal são 2 ferramentas poderosas e agora basta aproveitar a oportunidade e dar um feedback para Adobe, para que ela continue sempre facilitando nossas vidas.
Abraços e boa semana a todos.
Resta dúvida ainda para que usar Flex?
28/05/09
Olá galera, tudo bem? Espero que sim. Bom vim à este post dizer que estava passeando pelo AIR Developer Center e logo de cara vi um grande exemplo chamado SalesBuilder feito em AIR e resolvi entrar. Bom visualizei o vídeo e fiquei impressionado com a riqueza de recursos, obviamente a cara de uma típica aplicação RIA.
Mas não foi só ela que me deixou impressionado e sim que logo abaixo tinha disponível o código fonte para download. Realmente é o melhor exemplo que já vi, e ainda com a possibilidade de explorar o código fonte e aprender novos recursos. Então acredito que vale a pena compartilhar para quem ainda não viu.
Segue abaixo o link desse belo exemplo:
SalesBuilder Adobe AIR sample aplication
Depois de ver o exemplo ainda resta uma dúvida. Porque usar Flex hein? Hehehe
Abraços pessoal e até a próxima!
Guia de estudos Adobe Flex (Recursos Online)
25/05/09
Olá pessoal, estou aqui para mais um post e hoje compartilharei uma dica para os novos amigos que estão iniciando no Adobe Flex e tem dificuldade de encontrar materiais para estudo.
Bom claro que a primeira dica e acredito que todos sabem é efetuar uma busca no Google, antes de tudo ele poderá te salvar, mas tem um porém, que as vezes a gente quer algo que siga uma sequencia de estudos sem se perder no conteúdo novo que estamos aprendendo. Para isso resolvi fazer um guia para meus estudos e claro estou compartilhando para vocês.
Antes de trabalhar com uma nova linguagem eu gosto de entender desde a história dela até seus recursos, objetivos, vantagens e desvantagens. Para isso a Adobe tem de sobra em seu site, então tomei como base dos meus estudos Flex em cima do site oficial da Adobe.
Segue abaixo o meu Guia de Estudos:
Saiba mais sobre o produto Adobe Flex:
http://www.adobe.com/br/products/flex/?promoid=BOZRZ
Visão Geral do Flex
http://www.adobe.com/br/products/flex/overview/
1 – Benefícios do Flex 3
http://www.adobe.com/br/products/flex/features/flex3/
2 – Estrutura do Flex
http://www.adobe.com/br/products/flex/features/flex_framework/
3 – Detalhes de Atualização Flex Builder 3
http://www.adobe.com/br/products/flex/upgrade/
4 – Recursos do Flex Builder 3
http://www.adobe.com/br/products/flex/features/flex_builder/
5 – Fluxo de trabalho do designer/desenvolvedor
http://www.adobe.com/br/products/flex/workflow/
6 – Saiba mais sobre BlazeDS
http://opensource.adobe.com/wiki/display/blazeds/BlazeDS/
Saiba mais sobre RIAs e a Plataforma da Adobe.
Vantagens, Porque usar RIAs?, Relatórios de Analistas, etc.
http://www.adobe.com/br/resources/business/rich_internet_apps/
Guia de aprendizado (Flex Learning Paths)
http://www.adobe.com/devnet/flex/learn/
Suporte do Flex
Documentação, Tutoriais, Guias de aprendizados, Artigos e etc.
http://www.adobe.com/support/flex/
Centro de desenvolvimento do Flex
Exemplos, Artigos, Guias de aprendizados, documentação e etc.
http://www.adobe.com/devnet/flex/
Bom este é o guia que criei para meus estudos Flex, destaco bastante o Guia de aprendizado (Flex Learning Paths) que contém passo a passo como você pode aprender Flex e tem desde teoria à prática, realmente recomendo.
Claro eu tomei base o conteúdo oficial da Adobe, mas você pode simplesmente procurar por blogs e muitos sites de referencia para somar aos seus estudos.
Espero que gostem do conteúdo e também aceito sugestões, sintam-se a vontade em comentar.
Abraços até mais galera.
Flash Builder? Será mesmo?!
18/05/09
Iniciando mais uma semana de maio e me deparo com a seguinte notícia na lista FlexDev, “Novo nome do Flex Builder”, será?!
Pois é não vi nada oficial vindo da Adobe, mas dizem que a notícia vem sendo comentada pelos envagelistas da Adobe e que queiram ou não o nome Flex Builder vem trazendo confusão para algumas pessoas que acham que Flex é uma nova linguagem e não lembram que é um framework aonde desenvolvemos em ActionScript 3.0 e MXML, para outros mudar o nome para Flash Builder trará a mesma repercusão pois vão pensar que estaremos desenvolvendo animações berrantes em vez de criar RIAs.
Nem vou discutir muito agora, mas até então não passa de boatos e é bom estar de olho no futuro do Flex.
Deixarei para vocês a discussão nos blogs abaixo e na própria thread da lista do FlexDev:
Integrando Flex + Zend Framework (Usando o Quickstart da Zend) – PARTE 3
18/05/09
Olá pessoal, na Parte 2 tinha mostrado como criar o componente Zend AMF para comunicarmos com o Flex. Então vamos ao Flex e dar a continuidade a essa integração.
No seu Eclipse, selecione a perspectiva Flex Development e logo clique com o direito do mouse sobre o projeto PHP ZendFrameworkQuickstart. No menu selecione Flex Project Nature > Add Flex Project Nature, conforme a imagem abaixo.

No nosso projeto não será necessário selecionar a tecnologia, pois não iremos rodar o projeto diretamente do Eclipse e sim diretamente pelo browser, como pode ver a imagem abaixo.
Prosseguindo coloque o seu Output Folder a pasta public, aonde acessaremos diretamente nossa aplicação Flex.
Clicando em Finish será criado a pasta “src” dentro do projeto e abrirá o arquivo ZendFrameworkQuickstart.mxml. Caso ocorra algum erro no Eclipse de “Cannot create HMTL wrapper…” que não criou a pasta “html-template”, clicamos com o botão direito em cima da linha do erro e selecionamos a opção “Recreate HTML Templates”.

Na Application ZendFrameworkQuickstart criamos um simples botão e em seguida criaremos um RemoteObject no próprio MXML.
ZendFrameworkQuickstart.mxml
1 2 3 4 5 6 7 8 9 10 | <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:RemoteObject id="ro" destination="zend" endpoint="http://localhost/guestbook/gateway/amf" source="HelloFlexService" /> <mx:Button label="Chamar PHP" verticalCenter="0" horizontalCenter="0" /> </mx:Application> |
Veja o código acima, criei o RemoteObject passando o Endpoint com a url “http://localhost/guestbook/gateway/amf” que nada mais é a nossa action que configuramos o componente Zend AMF para se comunicar com o Flex, também foi adicionado a propriedade “source” com o nome da classe PHP que desejamos chamar, neste caso é a “HelloFlexService”.
Feito isso, vamos colocar uma ação de click no Botão e iremos chamar o método “helloFlex” que está na classe “HelloFlexService”.
ZendFrameworkQuickstart.mxml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ import mx.controls.Alert; public function chamarPhp():void{ //chama o método helloFlex ro.helloFlex(); } ]]> </mx:Script> <mx:RemoteObject id="ro" destination="zend" endpoint="http://localhost/guestbook/gateway/amf" source="HelloFlexService" result="Alert.show(event.result.toString())" /> <mx:Button label="Chamar PHP" click="chamarPhp()" verticalCenter="0" horizontalCenter="0" /> </mx:Application> |
Como pode ver criei um método chamarPhp que será chamado quando eu clicar no botão e dentro do método chamamos o RemoteObject de id “ro” e em seguida invocamos o método que está lá na classe HelloFlexService, chamado helloFlex.
Já aproveitei e adicionei um evento de result no RemoteObject, colocando um Alert para exibir o resultado vindo do método invocado. Salve a Application ZendFrameworkQuickstart e antes de acessar a url “http://localhost/guestbook/ZendFrameworkQuickstart.html” para rodar nossa aplicação Flex, vamos ao GatewayController e adicionaremos no método init() a linha de código “$this->_helper->layout()->disableLayout();”, veja abaixo como ficará o seu GatewayController:
GatewayController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php class GatewayController extends Zend_Controller_Action { public function init(){ //linha adicionada para evitar que o layout seja exibido $this->_helper->layout()->disableLayout(); //devemos adicionar isso para evitar a renderização da view $this->getHelper('viewRenderer')->setNoRender(); //carrega a classe Zend_Loader::loadClass('Zend_Amf_Server'); } public function amfAction(){ $server = new Zend_Amf_Server(); $server->addDirectory(APPLICATION_PATH . '/services/'); echo($server->handle()); } } |
Abrindo parenteses e explicando essa nova linha adicionada, ela evita que o layout HTML do nosso projeto Zend seja enviado para o arquivo AMF, atrapalhando nossa requisição entre Flex e PHP, pois ocorrerá um erro se tentar rodar sem desabilitar o layout do projeto. Poderá até fazer um teste rodando o nosso Endpoint “http://localhost/guestbook/gateway/amf” pelo browser e ver que o arquivo AMF terá dentro o layout HTML mais a string “Zend Amf Endpoint” e para que funcione corretamente a requisição AMF deve conter apenas a string “Zend Amf Endpoint”, fechando parenteses.
Agora sim rode a aplicação Flex pela URL “http://localhost/guestbook/ZendFrameworkQuickstart.html” e clique no botão Chamar PHP e verá como resultado o Alert exibindo o result do método helloFlex, que será a seguinte frase “Olá Flex, estou usando o Zend AMF!”.
Bom pessoal, o exemplo foi simples, mas pretendo fazer a parte 4 que mostrará como fazer a camada view do Quickstart em Flex. Abraços e até breve.
Integrando Flex + Zend Framework (Usando o Quickstart da Zend) – PARTE 2
16/05/09
Olá pessoal, estou de volta, não tive muito tempo esses últimos dias, mas prometo nos próximos dias honrar o meu sobrenome e ser fiel aos posts rsrs. Bom brincadeiras a parte, mas vamos o que interessa, que é continuar esta série de integrar o Flex com o Zend Framework usando um projeto já construído, neste caso estou usando o Quickstart da Zend.
Recomendo que você leia a parte 1 antes de continuar lendo este post.
Bom antes de dar continuidade e ir diretamente ao código, precisamos criar um novo projeto PHP no Eclipse, chamado ZendFrameworkQuickstart e apontar a pasta aonde está nosso Quickstart que baixamos anteriormente, no meu caso é “c:\wamp\apps\ZendFrameworkQuickstart”.

Criado o projeto, temos que configurar finalmente nosso componente Zend AMF. Para isso criamos um novo controller chamado “GatewayController” e logo em seguida seu método chamado “amfAction” veja abaixo:
GatewayController.php
1 2 3 4 5 6 7 8 | <?php class GatewayController extends Zend_Controller_Action { public function amfAction(){ } } |
Como podemos ver, o GatewayController é um controller comum como os outros, ele extende de Zend_Controller_Action e ele será o nosso Endpoint para comunicar com o Flex. Claro, ainda não acontecerá nada porque temos que instanciar nosso componente Zend AMF e faremos isso dentro da action “amf” que acabamos de criar. Para instanciar devemos primeiramente importar a classe Zend_Amf_Server e após instanciá-la. Aproveitando criei o método init() padrão do Zend Framework para importar a classe e também tirar a renderização do layout.
GatewayController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php class GatewayController extends Zend_Controller_Action { public function init(){ //remove a renderização do layout da página $this->getHelper('viewRenderer')->setNoRender(); //carrega a classe Zend_Loader::loadClass('Zend_Amf_Server'); } public function amfAction(){ //criamos a instancia do componente Zend AMF $server = new Zend_Amf_Server(); } } |
Agora deveremos indicar a pasta aonde ficará todas as nossas classes PHP que farão comunicação com o Flex, mas antes disso vamos criar esta pasta, eu sugiro criar dentro de application para padronizar a estrutura. Esta pasta poderá chamar-se “services”.
Criada a pasta voltamos ao GatewayController e usamos o método “addDirectory” do nosso componente Zend AMF e em seguida passamos o caminho completo da nossa pasta “services”. Veja:
GatewayController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php class GatewayController extends Zend_Controller_Action { public function init(){ //remove a renderização do layout da página $this->getHelper('viewRenderer')->setNoRender(); //carrega a classe Zend_Loader::loadClass('Zend_Amf_Server'); } public function amfAction(){ //criamos a instancia do componente Zend AMF $server = new Zend_Amf_Server(); $server->addDirectory(APPLICATION_PATH . '/services/'); } } |
Percebem-se que coloquei a constante APPLICATION_PATH para indicar o caminho completo até a pasta “application”, isso já está configurado no nosso index.php (Arquivo front-controller do Quickstart). Então o método “addDirectory” mapeia toda a pasta “services” indicando que ali estão todas as classes que terão acesso ao Flex e vice versa.
Precisamos agora fazer o Zend AMF conectar com o Flex através do método “handle”, para isso devemos imprimi-lo na tela para que aja a manipulação dos dados AMF.
GatewayController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php class GatewayController extends Zend_Controller_Action { public function init(){ //remove a renderização do layout da página $this->getHelper('viewRenderer')->setNoRender(); //carrega a classe Zend_Loader::loadClass('Zend_Amf_Server'); } public function amfAction(){ //criamos a instancia do componente Zend AMF $server = new Zend_Amf_Server(); $server->addDirectory(APPLICATION_PATH . '/services/'); echo($server->handle()); } } |
Pronto, agora você pode testar em seu navegador, a url “http://localhost/guestbook/gateway/amf” e deverá obter uma solicitação de download de um arquivo “amf” do tipo AMF. Se editá-lo verá que está escrito Zend Amf Endpoint. Isso significa que está funcionando até então nossa comunicação entre Zend e Flex.
Vamos criar a nossa classe PHP que desejamos comunicar com o Flex.
Crie um novo arquivo PHP dentro da pasta “services” chamado de “HelloFlexService” e respectivamente o mesmo nome para a classe. Em seguida criamos um método chamado “helloFlex” e colocamos um simples return “Olá Flex, estou usando o Zend AMF!”.
HelloPhpService.php
1 2 3 4 5 6 7 8 | <?php class HelloFlexService { public function helloFlex(){ return 'Olá Flex, estou usando o Zend AMF!'; } } |
Feito! No próximo post estarei mostrando para vocês como chamar esta classe no Flex e exibir o seu conteúdo. Desta vez eu não demoro rsrs, aguardem…
Integrando Flex + Zend Framework (Usando o Quickstart da Zend) – PARTE 1
29/04/09
Olá pessoal, estou aí para mais um post e agora postando um artigo interessante e que muitos ainda gostariam de saber como integrar uma aplicação Zend Framework com o Adobe Flex. Vou dividir este post em partes e de inicio vamos configurar o nosso Quickstart para que possam prosseguir na integração com nosso Flex.
Lembrando que não vou ensinar como configurar o ambiente Zend Framework, pois não é objetivo deste post.
Primeiramente vou citar o que você precisará para que tudo funcione perfeitamente:
1º – Baixe o Quickstart no site do Zend Framework:
http://framework.zend.com/docs/quickstart
2º – Descompacte o arquivo aonde desejar, de preferência em um local aonde você conheça o caminho do diretório completo.
3º – Caso ainda não tenha a library do Zend Framework, você pode baixar aqui:
http://framework.zend.com/download/latest
Pode baixar o pacote minimal, pois conterá somente o que precisamos.
4º – Basta você pegar a pasta library do Zend Framework que acabou de baixar e sobrescreva a que está em seu ZendFrameworkQuickstart.
5º – Então precisamos configurar a aplicação Quickstart para que funcione sem erros, para isso devemos configurar para que a pasta Public dentro de ZendFrameworkQuickstart seja o nosso diretório raiz do servidor. Para evitar que alteramos as configurações de nosso servidor, podemos criar um Alias, que agora mostrarei a maneira que eu fiz usando o Wamp, sendo que você pode fazer da maneira que preferir desde que funcione perfeitamente a aplicação Quickstart.
Se você usa o Wamp existe um diretório chamado “alias” e dentro dele possui 2 arquivos .conf que se refere aos alias do phpmyadmin e sqlite. Crie uma cópia de um dos arquivos .conf e crie o seu alias, apontando a pasta public do ZendFrameworkQuickstart. Em meu caso ficou desta maneira:
Arquivo guestbook.conf
Alias /guestbook "c:/wamp/apps/ZendFrameworkQuickstart/public/" # to give access to guestbook from outside # replace the lines # # Order Deny,Allow # Deny from all # Allow from 127.0.0.1 # # by # # Order Allow,Deny # Allow from all # Options Indexes FollowSymLinks MultiViews AllowOverride all Order Deny,Allow Deny from all Allow from 127.0.0.1
Após isso vá até seu arquivo .htaccess dentro da pasta Public de seu ZendFrameworkQuickStart e altere a última linha que contém “RewriteRule ^.*$ index.php [NC,L]” e troque por “RewriteRule ^.*$ /guestbook/index.php [NC,L]” adicionando na frente o seu alias, no meu caso “/guestbook/”.
Reinicie o seu servidor e após acesse a url http://localhost/guestbook
Se você está visualizando em seu navegador a seguinte frase “Welcome to the Zend Framework!”, parabéns você conseguiu fazer funcionar o QuickStart da Zend. Se não conseguiu, peço que reveja os passos acima ou comente este post dizendo o problema que ocorreu.
Bom pessoal, por enquanto é isso, em breve estarei postando a Parte 2, aonde mexeremos com o Zend_Amf.
Várias técnicas de melhores práticas e otimização em ActionScript 3.0 e Flex.
25/04/09
Bom a pedido de muitos para que eu lançasse logo meu primeiro post foram muitas e aqui está. Gostaria de agradecer meu colega Ricardo por me enviar um belo post do Sean Moore, publicado no InsideRIA, sobre o trabalho de otimizar e descobrir melhores práticas em ActionScript 3.0 e Flex, usando o Flex Profiler. Achei bastante interessante e resolvi brevemente divulgar essas técnicas e traduzi-lás.
Antes de mostrar as técnicas, gostaria de falar rapidamente sobre a perspectiva Flex Profiler (imagem a seguir) dentro do Flex Builder 3, usada pelo Moore, ajuda a você ter uma noção de uso de memória, consumo de cada propriedade, chamada de método e instanciação de objetos dentro de sua aplicação.
Bom pode ter certeza que estarei dedicando um post sobre o Flex Profiler, mas por enquanto vamos ao que interessa neste post, que são as técnicas de melhores práticas e otimização.
Seguem elas:
1. Evite usar o operador new quando for criar Arrays
var a = [];
Não use:
var a = new Array ();
2. Criar arrays consome muito recurso, portanto conserve-os.
var vanityCollection01: Array = new Array (); var vanityCollection02: Array = new Array (); var vanityCollection03: Array = new Array (); var vanityCollection04: Array = new Array ();
3. Maneira mais rápida de copiar um array:
var copy : Array = sourceArray.concat();
4. Setar valores em arrays é lento:
empregados.push(trabalhador); empregados[2] = trabalhador;
5. Resgatar valores de Arrays é duas vezes mais rápido do que setá-los:
var trabalhador:Trabalhador = empregados[2];
6. Use métodos estáticos quando esses não precisam de uma instancia de objeto:
StringUtils.trim("Texto com espaço no final ");
Definição da classe:
package
{
public final class StringUtils
{
public static function trim( s : String ) : String
{
var trimmed : String;
// implementação...
return trimmed;
}
}
}
7. Use const para propriedades (constantes), caso seu valor nunca irá mudar durante todo o ciclo de sua aplicação:
public const APPLICATION_PUBLISHER : String = "Company, Inc.";
8. Use final quando a classe não pode conter herança, ou seja, não pode extende-la com outra classe.
public final class StringUtils
9. Nomes longos para métodos/variáveis não impacta na performance em ActionScript 3.0 (mas sim em outras linguagens).
algunsNomesLongosLoucosDeMetodoNaoFazRealmenteUmImpactoGrandeNaPerformance();
10. Uma linha atribuída NÃO compra nenhuma performance (mas sim em outras linguagens).
var i=0; j=10; k=200;
11. Não há diferença de uso de memória entre o uso de If ou Switch:
if ( condition )
{
// manipula condição
}
IDENTICO USO DE MEMÓRIA:
switch ( condition )
{
case "A":
// logica para manipular caso A
break;
case "B":
// logica para manipular caso B
break;
}
12. Use em suas condições If, uma ordenação a qual costuma ser mais verdadeira do que as outras:
if ( conditionThatHappensAlot )
{
// logica para manipular condição que é encontrada frequentemente
}
else if ( conditionThatHappensSomtimes )
{
// manipula caso essa é encontrada ocasionalmente
}
else
{
// manipula caso essa não é muito necessária
}
13. AVM (ActionScript Virtual Machine) converte int para Number durante calculos dentro de loops (VM foi alterada, da versão 9 para 10, assim conversões de int, uint e Number não são mais lentas como costumavam ser).
14. Resolver problemas de conversão e de tipos de objetos incorretos.
15. Use uint moderadamente, ele pode ser lento (VM foi modificada, da versão 9 para 10, assim conversões de int, uint e Number não são mais lentas como costumavam ser).
var footerHex : uint = 0x00ccff;
16. Use inteiros para interações:
for (var i: int = 0; i < n; i++) Não use: for (var i: Number = 0; i < n; i++)
17. Não use inteiro com decimal:
var decimal : Number = 14.654;
Não use:
var decimal : int = 14.654;
18. Multiplicação x Divisão: em vez de usar 5000/1000 use: 5000*0.001
19. Em loops como for ou while, procure deixar expressões fora dos mesmos, para evitar que elas se repitam:
//errado
for (..){ a * 180 / Math.PI; }
//declare fora do loop:
toRadians = a*180/Math.PI;
20. Evite calcular e usar chamadas de métodos em loops:
var len : int = myArray.lengh;
for (var i=0; i < int; i++) { }
Não use:
for (var i=0; i < myArray.lengh;i++){ }
21. Use RegEx para validação e métodos de busca de strings:
// validação de codigo postal usando expressão regular
private var regEx:RegExp = /^[A-Z][0-9][A-Z] [0-9][A-Z][0-9]$/i;
private function validatePostal( event : Event ) : void
{
if( regEx.test( zipTextInput.text ) )
{
// manipula caso o campo é inválido
}
}
// busca uma palavra usando métodos String
var string : String = "Search me";
var searchIndex : int = string.indexOf( "me" );
var search : String = string.substring( searchIndex, searchIndex + 2 );
22. Reutilize objetos para manter uma memória estável, DisplayObjects e objeto URLLoader.
23. Seguinte modelo de componente Flex:
createChildren(); commitProperties(); updateDisplayList();
24. Somente use DataGrids em último resurso (certifique-se se você pode montar uma List primeiro).
25. Evite Repeaters para rolagem de dados.
26. Evite o método setStyle() (Um dos métodos que mais consome recurso do framework Flex).
27. Usar muitos componentes, reduz drasticamente o desempenho de sua aplicação:
<mx:Panel>
<mx:VBox>
<mx:HBox>
<mx:Label text="Label 1" />
<mx:VBox>
<mx:Label text="Label 2" />
</mx:VBox>
<mx:HBox>
<mx:Label text="Label 3" />
<mx:VBox>
<mx:Label text="Label 4" />
</mx:VBox>
</mx:HBox>
</mx:HBox>
</mx:VBox>
</mx:Panel>
28. Você pode fechar a tag de um componente simplesmente usando “/>”.
<mx:Image xmlns:mx="http://www.adobe.com/2006/mxml"
source="avatar.jpg" width="200" height="200" />
29. Remova os componentes desnecessários para reduzir o aninhamento dos mesmos.
30. Evite: O componente VBox dentro de um Panel, sendo que ele possui a propriedade layout como vertical, horizontal ou absoluto, evitando assim uma redundancia.
<!-- Correto -->
<mx:Panel>
<mx:Label text="Label 1" />
<mx:Label text="Label 2" />
</mx:Panel>
<!-- Não Use -->
<mx:Panel>
<mx:VBox>
<mx:Label text="Label 1" />
<mx:Label text="Label 2" />
</mx:VBox>
</mx:Panel>
31. Evite: O componente VBox dentro de um Application, sendo que ela possui a propriedade layout como vertical, horizontal ou absoluto, evitando assim uma redundancia.
<!-- Correto -->
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx=http://www.adobe.com/2006/mxml>
<mx:Label text="Label 1" />
<mx:Label text="Label 2" />
</mx:Application>
<!-- Não Use -->
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx=http://www.adobe.com/2006/mxml>
<mx:VBox>
<mx:Label text="Label 1" />
<mx:Label text="Label 2" />
</mx:VBox>
</mx:Application>
32. Setar a propriedade recycleChildren como true para melhorar a performance de objetos Repeaters.
(A reutilização usada, criou filhos ao em vez de criar novos objetos).
<mx:Script>
<![CDATA[
[Bindable]
public var repeaterData : Array = ["data 1", "data 2"];
]]>
</mx:Script>
<mx:Repeater id="repeater" dataProvider="{repeaterData}">
<mx:Label text="data item: {repeater.currentItem}"/>
</mx:Repeater>
33. Trave seu framerate em 60fps ou menor:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx=http://www.adobe.com/2006/mxml
frameRate="45">
</mx:Application>
34. Evite mostrar multiplas manipulações por frame.
35. Use o evento ENTER_FRAME ao em vez do evento Timer:
public function onEnterFrame( event : Event ) : void
{
}
private function init() : void
{
addEventListener( Event.ENTER_FRAME, onEnterFrame );
}
Não use:
public function onTimerTick( event : Event ) : void
{
}
private function init() : void
{
var timer : Timer = new Timer();
timer.start();
timer.addEventListener( TimerEvent.TIMER, onTimerTick );
}
36. Para adiar a criação de um objeto para vários frames use:
<mx:Container creationPolicy="queued"/>
37. Alpha = 0 não é o mesmo que visible = false (Objetos marcados como invisivel são ignorados).
loginButton.visible = false;
Não use:
loginButton.alpha = 0;
Outras Referencias citadas por Sean:
Sean Christmann: Optimizing Adobe AIR for Code Execution, Memory, and Rendering
http://www.craftymind.com/2008/11/20/max-2008-session-material/
Dennis Ippel: Some ActionScript 3.0 Optimizations
http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/
Shane McCartney: Tips on how to write efficient AS3
http://www.lostinactionscript.com/blog/index.php/2008/09/28/tips-on-how-to-write-efficient-as3/
Flex Application Performance: Tips and Techniques for Improving Client Application Performance
http://www.adobe.com/devnet/flex/articles/client_perf.html
Stephen Calender: ActionScript 3.0 Benchmarking
http://www.stephencalenderblog.com/?p=7
Grant Skinner: Types in AS3: ints not so fast, uints slow!
http://www.gskinner.com/blog/archives/2006/06/types_in_as3_in.html
Grant Skinner: Resource management strategies in Flash Player 9
http://www.adobe.com/devnet/flashplayer/articles/resource_management.html
Gary Grossman: ActionScript 3.0 and AVM2 Performance Tuning
http://www.onflex.org/ACDS/AS3TuningInsideAVM2JIT.pdf
Fastest way to copy an array
http://agit8.turbulent.ca/bwp/2008/08/04/flash-as3-optimization-fastest-way-to-copy-an-array/
Andre Michelle: AS3 optimations & suggestions
http://blog.andre-michelle.com/2005/as3-optimations-suggestions/
Package-level function closures in ActionScript
http://www.ericfeminella.com/blog/2008/05/06/package-level-function-closures-in-actionscript/
ActionScript 3 optimization techniques
http://blog.joa-ebert.com/2008/04/26/actionscript-3-optimization-techniques/
AS3 Performance Tester
http://businessintelligence.me/projects/performance_tester/performanceTester.html





