Este pode nao ser o nome correcto, mas soa bem: AS3 Dynamic Singleton!
Como tinha falado no post anterior, uma class singleton é muito util em muitos casos, mas deixa de ser tão util quando necessitamos de a usar para guardar muitas variaveis, que teriamos que declarar cada uma na class. Mas uma das maravilhas que o as3 nos propõe é a criação de uma class que não necessita de declarar variaveis e pode comportar-se como um objecto onde adicionamos e removemos propriedades sem estas serem conhecidas pela propria class.
Falo dos descriptores de acesso, (falei deles no meu e-book/tutorial de action script), e de um em particular, o dynamic, que para aqueles menos familiarizados permite que a class seja alterada em runtime, ou seja, vai permitir adicionar e remover propriedades de si mesma… e se juntarmos isto a uma class singleton que derive por exemplo de um objecto, teremos uma class singleton, acessivel em toda a aplicação com a possibilidade de adicionarmos e removermos variaveis com uma simples instrução.
Um dos problemas que se pode colocar, é que numa aplicação grande com mais que um programador, ele tem que ser informado das variaveis adicionadas dinamicamente na class, visto que elas não aparecem em lado nenhum… mas vamos a um exemplo antes que as coisas começem a complicar a sua compreensão.
Tendo a class singleton anterior, adicionando o descriptor dynamic :
package com.config
{
public dynamic class meuObjecto extends Object
{
public var variavelExemplo:String=”Ola Singleton”;
private static var instance:meuObjecto;
private static var allowInstantiation:Boolean;
public static function getInstance():meuObjecto {
if (instance == null) {
allowInstantiation = true;
instance = new meuObjecto();
allowInstantiation = false;
}
return instance;
}
public function meuObjecto():void {
if (!allowInstantiation) {
throw new Error(”Erro: Criação de instancia nao permitida: Use meuObjecto.getInstance() em vez de new.”);
}
}
}
}
A partir daqui a nossa class é exactamente igual, mas com a vantagem de esta ser dinamica, um pequeno promenor que nos ajuda em muito, veja o caso:
quero que a minha class tenha as variaveis data, nome, morada, telefone, fax… Da forma convencional, teria que as declarar todas na minha class singleton:
public var data:String =”";
public var nome:String =”";
public var morada:String =”";
…etc…
Mas… com uma class dynamic apenas preciso de fazer:
import com.config.meuObjecto;
var tmp:meuObjecto = meuObjecto.getInstance();
e fazer a atribuição normal como se as variaveis estivessem na realidade declaradas dentro da class:
tmp.data=”02/03/09″;
tmp.nome=”AS 3″;
tmp.morada=”Tsw Blog, ip: 255 555 555 55, DNS: 655.655.655.655 “;
tmp.telefone=”65465465″;
tmp.fax=”64564565465″;
e poderiamos adicionar uma centena de variaveis que elas seriam guardadas e passadas a todas as instancias da class, verifiquem de seguida por exemplo:
var tmp5:meuObjecto = meuObjecto.getInstance();
Se fizerem trace(“->”+tmp5.morada); ele vai devolver a morada inserida na class por via do tmp.morada=”…”; ou de qualquer instancia.
Isto pode justificar muitas aplicações, mas uma das mais uteis que uso é o preenchimento automatica de uma class singleton dinamica com dados vindos de um ficheiro ou base de dados de configurações. No próximo post virei falar deste aspecto e exemplificar este ponto.
Espero que seja util.
Abraço.



