Mar
20

Semana de seminários online gratuítos sobre as tecnologias Adobe para desenvolvimento de RIAs

A Adobe está a disponibilizar gratuitamente cerca de 20 seminários online sobre Flex, Air, Flash Lite 3, ColdFusion, Blaze DS, Dreamweaver, etc. Para aceder aos seminários precisará somente de um computador ligado à Internet com o Flash Player instalado e de fazer uma pré-inscrição aqui nas sessões individuais que pretender assistir.

Quer assistir a uma sessão mas não tem disponibilidade à hora marcada? Não tem problema - a Adobe disponibilizará mais tarde as gravações dos seminários.

As sessões serão as seguintes:

Segunda

Extending Web to the Desktop with AIR
Segunda, 24 de Março - 16:00 às 17:00

Getting Started with Flash Lite 3 and CS3
Segunda, 24 de Março - 18:00 às 19:00

What’s New in ColdFusion 8

Segunda, 24 de Março - 20:00 às 21:00

Building Rich Internet Applications with Flex 3

Segunda, 24 de Março - 23:00 às 00:00

Terça

Introduction to Adobe Blaze DS
Terça, 25 de Março - 16:00 às 17:00

Integrating Salesforce.com and Flex

Terça, 25 de Março - 18:00 às 19:00

Building AIR Applications with Flash CS3

Terça, 25 de Março - 20:00 às 21:00

Dreamweaver: Effective Standards-based Workflows for Ajax

Terça, 25 de Março - 23:00 às 00:00

Quarta

Adobe AIR Local Data Storage Options With Emphasis on Using Embedded SQL Databases
Quarta, 26 de Março - 16:00 às 17:00

Flash Lite and Flex for Tourism
Quarta, 26 de Março - 18:00 às 19:00

ColdFusion Powered Rich Applications for the Internet and Desktop
Quarta, 26 de Março - 20:00 às 21:00

Flex and Java – Tying the Knot!

Quarta, 26 de Março - 23:00 às 00:00

Quinta

Flex Data Services
Quinta, 27 de Março - 16:00 às 17:00

Adding Live Chat with ColdFusion & Adobe Blaze DS
Quinta, 27 de Março - 18:00 às 19:00

Blood from a Stone: Flash Game Optimization on Low-end mobile devices
Quinta, 27 de Março - 20:00 às 21:00

Flex Visual Data & Charting

Quinta, 27 de Março - 23:00 às 00:00

Sexta

The Essential Guide to Dreamweaver CS3 with CSS, Ajax, and PHP
Sexta, 28 de Março - 16:00 às 17:00

ILOG Elixir: Your Remedy for Vibrant Data Visualization
Sexta, 28 de Março - 18:00 às 19:00

AIR Native Drag and Drop
Sexta, 28 de Março - 20:00 às 21:00

Flex Architecture
Sexta, 28 de Março - 23:00 às 00:00

Fiz a conversão das horas para GMT somando 7 horas ao US/Pacific. Se me tiver enganado, deixe um comentário neste post para que possa efectuar a correcção o quanto antes.

Clique aqui para fazer a inscrição ou para mais informações.




Mar
11

Best Practices #1 - A morte do parent.parent.parent: criação de componentes fracamente acoplados

Pretendo com este post iniciar uma série de posts de best-practices de desenvolvimento em Actionscript 3.

Começo com um dos maiores erros que costumo ver, especialmente em antigos programadores Actionscript 2: a amaldiçoada utilização do parent (o antigo _parent) ou do stage (o antigo _root).
Este post aplica-se tanto a Flash CS3 como a Flex. O código está puramente em Actionscript 3, mas o raciocínio é exactamente o mesmo para MXML.

O caso

Imaginemos a seguinte imagem:

menu.jpg

Temos o Stage. Dentro do Stage, temos um menu e duas secções: seccaoA e seccaoB. Dentro do menu temos dois botões: opcaoA e opcaoB. Ou seja:

  • Stage
  • Stage.menu
  • Stage.menu.opcaoA
  • Stage.menu.opcaoB
  • Stage.seccaoA
  • Stage.seccaoB

Queremos que quando o utilizador clique na opcaoA, a seccaoA seja mostrada, e que aconteça o mesmo para a opcaoB e seccaoB.

O código, para os adeptos do “parent”, parece óbvio:

(Dentro do Menu):

// Construtor
public function Menu()
{
opcaoA.addEventListener(MouseEvent.CLICK, opcaoAClickHandler);
opcaoB.addEventListener(MouseEvent.CLICK, opcaoBClickHandler);
}

function opcaoAClickHander(ev:MouseEvent):void
{
parent.seccaoA.visible=true;
parent.seccaoB.visible=false;
}

function opcaoBClickHander(ev:MouseEvent):void
{
parent.seccaoA.visible=false;
parent.seccaoB.visible=true;
}

Aparentemente isto resolveria o problema de uma assentada só. Porém…

Os problemas do parent

Infelizmente está 100% incorrecto utilizar o parent. A regra é simples: é *proibido* usá-lo. Surgiu um problema que obriga à utilização do parent? Repense! Leia este post, e veja como se resolve.
E obviamente perguntará: porque é que está incorrecto?

Problema 1: Reutilização

O seu menu está um espectáculo: é um dos preferidos na sua empresa tanto que o quer utilizar em vários projectos.

Entretanto aparece um novo projecto onde vai usar o menu. Porém foi outro elemento da equipa que fez a seccaoA e seccaoB, mas…. deu-lhes outros nomes. Chamou-lhes “seccao1″ e “seccao2″. E agora, que faz?

Primeira opção: mudar os nomes dados pelo seu colega (seccao1 e seccao2) para seccaoA e seccaoB. Big mistake: infelizmente o outro elemento da equipa tinha feito imenso código que usava intensivamente os nomes “seccao1″ e “seccao2″. E agora vai fazer o quê? Mexer no código dele? Não me parece…

Segunda opção: mudar no seu código onde está parent.seccaoA para parent.seccao1. Parece uma boa ideia dado o exemplo que fizemos aqui, mas se se tratasse um menu altamente complexo que usasse imensas vezes “parent.seccaoA”, seria lógico (e rápido) estar a mudar em todo o lado para seccao1 ?

Ok, é teimoso e estaria disposto a mudar o seu código todo… Porém, ao fazer isto, em vez de ter um menu que está a reutilizar entre projectos, na realidade acaba por estar a criar vários menus diferentes. Isto porque para cada projecto terá que mudar o código de cada menu de acordo com os nomes das secções. Ou seja, no fundo é um menu diferente com código diferente por projecto…

Problema 2: Refactoring

O seu projecto está feito e parece terminado. Porém, agora aparece o chefe a dizer “Ah e tal, vocês fizeram isto mal. Não quero a seccaoA dentro do Stage, mas sim dentro de um MovieClip chamado SectionContainer que tem uma borda e uns efeitos giros”. E lá vão vocês criar o SectionContainer, e colocar as secções lá dentro. Entretanto compilam e… Erro!

O código antigo do menu referia-se a parent.seccaoA. Porém, com a alteração, a seccaoA neste momento pode ser acedida assim: parent.sectionContainer.seccaoA. E com isto lá ter que ir mudar o seu código (e rezar para que o menu não seja complexo ao ponto de ter que mudar 23423423 linhas…).

A solução: componentes fracamente acoplados

A solução é relativamente simples, e passa por se cumprir uma regra também ela simples:

« Um componente/”MovieClip” nunca pode saber nada sobre quem o usa. Um componente/”MovieClip” só é responsável por si próprio »

Por outras palavras, se dentro do Menu está a fazer “parent.seccaoA”, quer dizer que o menu sabe que existe uma secção fora de si chamada seccaoA - sabe mais do que deveria saber.

Então como posso fazer: “quanto se clica na opcaoA, quero mostrar a seccaoA” se o menu não pode saber que há uma seccaoA ? Ora, o menu não tem que mudar para a seccaoA mas sim avisar quem o está a usar que está na altura de mudar para a seccaoA. Avisar como? Através de eventos!

Lançar e apanhar os eventos

