In questa settimo articolo che rigiarda la
Object Oriented Programming con Actionscript 3.0 vedremo come lavorare con i packages.
I packages non sono altro che pacchetti di classi e servono per suddividere ed organizzare il nostro progetto Flash.
Chiaramente più un' applicazione è importante e ramificata, più conviene suddividere le logiche in pacchetti in modo da creare una struttura ben organizzata ma soprattutto modulare.
Ogni pacchetto avrà le sue classi in base al ' tema ' del pacchetto.
Ad esempio, se volessimo implementare un carrello della spesa in Flash ad un e-commerce, avremmo un paccheto con nome ' compratore ', uno ' carrello ', un altro ' sistemaPagamento ' ecc ecc...
In questo modo avremo tutto sotto controllo e se qualcosa non dovesse girare come dovrebbe sappiamo subito in quale package controllare senza dover controllare tutta l' applicazione.
Ogni package deve avere un nome unico.
Ogni classe all' interno di un package deve avere un nome unico, quindi nel package ' compratore ' potrà esistere una sola classe con nome Utente. Potrebbe però esistere un' altra classe Utente all' interno del package ' carrello '.
All' interno di un package possiamo avere un altro package che viene definito come subpackage.
Per convenzione il package principale è sempre definito con il dominio di primo livello dello sviluppatore o organizzazione, ad esempio nel mio caso ( flepstudio.org ) il package principale sarebbe ' org ' con un subpackage ' flepstudio '. In sostanza il progetto sarebbe: org.flepstudio.nomeProgetto.categoria.nomeClasse.
Mi spiego meglio:
mettiamo caso che voglio costruire un' applicazione che chiamo ' sito '.
In questo caso avrei: org.flepstudio.sito e poi ad esempio potrei suddividere le mie classi per categorie: org.flepstudio.sito.utilita e org.flepstudio.sito.servizi oppure ancora org.flepstudio.sito.portfolio o anche org.flepstudio.sito.tutorials ecc ecc...
Vediamo degli esempi concreti...
Creo il FLA del progetto che chiamo ' settima.fla '.
Creo una cartella ( in questo caso non la chiameremo cartella ma package ) con nome ' org '. Al suo interno un' altra cartella con nome ' flepstudio'.
Adesso creo la Document Class del progetto, un file AS che salvo con nome ' Settima.as ' all' interno del package flepstudio:
implementata in questo modo:
Code:
package org.flepstudio
{
import flash.display.MovieClip;
public class Settima extends MovieClip
{
public function Settima()
{
trace('La Document Class è stata instanziata correttamente');
}
}
}
Da notare la prima riga che definisce il package
package org.flepstudio
stiamo dicendo a Flash che la classe Settima ha la seguente path: org.flepstudio
Fino ad ora abbiamo sempre assegnato una Document Class al FLA del progetto nel modo più ovvio e cioè entrambi si trovavano sempre nella stessa directory, nello stesso package.
In questo caso, invece, assegno la Document Class a settima.fla scrivendo org.flepstudio.Settima nel campo Document Class del pannello proprietà di settima.fla .
Pubblicando l' SWF abbiamo il seguente output:
La Document Class è stata istanziata correttamente
Adesso creo un altro package all' interno di flepstudio ( quindi dove si trova Settima.as ) che chiamo ' sito '.
Adesso creo 4 packages ( cartelle ) all' interno di sito e le chiamo:
- gallery
- portfolio
- servizi
- utilita
Credo sia scontato che in ognuno di questi packages andremo a creare delle classi che gestiranno la nostra applicazione. In questo modo abbiamo una struttura modulare ed ogni package avrà le proprie classi che gestiranno una parte specifica dell' intero progetto.
Facciamo un esempio, creando la classe Images.as nel package org.flepstudio.sito.gallery, quindi salviamo la classe Images.as nella cartella ' gallery '.
Images.as sarà dichiarata in questo modo:
Code:
package org.flepstudio.sito.gallery
{
public class Images
{
public function Images()
{
trace('La classe Images è stata istanzata correttamente');
}
}
}
A questo punto, per istanziare la classe Images dalla Document Class, devo prima importare Images in Settima.as e poi istanziare Images, quindi torno in Settima.as e scrivo :
Code:
package org.flepstudio
{
import flash.display.MovieClip;
import org.flepstudio.sito.gallery.Images;
public class Settima extends MovieClip
{
private var images:Images;
public function Settima()
{
trace('La Document Class è stata instanziata correttamente');
images=new Images();
}
}
}
import org.flepstudio.sito.gallery.Images ho importato Images.as dicendo a Flash dove si trova appunto la classe Images
private var images:Images; creo una proprietà di tipo Images ( una volta importata la classe Images, possiamo riferirci a lei senza il percorso dell' intero package in cui si trova )
images=new Images(); istanzio la classe Images
e ottengo il seguente output:
La Document Class è stata instanziata correttamente
La classe Images è stata istanzata correttamente
Altro esempio, creo due classi ( Cliente1.as e Cliente2.as ) nel package ' portfolio ':
Code:
package org.flepstudio.sito.portfolio
{
public class Cliente1
{
public function Cliente1()
{
trace('La classe Cliente1 è stata istanzata correttamente');
}
}
}
Code:
package org.flepstudio.sito.portfolio
{
public class Cliente2
{
public function Cliente2()
{
trace('La classe Cliente2 è stata istanzata correttamente');
}
}
}
le importo e le istanzio dalla Document Class ( Settima.as ) in questo modo:
Code:
package org.flepstudio
{
import flash.display.MovieClip;
import org.flepstudio.sito.gallery.Images;
import org.flepstudio.sito.portfolio.*;
public class Settima extends MovieClip
{
private var images:Images;
private var cliente1:Cliente1;
private var cliente2:Cliente2;
public function Settima()
{
trace('La Document Class è stata instanziata correttamente');
images=new Images();
cliente1=new Cliente1();
cliente2=new Cliente2();
}
}
}
import org.flepstudio.sito.portfolio.*; con l' asterisco dico a Flash di importare tutte le classi presenti nel package portfolio
dichiaro le classi
private var cliente1:Cliente1;
private var cliente2:Cliente2;
istanzio le classi
cliente1=new Cliente1();
cliente2=new Cliente2();
ed ottengo il seguente output:
La Document Class è stata instanziata correttamente
La classe Images è stata istanzata correttamente
La classe Cliente1 è stata istanzata correttamente
La classe Cliente2 è stata istanzata correttamente
Altro esempio, creo una classe Design.as nel package servizi:
Code:
package org.flepstudio.sito.servizi
{
public class Design
{
public function Design()
{
trace('La classe Design è stata istanzata correttamente');
}
}
}
e una classe Calcolatore.as nel package utilita:
Code:
package org.flepstudio.sito.utilita
{
public class Calcolatore
{
public function Calcolatore()
{
trace('La classe Calcolatore è stata istanzata correttamente');
}
}
}
Importo, dichiaro ed istanzio Design.as nella Document Class:
Code:
package org.flepstudio
{
import flash.display.MovieClip;
import org.flepstudio.sito.gallery.Images;
import org.flepstudio.sito.portfolio.*;
import org.flepstudio.sito.servizi.Design;
public class Settima extends MovieClip
{
private var images:Images;
private var cliente1:Cliente1;
private var cliente2:Cliente2;
private var design:Design;
public function Settima()
{
trace('La Document Class è stata instanziata correttamente');
images=new Images();
cliente1=new Cliente1();
cliente2=new Cliente2();
design=new Design();
}
}
}
fin quì niente di nuovo, ma se ora volessi istanziare Calcolatore.as da Design.as ?
Devo importare, dichiarare ed istanziare Calcolatore in Design così:
Code:
package org.flepstudio.sito.servizi
{
import org.flepstudio.sito.utilita.Calcolatore;
public class Design
{
private var calcolatore:Calcolatore;
public function Design()
{
trace('La classe Design è stata istanzata correttamente');
calcolatore=new Calcolatore();
}
}
}
import org.flepstudio.sito.utilita.Calcolatore; importo Calcolatore
dichiaro
private var calcolatore:Calcolatore;
istanzio
calcolatore=new Calcolatore();
ed ottengo questo output
La Document Class è stata instanziata correttamente
La classe Images è stata istanzata correttamente
La classe Cliente1 è stata istanzata correttamente
La classe Cliente2 è stata istanzata correttamente
La classe Design è stata istanzata correttamente
La classe Calcolatore è stata istanzata correttamente
Chiaramente l' istanza di Calcolatore che si chiama calcolatore sarà gestibile non dalla Document Class ma da Design.as in quanto appunto si trova fisicamente in Design.as .
Allego i files: