Leia os artigos anteriores:
Criando sistemas reais com Flex – Parte 03
Criando sistemas reais com Flex – Parte 02
Criando sistemas reais com Flex – Parte 01
*
Seguindo
a linha de raciocínio da Parte 3, vamos novamente apresentar um
problema comum em sistemas reais e usar um padrão de projeto para
resolvê-lo. Agora que temos as nossas janelas MDI funcionando
perfeitamente, vamos a um impasse bastante comum.
Suponha
que tenhamos uma tela de cadastro de pessoas, e outra tela que exibe um
Grid com todas as pessoas. Suponha que estas duas telas estejam
visíveis no container MDI. Como uma tela pode comunicar-se com a outra? Como podemos saber, por exemplo, se uma tela está aberta e se podemos
chamar um método dela? Todos estes questionamentos surgem quando
começamos a implementar as MDI Windows. Assim, surge também uma solução
que não é a ideal.
Na Parte 3, nós criamos uma variável chamada “WIndowHelper”, que era privada:
private var WindowHelper: MDIWindowHelper; <br /><br /> protected function OnCreationComplete(event:Event):void<br /><br /> {<br /> WindowHelper = MDIWindowHelper.GetInstance();<br /> }<br /><br />A solução mais básica seria tornar esta variável pública e acessá-la através de "parentApplication...."<br /><br /> public function Teste():void<br /> {<br /> parentApplication.WindowHelper.FazerAlgo().....<br /> }Mas esta solução é muito ruim, primeiramente porque variáveis globais tornam a sua aplicação mais vulnerável a erros, e depois porque o acesso de parentApplication é fracamente tipado. E, para finalizar, porque existe um modo melhor de fazer a mesma coisa.
Para
resolver este problema (Variáveis globais) usamos o padrão de projeto
“Singleton”, cuja especificação pode ser encontrada nos seguintes links:
- http://en.wikipedia.org/wiki/Singleton_pattern
- http://javafree.uol.com.br/wiki/Singleton
- http://www.guj.com.br/posts/list/57836.java
- https://imasters.com.br/artigo/6304
Resumindo,
Singleton indica que um determinado objeto é único para todo o sistema.
Ou seja, independente de onde você estiver no sistema, ele será um
objeto único e compartilhado. Com isso, podemos estabelecer que a nossa
classe MDIWindowHelper, que é “gerente” de janelas MDI, será única para todo o sistema Flex, ou seja, iremos usar o padrão Singleton nela.
No Action Script, podemos criar uma classe Singleton da seguinte forma:
class MySingleton<br /><br />{<br /><br /> private static var _instance: MySingleton;<br /><br /> public function MySingleton ( )<br /><br /> {<br /><br /> }<br /><br /> public static function getInstance( ): MySingleton<br /><br /> {<br /><br /> if (_instance == null) {<br /><br /> MySingleton. _instance = new MySingleton ( );<br /><br /> }<br /><br /> return MySingleton._instance;<br /><br /> }<br /><br />}Nesta
pequena classe criamos o método getInstance, que retorna uma instância
única da própria classe, independente de onde for chamado.
Agora vamos usar os conhecimentos aprendidos na nossa classe MDIWindowHelper.
package windows<br /><br />{<br /> import flexlib.mdi.containers.MDICanvas;<br /><br /> import mx.collections.ArrayCollection;<br /><br /> public class MDIWindowHelper<br /><br /> {<br /><br /> public var SystemMDICanvas:MDICanvas;<br /><br /> private static var _instance:MDIWindowHelper;<br /><br /> public static function GetInstance():MDIWindowHelper<br /><br /> {<br /> if (MDIWindowHelper._instance == null)<br /><br /> {<br /><br /> MDIWindowHelper._instance = new MDIWindowHelper();<br /> }<br /><br /> return MDIWindowHelper._instance;<br /> }<br /><br /><br /><br /> protected var Windows : ArrayCollection;<br /><br /> private function MDIWindowHelper()<br /><br /> {<br /> Windows = new ArrayCollection();<br /><br /><br /> Windows.addItem(new Janela01());<br /><br /> Windows.addItem(new Janela02());<br /><br /> Windows.addItem(new Janela03());<br /> }<br /><br /> public function GetWindow( name:String):MDIWindowBase<br /><br /> {<br /> for each (var w : IMDIWindow in Windows)<br /><br /> {<br /> if (w.GetName() == name)<br /><br /> return w as MDIWindowBase;<br /> } <br /> return null;<br /> }<br /> }<br />}Agora
que a nossa classe MDIWindowHelper é um Singleton, podemos a qualquer
momento do código chamá-la! Esta chamada pode ser feita da seguinte
forma:
MDIWindowHelper.GetInstance()Para que uma tela chame a outra, podemos usar o método GetWindow da classe Helper. Veja:
var Janela02:MDIWindowBase = MDIWindowHelper.GetInstance().GetWindow("Janela02");<br /><br />Janela02.FazerAlgumaCoisa();Resumindo, você pode “trocar” o conceito de variáveis globais (ruim) pelos singletons (bom).
Faltou um detalhe no padrão singleton, que é impedir
a instanciação da classe. Pode-se somente usar getInstance(). No Java,
C#, PHP, etc… as classes singleton possuem a visibilidade do seu
construtor marcado como private. Isso não é possível com Action Script,
mas existe um “jeitinho”… Você pode acessar a URL abaixo e conferir:
- http://www.igorcosta.com/blog/?p=740
- http://manishjethani.com/blog/2008/04/09/how-i-do-singletons-in-as3/
- http://www.gskinner.com/blog/archives/2006/07/as3_singletons.html
Dúvidas?? Só comentar.
Pessoal,
nos próximos artigos, irei continuar com as aplicações reais, só que
vou mudar o título do artigo. O próximo artigo será “Criando um Chat
com Flex e Zend”. Ele vai abordar a outra parte do desenvolvimento de
sistemas, que é relacionada a construir o seu próprio sistema. Enquanto
que nas partes 2, 3, 4 eu falei sobre sistemas reais vendidos a
terceiros, na 5ª parte eu falo sobre sistemas pequenos, que devem ser
criados com um mínimo de funcionalidades e evoluir de acordo com as
necessidades dos usuários. Abraços!







