3.4 IMPLEMENTAÇÃO
3.4.2 Implementação das bibliotecas compartilhadas
Outras sessões do relatório mostram quantas vezes cada instrumento foi colocado no palco e quantas vezes e por quanto tempo cada música e cada sonoridade foram utilizadas. Na Figura 16 apresenta-se a imagem da sessão do relatório que contém uma lista com os erros cometidos pelo aluno no módulo Jogo. O objetivo do jogo é clicar na miniatura do músico que executa um instrumento sorteado pelo Zorelha. Um erro acontece quando o aluno clica na miniatura de um músico que toca um instrumento diferente daquele que foi sorteado pelo Zorelha. Como o aluno pode jogar várias partidas os erros são armazenados por partida. Na Figura 16 apresenta-se uma lista dos erros cometidos em duas partidas.
Figura 16. Relatório dos erros cometidos pelo aluno no módulo “Jogo”
Os objetos gráficos e sonoros que poderiam ser reutilizados no Zorelha foram empacotados em bibliotecas (arquivos independentes do filme principal) com o objetivo de minimizar a quantidade de downloads necessários para a visualização das atividades disponibilizadas no software. O diagrama de componentes da Figura 17 mostra as bibliotecas compartilhadas que foram utilizadas na implementação do Zorelha.
Cada um dos componentes no diagrama da Figura 17 representa um arquivo, mais especificamente um filme compilado pelo Flash no formato swf. A estrutura de componentes utilizada e demonstrada no diagrama consiste em um filme principal (index.swf) que carrega outros filmes de acordo com as escolhas dos alunos durante a utilização do Zorelha. O filme principal é o ponto de entrada na execução do aplicativo e armazena os objetos que são comuns para todas as atividades. Os itens que são específicos para determinadas atividades são armazenados em arquivos swf separados, as bibliotecas compartilhadas.
No diagrama de componentes da Figura 17 pode-se observar três grupos de componentes que representam as bibliotecas compartilhadas das sonoridades, das músicas e dos detalhes dos instrumentos musicais.
As bibliotecas das sonoridades armazenam somente objetos gráficos, a saber: os músicos, instrumentos musicais e miniaturas dos músicos que tocam os instrumentos musicais da sonoridade.
As bibliotecas das músicas armazenam apenas arquivos de som. Como pode-se observar no diagrama de componentes existe uma biblioteca (um filme swf) para cada par “música-sonoridade”.
Cada uma destas bibliotecas armazena cinco arquivos de som, cada um destes arquivos contendo a gravação de um instrumento musical diferente. A biblioteca “marchaSoldado-rock.swf”, por exemplo, contém as gravações dos instrumentos baixo, bateria, guitarra, pandeiro meia-lua e teclado. Já a biblioteca “marchaSoldado-samba.swf” contém as gravações dos instrumentos cavaquinho, malacacheta, violão, flauta e pandeiro.
As bibliotecas dos detalhes dos instrumentos armazenam os objetos tanto gráficos quanto sonoros utilizados durante a exploração de um instrumento. A exploração do instrumento, no contexto do Zorelha, refere-se à atividade de escolher qualquer um dos instrumentos disponíveis nas músicas e então clicar sobre as “partes clicáveis” do mesmo para ouvir os seus sons, por exemplo, clicando nas teclas do teclado, nas cordas da guitarra, nas peças da bateria, etc.
Figura 17. Diagrama de componentes
Criou-se uma hierarquia de classes para representar os três grupos de bibliotecas compartilhadas descritas anteriormente. As classes apresentadas no diagrama da Figura 18 são
Cada filme compilado no Flash CS3 pode ter uma classe definida como Document Class. Então, depois de compilado o filme do Flash passa a ser uma instância da classe usada como Document Class. Cada um dos três grupos de bibliotecas compartilhadas citados anteriormente utiliza uma das classes mostrada na Figura 18 como Document Class, de forma que depois de compiladas as bibliotecas compartilhadas tornam-se instâncias destas classes.
A classe base para as bibliotecas compartilhadas (BibliotecaCompartilhada) fornece um método para inicialização de uma biblioteca. O processo de inicialização consiste em instanciar e, quando necessário, estabelecer os vínculos entre os objetos instanciados. Como exemplo do estabelecimento de vínculo entre objetos instanciados pode-se citar a criação das instâncias de um determinado músico e também de seu instrumento e, logo em seguida, a vinculação ou associação do instrumento ao músico que o executa e vice-versa.
Figura 18. Classes usadas para representar a hierarquia de bibliotecas compartilhadas
Cada classe que encapsula uma biblioteca compartilhada sobrescreve o método “inicializa()”
da classe base BibliotecaCompartilhada (Figura 18) para fornecer uma implementação específica da inicialização de acordo com o tipo de biblioteca (biblioteca de sonoridade, de música ou de
detalhes de um instrumento). A principal função destas rotinas de inicialização é a instanciação dos objetos armazenados na biblioteca. Este processo exigiria diversas classes especializadas caso a criação dos objetos fosse feita especificamente para cada biblioteca compartilhada (pode-se observar o número de bibliotecas distintas no diagrama de componentes da Figura 17) e não de forma genérica, como de fato foi feito.
Implementou-se um forma genérica para instanciar e configurar as classes dos objetos armazenados nas bibliotecas com o objetivo de evitar a criação de várias classes especializadas na instanciação e configuração dos objetos específicos de cada biblioteca.
Cada filme do Flash CS3, depois de compilado e instanciado, possui um atributo chamado applicationDomain, uma instância da classe de mesmo nome. Esta classe fornece acesso às definições de todas as classes (metaclasses) compiladas em um filme do Flash. Pode-se entender que estas metaclasses fornecidas por applicationDomain fornecem os “esqueletos” das classes. A partir desses “esqueletos” pode-se criar instâncias dos objetos, no caso do Zorelha, instâncias de músicos, instrumentos, sons de instrumentos, etc.
A Figura 19 demonstra um trecho de código utilizado para criar instâncias dos objetos que representam os músicos em uma biblioteca compartilhada de sonoridade, sendo que em cada sonoridade existem personagens músicos diferentes. Entretanto, com a criação de instâncias através das metaclasses o mesmo trecho de código é utilizado para criar os objetos de todas as sonoridades, sem a necessidade de uma subclasse para cada sonoridade específica.
No exemplo citado anteriormente descreveu-se o processo de criação dos objetos armazenados nas bibliotecas compartilhadas das sonoridades. Porém, utilizou-se a mesma abordagem para a inicialização das demais bibliotecas compartilhadas, variando apenas o tipo e a forma de configuração dos objetos criados evitando-se, novamente, a criação de classes ou métodos específicos para cada uma das bibliotecas compartilhadas.
Além das classes que encapsulam as bibliotecas compartilhadas criou-se também uma classe para tratar do carregamento destas bibliotecas, a classe Carregador (Figura 18). Esta classe possui métodos para o carregamento de cada um dos três tipos de bibliotecas compartilhadas citadas anteriormente.
public class BibliotecaCompartilhadaDeSonoridade ...{
function populaArrayDeMusicos() { this.musicos = new Array();
var nomesDosMusicos:Array = Nomes.getNomesDosMusicos();
for ( var i = 0; i < nomesDosMusicos.length; i++ ) { var musico:Musico =
this.getInstanciaDeObjetoCompartilhado(nomesDosMusicos[i]);
if ( musico != null ) {
this.musicos.push( musico );
} } }
function getInstanciaDeObjetoCompartilhado(nomeDaClasse:String) { var definicao:Class = this.getDefinicaoDeClasse( nomeDaClasse );
var instancia = null;
if ( definicao != null ) {
instancia = new definicao();
//uma instância baseada na ‘definição da classe’ é criada }
return instancia;
}
function getDefinicaoDeClasse(nomeDaClasse:String):Class {
var appDomain:ApplicationDomain = this.loaderInfo.applicationDomain;
if (appDomain.hasDefinition( nomeDaClasse ) ) {
return Class(appDomain.getDefinition( nomeDaClasse ) );
}
return null;
} ...
Figura 19. Criando objetos através de metaclasses