Dev (Back & Front)ARTIGO

Criando sistemas reais com Flex – Parte 04

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:

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:

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!

trabalha com desenvolvimento web desde 1998 e atualmente dedica-se a escrever livros sobre programação e desenvolvimento de sistemas, disponíveis no seu site.

Ver perfil