O raciocínio passará a ser então:

  1. O utilizador clica no botão, o que despoleta um click e respectiva chamada da função opcaoAClickHander
  2. O opcaoAClickHandler deverá avisar o componente externo que está na altura de mudar para a seccaoA, lançando um evento chamado por exemplo “opcaoAClick”
  3. O Stage deverá estar a escutar eventos do tipo “opcaoAClick”, e quando os apanha chama a função menuOpcaoAClickHandler
  4. O menuOpcaoAClickHandler deverá conter o código necessário para mostrar a secção correspondente e esconder as outras.

Assim, o código correspondente:

(Dentro do Menu):

// Construtor
public function Menu()
{
opcaoA.addEventListener(MouseEvent.CLICK, opcaoAClickHandler);
opcaoB.addEventListener(MouseEvent.CLICK, opcaoBClickHandler);
}

function opcaoAClickHander(ev:MouseEvent):void
{
dispatchEvent(new Event("opcaoAClick"));
}

function opcaoBClickHander(ev:MouseEvent):void
{
dispatchEvent(new Event("opcaoBClick"));
}

(Dentro do Stage, que está associado a uma classe chamada Index):

// Construtor
public function Index()
{
menu.addEventListener("opcaoAClick", menuOpcaoAClickHandler);
menu.addEventListener("opcaoBClick", menuOpcaoBClickHandler);
}

function menuOpcaoAClickHandler(ev:MouseEvent):void
{
seccaoA.visible=true;
seccaoB.visible=false;
}

function menuOpcaoBClickHandler(ev:MouseEvent):void
{
seccaoA.visible=false;
seccaoB.visible=true;
}

Ou seja, se só o Stage é que sabe que existem secções, só o Stage é que pode mudar de secções. Então o menu simplesmente lança um aviso “olha, está na altura de mudar para a seccaoA”. O Stage apanha o aviso, e faz então o que é necessário para mostrar a secção correspondente.

Mais correcto ainda, seria criar um Custom Event, que possuiria uma String como propriedade pública onde seria colocado o nome da secção. Porém, isso fica para uma posterior lição.

Conclusões

  • Qualquer componente ou MovieClip nunca pode saber *nada* sobre quem o está a usar.
  • Não usar o parent.
  • Não usar o parent.
  • Não usar o parent.
  • Sempre que surge um caso de “aqui ficava mesmo bem um parent”, usamos o dispatchEvent como descrito acima.

Desta forma, o nosso menu já não sofre de problemas de reutilização nem de refactoring:

  • se quisermos usar o menu noutro projecto, é só colocá-lo noutro projecto: não é preciso mudar o código do menu, pois este é completamente independente do projecto onde é usado;
  • se o projecto sofrer alterações de estrutura, é só alterar o projecto sem mexermos no menu: não é preciso mudar o código do menu, pois este é completamente independente do projecto onde é usado.

É de realçar que este raciocínio não deve ser aplicado só a menus, mas a TUDO. Vai usar o parent? Esqueça. Use o dispatchEvent!




Dec
09

Encontro de comemoração do aniversário do RiaPT: parte 2

Tal como já foi anunciado, no dia 15 de Dezembro - Sábado - haverá um encontro de comemoração do primeiro aniversário do RiaPT a partir das 16h, na Flag - Atrium Saldanha. O endereço do local pode ser visto aqui. O estacionamento no Atrium ao Sábado é gratuíto, pelo que poderão deslocar-se de automóvel ou metro com relativa facilidade.

As inscrições devem ser efectuadas deixando um comentário no post anterior, estando actualmente 31 pessoas inscritas. Aconselho também a leitura do post anterior que possui mais informação para complementar este.

Infelizmente já sei que não poderemos contar com o Kim Hansen nem com o José Luís Gouveia que não estarão em Portugal na altura. Lá teremos que fazer outro evento lá para finais de Fevereiro …. ; )

O encontro será marcado por curtas apresentações de 10 a 20 minutos, e poderemos contar também com a presença de uma equipa da 4inWeb que irá apresentar o Microsoft Silverlight.

Assim sendo, aqui fica o índice de apresentações que me chegaram às mãos até ao momento, sem nenhuma ordem em específico. Irei actualizando este post à medida que mais pessoas se forem oferecendo para fazer apresentações.

Índice de apresentações

  1. Boas Vindas
  2. Apresentação do Microsoft Silverlight - 4InWeb
  3. Display List em AS3 - João Gonçalves
  4. Integração de Flash Cs3 com Flex 2 - João Saleiro
  5. Showcase: Asko / “A minha primeira aplicação em Flex” - Luís Costa
  6. Introdução ao Cairngorm - João Fernandes
  7. Showcase: FlexFuel - João Saleiro
  8. And Now for Something Completely Different … - Paulo Moreira
  9. Showcase: Configurador de Regras - Alexandre Xavier

Se houverem interessados, posso ainda apresentar “Interligação entre Flex e PHP utilizando AMFPHP”. Não incluí na lista para não terem que me aturar demasiadas vezes, mas se houver muitos interessados posso por exemplo substituir uma das minhas sessões por esta.

Antes das “palestras” teremos um fase de apresentações para que as pessoas se conheçam. No final, voltamos todos a sentar-nos e falamos livremente.

Temos tudo montado para um grande primeiro aniversário! Ok, falta o bolo… alguém se oferece para fazer um bolo? :P




Dec
07

Onde aprender Cairngorm - a framework MVC da Adobe

Até poderia dizer que o Cairngorm mudou a minha vida… o que não deixaria de ser verdade, pois a a utilização de MVC (Model-View-Controller) facilita em muito a vida de quem queima pestanas a programar dias consecutivos.

O Model-View-Controller consiste num conjunto de padrões de desenho que nos ajudam a diminuir a complexidade de projectos de grandes dimensões, a organizar melhor o nosso código, a facilitar o trabalho em equipa, a incentivar o fraco acoplamento entre módulos, a tornar o nosso trabalho em algo mais “metódico” ajudando-nos a que nos preocupemos mais a resolver os problemas dos nossos clientes (as regras de negócio), e menos a decidir como organizar o nosso código.

A framework Cairngorm é uma framework MVC oficialmente suportada pela Adobe, e talvez a mais popular no mundo de desenvolvimento em Flex. Não quer dizer que não existam outras “melhores” ou “piores”, como a Guasax, a PureMVC, a Prana ou a ARP, cuja escolha depende mais das características do projecto do que da “qualidade” da framework.

Embora seja muito fácil utilizar uma framework MVC, normalmente é bastante complicado perceber os conceitos por detrás das mesmas, até porque implicam conhecimentos avançados de Programação Orientada ao Objecto. Porém, posso dizer que lendo alguns recursos na net comecei a sentir-me à vontade com Cairngorm ao fim de uma semana e meia. Deixo por isso, aqui os recursos que li e a minha opinião sobre os mesmos.

Recursos da Adobe

São bastante completos, mas demasiado informativos. Pecam falta de componente prática.

Recursos do David Tucker

Aconselho vivamente estes tutoriais pois estão muito bem estruturados, têm vídeos explicativos bastante fáceis de serem acompanhados e bons exemplos de código ao longo dos posts. Esta foi a principal fonte que me ajudou a compreender Cairngorm.

Recursos do Jeffry Houser

Estes não tive oportunidade de ler, mas ficam aqui a título de registo:

Outros recursos complementares

Antes de se aventurarem a ler sobre Cairngorm, aconselho primeiro a ler alguns conceitos complementares que serão úteis para se perceber MVC:




Oct
30

Design Patterns in ActionScript 3.0 - Videos

Junto seguem 2 videos que fiz durante o MAX, dedicados a utilização de Design Patterns em ActionScript 3. Leo Schuman apresentou o Observer e o Singleton juntamente com código a exemplificar.

Um padrão de desenho (design pattern) é uma solução genérica para resolver problemas habituais na arquitectura de aplicações de software. O Wikipedia possui uma descrição mais detalhada.

Infelizmente não consigo encontrar o final da apresentação, mas ficam no entanto as duas primeiras partes da apresentação.

Parte I

Parte II


Online Videos by Veoh.com

top