Uma das melhores idéias do Flex, e o que o torna bastante produtivo na minha opinião é a existencia de uma “linguagem” para layout de telas, é o tal de MXML.
Claro que eu sei que é apenas XML, mas é XML com acesso direto as classes existentes e recem criadas, e uma mão na roda para separar o código do layout, facilitando bastante a escrita de código MVC compliant.
O maior problema da arquitetura básica do Flex é não ser “óbvio” como escrever o código de tratamento dos eventos gerados sem poluir o MXML com muitas tags “mx:Script” e muito código ActionScript.
Claro que existem alguns frameworks para o desenvolvimento de aplicações Flex como o Cairngorm e o PureMVC, mas algumas vezes estes frameworks mais complicam do que ajudam, e mesmo utilizando um deles, esta dica que vou apresentar agora de como simular o “code behind” do “.NET” em flex pode ser utilizada sem maiores problemas …
A idéia principal é separa o código ActionScript do código XML, como se fosse uma “partial class” do “.NET”, o Flex não suporta Partial Classes, mas suporta herança, e podemos tirar proveito disto …
Vou mostrar um exemplo bastante simplista aqui, apenas para que vocês peguem a idéia, vejam o código da tela abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | <?xml version="1.0" encoding="utf-8"?> <mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%"> <mx:Script> <![CDATA[ import mx.controls.DataGrid; import mx.events.ListEvent; [Bindable] private var current : Object = new Object(); [Bindable] private var all : Array = []; private function saveCurrent(nome : String, idade : Number) : void { var obj : Object = {nome : nome, idade : idade, id : all.length + 1}; var temp : Array = all.slice(0,all.length); temp.push(obj); all = temp; current = obj; } private function updateCurrent(nome : String, idade : Number) : void { current.nome = nome; current.idade = idade; } private function newCurrent() : void { current = new Object(); } private function selectionChange(evt : ListEvent) : void { current = (evt.target as DataGrid).selectedItem; } ]]> </mx:Script> <mx:Label fontSize="24" width="100%" textAlign="center" text="Cadastro de Pessoas"/> <mx:HBox width="100%"> <mx:Label text="Nome:" width="100"/> <mx:TextInput id="currentNome" text="{current.nome}"/> </mx:HBox> <mx:HBox width="100%"> <mx:Label text="Idade:" width="100"/> <mx:NumericStepper id="currentIdade" value="{current.idade}" minimum="5" maximum="150"/> </mx:HBox> <mx:HBox width="100%" horizontalAlign="center"> <mx:Button label="Salvar" click="saveCurrent(currentNome.text,currentIdade.value)" enabled="{!current.id}"/> <mx:Button label="Novo" click="newCurrent()" enabled="{current.id}"/> <mx:Button label="Atualizar" click="updateCurrent(currentNome.text,currentIdade.value)" enabled="{current.id}"/> </mx:HBox> <mx:DataGrid width="100%" dataProvider="{all}" change="selectionChange(event)"> <mx:columns> <mx:DataGridColumn headerText="Id" dataField="id"/> <mx:DataGridColumn headerText="Nome" dataField="nome"/> <mx:DataGridColumn headerText="Idade" dataField="idade"/> </mx:columns> </mx:DataGrid> </mx:VBox> |
Apenas para este bastatne simples, já temos quase metade do arquivo contendo ActionScript e metade contendo MXML.
Em um caso simples destes isto não chega a incomodar, mas quando o arquivo começa a crescer, isto atrapalha a leitura do código fonte, o que é bastante ruim. Então a minha sugestão, ou “dica” de como resolver isto, é separar o código ActionScript em um arquivo .as e manter apenas o layout no arquivo MXML, como pode ser visto no seguinte exemplo (considerando que o nome do arquivo mostrado acima seja telaexemplo.mxml)
Criar a classe “exemplo.TelaExemploBase” no diretório correspondente com o seguinte código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | package exemplo { import mx.containers.VBox; import mx.controls.DataGrid; import mx.events.ListEvent; public class TelaExemploBase extends VBox { [Bindable] protected var current : Object = new Object(); [Bindable] protected var all : Array = []; public function TelaExemploBase() { super(); } protected function saveCurrent(nome : String, idade : Number) : void { var obj : Object = {nome : nome, idade : idade, id : all.length + 1}; var temp : Array = all.slice(0,all.length); temp.push(obj); all = temp; current = obj; } protected function updateCurrent(nome : String, idade : Number) : void { current.nome = nome; current.idade = idade; } protected function newCurrent() : void { current = new Object(); } protected function selectionChange(evt : ListEvent) : void { current = (evt.target as DataGrid).selectedItem; } } } |
Alterar o arquivo MXML para o seguinte código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?xml version="1.0" encoding="utf-8"?> <TelaExemploBase xmlns="exemplo.*" xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" > <mx:Label fontSize="24" width="100%" textAlign="center" text="Cadastro de Pessoas"/> <mx:HBox width="100%"> <mx:Label text="Nome:" width="100"/> <mx:TextInput id="currentNome" text="{current.nome}"/> </mx:HBox> <mx:HBox width="100%"> <mx:Label text="Idade:" width="100"/> <mx:NumericStepper id="currentIdade" value="{current.idade}" minimum="5" maximum="150"/> </mx:HBox> <mx:HBox width="100%" horizontalAlign="center"> <mx:Button label="Salvar" click="saveCurrent(currentNome.text,currentIdade.value)" enabled="{!current.id}"/> <mx:Button label="Novo" click="newCurrent()" enabled="{current.id}"/> <mx:Button label="Atualizar" click="updateCurrent(currentNome.text,currentIdade.value)" enabled="{current.id}"/> </mx:HBox> <mx:DataGrid width="100%" dataProvider="{all}" change="selectionChange(event)"> <mx:columns> <mx:DataGridColumn headerText="Id" dataField="id"/> <mx:DataGridColumn headerText="Nome" dataField="nome"/> <mx:DataGridColumn headerText="Idade" dataField="idade"/> </mx:columns> </mx:DataGrid> </TelaExemploBase> |
A idéia básica é utilizar o MXML para extender a classe ActionScript que contem o código, a diferença é que tudo o que deve ser acessado do MXML na classe criada não pode ser privado, tem que ser no mínimo protected (o que foi utilizado no exemplo).
Outro truque é definir o “xmlns” para o pacote da classe que vai ser extendida como pode ser visto na linha 2.
E para testar isto é necessária uma “aplicação flex”, eu utilizei apenas o código abaixo para o projeto de testes:
1 2 3 4 | <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*"> <local:telaexemplo width="100%" height="100%"/> </mx:Application> |
Mas claro que você pode fazer algo mais elaborado
Espero que esta dica ajude alguem, ja que eu tive bastante trabalho reorganizando código depois que descobri que isto era muito melhor do que colocar tudo no MXML logo que comecei a trabalhar com Flex.
A algum tempo atrás eu disse que nunca mais iria fazer uma prova de certificação Beta, mas como eu disse neste post, no final do ano passado eu fiz a versão Beta da nova certificação da SUN “Sun Certified Developer for Java Web Services 5″.
Uma das coisas chatas de uma prova beta é que leva mais de 6 semanas para darem o resultado da prova, e hoje fui acessar o site da prometric para ver o resultado (como tenho feito uma vez por semana a algum tempo) e eu passei na prova
Isto quer dizer que eu tenho mais algumas letras sem muita utilidade para enfeitar o meu currículo (SCDJWS)
Eu sei que certificações não provam nada, ainda mais com provas difíceis como esta, em que eu esqueci da prova e não estudei nada (o que prova que com o conhecimento adquirido no trabalho é possível passar em uma prova de certificação), mas mesmo assim, foi uma prova que levei 3 horas para fazer, então merece pelo menos um post no blog de comemoração
.
Tags: certificação, Java
Uma forma possível de se iterar pelo conteúdo de um array em Flex é:
1 2 3 4 5 | private function iterarSobreArray(arr : Array) : void { for(var i : int = 0; i < arr.length; i++){ fazerAlgumaCoisaCom(arr[i]); } } |
Mas esta forma vai causar problemas caso o array seja nulo, para evitar isto basta utilizar a forma abaixo.
1 2 3 4 5 | private function iterarSobreArray(arr : Array) : void { for each(var o : Object in arr){ fazerAlgumaCoisaCom(o); } } |
Desta forma temos menos variáveis declaradas, e não corremos risco de tentar ler o tamanho de um “null” na linha 2 do primeiro exemplo …

Mas mesmo assim, o livro é recomendado para iniciante e intermediario no máximo, pois existem alguns tópicos mais avançados que não são tratados, mas nada que faça falta no dia a dia.
Acho que o maior diferencial do livro é ser 100% prático, apresentar todos os conceitos utilizando exemplos desenvolvidos pelo próprio leitor, facilitando o aprendizado.
Garanto que se você ler o livro e fizer todos os exercícios e as duas aplicações propostas no livro, no final você vai conseguir desenvolver as suas aplicações em RoR sem maiores problemas.
Se tiver dúvidas, vou ficar feliz em responde-las e com certeza, se vocês gostarem do livro, as dúvidas vão ajudar a melhorar a próxima versão do livro ![]()
Então agora é só vocês comprarem o livro e começar a estudar.
Para quem quiser dar uma olhada antes do livro chegar nas bancas, segue o “indice” com o título dos capítulos:
- Dedicatória
- Agradecimentos
- Sobre o autor
- Prefácio
- Introdução ao Ruby
- Instalação do Ruby
- Primeiros passos
- Variáveis e escopo
- Tipos básicos do Ruby
- Blocos de código
- Procs
- Números
- Valores booleanos
- Strings
- Constantes
- Intervalos numéricos
- Arrays
- Hashes
- Símbolos
- Expressões regulares
- Classes e métodos
- Métodos
- Módulos
- Operadores condicionais e loops
- If elsif else end
- case when else end
- Operadores de loop
- while
- for
- until
- begin
- loop
- Padrões importantes
- Nomes de arquivos
- Classes, e atributos e métodos de acesso
- Nomenclatura de métodos
- Dominando o Ruby!
- Ambiente de desenvolvimento
- Multi plataforma
- Aptana RadRails
- NetBeans
- IntelliJ IDEA
- Vim
- Windows
- Notepad++
- E-TextEditor
- Linux
- GEdit
- Kate
- Mac
- TextMate
- Plug-ins para os editores
- Escolhendo o seu
- Rails básico
- Criando a primeira aplicação
- Estrutura de diretórios de uma aplicação
Rails
- Scripts padrão do Rails
- Gerando código, um cadastro instantâneo
- A primeira Migration
- O primeiro model
- O primeiro controlador
- Métodos básicos do ActiveRecord
- Recebendo parâmetros nos controladores
- Respondendo a requisições
- As primeiras views
- Precisando de ajuda para limpar o código das
views?- Configurando rotas, um nome bonito para URLs
- Continuando o desenvolvimento
- Conferindo as migrations geradas
- Escrevendo modelos
- Gerando todo o código
- Um pouco de segurança na aplicação
- Um layout menos ruim para a aplicação
- Associando usuários a projetos
- Adicionando tipos de tarefa a um projeto
- Cadastrando as horas trabalhadas
- Um relatório para a aplicação
- Limpando um pouco o código e se livrando um pouco do
inglês- Suporte a testes no Rails
- RUnit básico
- Testando modelos
- Escrevendo fixtures
- Testando as validações
- Asserções disponíveis
- Testes funcionais, testando os controladores e
helpers- Tornando testes mais divertidos e úteis (inclusive
para o seu chefe)- Notificação de testes executados
- De volta às User Stories
- Uma olhada nas especificações
- Utilizando objetos falsos ou mocks
- Finalizando a definição de comportamento do
sistema com as User Stories- ActiveRecord avançado
- Utilizando o ActiveRecord para consultas
- Métodos de busca dinâmicos por atributos
- ActiveRecord::Base.find
- ActiveRecord::Base.find_bysql
- Associações polimorficas
- Mais sobre associações
- Callbacks para associações
- Outros métodos úteis do ActiveRecord
- Use todo o poder do RESTful
- Introdução ao REST
- Métodos do protocolo HTTP
- Princípios do REST
- RESTful: The Rails way
- Tema de casa
- Paginação
- Paginação manual
- Will_paginate
- Outros plug-ins
- paginating_find
- Paginator
- Upload de arquivos
- Attachment_fu
- File_column
- Outros plug-ins úteis
- Brazilian-rails
- Exception_logger
- Exception_notifier
- JRails
- Restful_authentication
- Annotate_models
- Acts_as_taggable_on_steroids
- Juggernaut
- Mydry
- Calendar_date_select
- Css_graph
- Backgroundrb
- Quais plug-ins utilizar na sua aplicação
- AJAX on Rails Quase sem JavaScript
- Reutilizando código entre projetos
- O plug-in biblioteca
- Plug-ins de geração de código
- Finalizando o assunto
- Colocando tudo isto em produção
- CGI
- FastCGI
- Mongrel
- Mod_rails
- JRuby
- Opções de deployment
Junto com o livro vou colocar no ar o site http://livro.urubatan.com.br onde vou publicar mais exemplos, quaisquer correções que sejam necessárias, e qualquer um que comprar o livro vai poder deixar a opinião e fazer perguntas.
PS.: Este livro não vai te transformar em um ninja fodão que desenvolve qualquer sistema em 2 horas. Mas é um bom começo se você quer aprender Ruby On Rails.
Tags: anuncio, livro, rails, Ruby, ruby on rails