23. Librerie e Pacchetti
Introduzione
In questo capitolo vedremo gli strumenti che ActionScript 3 ci mette a disposizione per costruire, condividere ed utilizzare al meglio le nostre librerie di codice.
Fino ad ora non abbiamo specificato alcun nome per i pacchetti (package) utilizzati, limitandoci a specificare la sola direttiva package per racchiudere le definizioni delle nostre classi.
In questo modo abbiamo avuto modo di sfruttare unicamente la visibilità di default prevista dal linguaggio, ossia internal, che prevede un accesso a metodi, classi ecc... esclusivamente dalle classi "interne", ossia presenti nella build path, cioè la cartella dove risiedono i file di progetto. Vediamo innanzitutto come è possibile definire un percorso di classe personalizzato attraverso le impostazioni del Flash IDE. Sotto "Modifica -> Preferenze" (Ctrl + U), selezionate la categoria ActionScript e cliccate sull'ultimo pulsante in basso "Impostazioni ActionScript 3.0". Attraverso questo piccolo pannello possiamo aggiungere o eliminare dei percorsi in cui Flash andrà a cercare automaticamente le definizioni per le classi utilizzate in una applicazione qualsiasi. |
I pacchetti ci consentiranno di organizzare gerarchicamente le nostre classi, evitando conflitti di nomi quando condividiamo il codice con altri programmatori o quando, creando progetti non correlati fra loro o pacchetti non necessariamente in relazione, ci capita di avere più classi con lo stesso nome.
Esempio pacchetti
Negli esempi che seguono non definirò nessun percorso di classe aggiuntivo, ma organizzerò il codice in pacchetti residenti direttamente nella build path del progetto.
Supponiamo di dover sviluppare un'applicazione che si appoggia in remoto a dello script server-side in linguaggio PHP 5 oppure utilizzando la tecnologia offerta da Flash Media Server 2.
A questo punto ci ritroviamo con due Gateway che avranno lo scopo di fornirci gli strumenti per comunicare con queste due tecnologie molto diverse, di conseguenza potremmo avere due classi entrambe di nome Gateway ma dal contenuto non necessariamente correlato, tenendo presente che per sviluppare la medesima applicazione ci sono molteplici soluzioni, e questa è stata da me ideata puramente a scopo didattico. In questa schermata
possiamo osservare come è strutturata la directory del nostro progetto. |
remoting/fms2/Gateway.as (remoting.fms2.Gateway)
package remoting.fms2
{
/* Dichiaro la classe come "public" per renderla accessibile anche
nei casi in cui l'accesso non venga effettuato dalla "build path" */
public class Gateway
{
// ...
public function Gateway(/* ... */):void
{
trace("Flash Media Server 2 Gateway"); // ...
}
// ...
}
}remoting/php5/Gateway.as (remoting.php5.Gateway)
package remoting.php5
{
public class Gateway
{
// ...
public function Gateway(/* ... */):void
{
trace("PHP5 Gateway"); // ...
}
// ...
}
}Supponiamo ora di dover costruire un'applicazione che necessita di comunicare allo stesso tempo con i due linguaggi, dovremo importare entrambe le classi Gateway generando un possibile conflitto di nomi, che risolveremo proprio grazie alla struttura gerarchica pocanzi creata con i pacchetti.
Vediamo innanzitutto alcuni casi in cui il compilatore non traccia alcuna avvertenza, utilizzando la prima libreria importata come predefinita per tutte le istanze che troverà nel seguito dello script :
package
{
import remoting.fms2.Gateway;
import remoting.php5.Gateway;
import flash.display.MovieClip;
public class HelloWorld extends MovieClip
{
public function HelloWorld():void
{
var gate1:Gateway = new Gateway(); // Ambiguo, verrà utilizzata "fms2.Gateway"
var gate2:Gateway = new Gateway(); // Ambiguo, verrà utilizzata "fms2.Gateway"
}
}
}Entrambe le istanze di Gateway gate1 e gate2, tracceranno in Output il messaggio :
Flash Media Server 2 Gateway
Invertendo l'ordine di importazione si ottiene l'effetto contrario :
package
{
import remoting.php5.Gateway; // Stavolta importiamo prima "php5.Gateway"
import remoting.fms2.Gateway;
import flash.display.MovieClip;
public class HelloWorld extends MovieClip
{
public function HelloWorld():void
{
var gate1:Gateway = new Gateway(); // Ambiguo, verrà utilizzata "php5.Gateway"
var gate2:Gateway = new Gateway(); // Ambiguo, verrà utilizzata "php5.Gateway"
}
}
}Per risolvere il conflitto utilizzeremo il nome esteso partendo dal pacchetto iniziale ogni volta che ci riferiamo alla classe Gateway :
package
{
import remoting.fms2.Gateway;
import remoting.php5.Gateway;
import flash.display.MovieClip;
public class HelloWorld extends MovieClip
{
public function HelloWorld():void
{
var gate1:fms2.Gateway = new fms2.Gateway(); // Ancora ambiguo, genera errore!
var gate2:remoting.fms2.Gateway = new remoting.fms2.Gateway(); // Ok, usa la classe corretta!
var gate3:remoting.php5.Gateway = new remoting.php5.Gateway(); // Ok, usa la classe corretta!
}
}
}Importare più pacchetti
Un'altra interessante feature è la possibilità di includere più classi di un pacchetto mediante l'utilizzo del carattere asterisco.
package
{
import flash.events.*;
// ...
}Con il comando soprastante abbiamo incluso tutte le classi appartenenti al pacchetto events di
flash.
Evitate di utilizzare questo metodo qualora nel pacchetto specificato ci siano classi con lo stesso nome, come nell'esempio precedente
sui Gateway, perchè otterrete inevitabilmente del codice ambiguo.
package
{
import remoting.*;
import flash.display.MovieClip;
public class HelloWorld extends MovieClip
{
public function HelloWorld():void
{
var gate1:remoting.fms2.Gateway = new remoting.fms2.Gateway(); // Errore!
var gate2:remoting.php5.Gateway = new remoting.php5.Gateway(); // Errore!
}
}
}In questo caso specifico riceviamo errore perchè all'interno del pacchetto remoting non vi è alcuna definizione di classe Gateway, che troviamo invece nei pacchetti fms2 e php5.
- Linguaggi:
- Tags:
