Nell'esempio PlayList vengono illustrate alcune tecniche di lavoro con gli array, nel contesto di un'applicazione per la gestione di sequenze di brani musicali. Queste tecniche sono:
-
Creazione di un array indicizzato
-
Aggiunta di elementi a un array indicizzato
-
Ordinamento di un array di oggetti in base a varie proprietà, utilizzando varie opzioni di ordinamento
-
Conversione di un array in una stringa delimitata da caratteri
Per ottenere i file dell'applicazione per questo esempio, visitate la pagina
www.adobe.com/go/learn_programmingAS3samples_flash_it
. I file dell'applicazione PlayList si trovano nella cartella Samples/PlayList. L'applicazione è composta dai seguenti file:
File
|
Descrizione
|
PlayList.mxml
o
PlayList.fla
|
Il file principale dell'applicazione in Flash (FLA) o Flex (MXML)
|
com/example/programmingas3/playlist/PlayList.as
|
Classe che rappresenta un elenco di brani. Utilizza un oggetto Array per memorizzare l'elenco e gestisce l'ordinamento delle voci dell'elenco.
|
com/example/programmingas3/playlist/Song.as
|
Oggetto valore rappresentante informazioni su un singolo brano. Le voci gestite dalla classe PlayList sono istanze di Song.
|
com/example/programmingas3/playlist/SortProperty.as
|
Pseudo-enumerazione i cui valori disponibili rappresentano le proprietà della classe Song e in base alla quale è possibile ordinare un elenco di oggetti Song.
|
Panoramica della classe PlayList
La classe PlayList consente di gestire una serie di oggetti Song. Essa presenta una serie di metodi pubblici con funzionalità per l'aggiunta di brani all'elenco di riproduzione (metodo
addSong()
) e per l'ordinamento dei brani nell'elenco (metodo
sortList()
). Inoltre, la classe include una proprietà accessoria di sola lettura,
songList
, che consente l'accesso alla serie di brani effettivamente presenti nell'elenco di riproduzione. Internamente, la classe PlayList tiene traccia dei brani mediante una variabile privata di Array:
public class PlayList
{
private var _songs:Array;
private var _currentSort:SortProperty = null;
private var _needToSort:Boolean = false;
...
}
Oltre alla variabile di Array
_songs
, utilizzata dalla classe PlayList per tenere traccia dell'elenco dei brani, vi sono altre due variabili private che segnalano se l'elenco deve essere ordinato o meno (
_needToSort
) e in base a quale proprietà l'elenco viene aggiornato in un dato momento (
_currentSort
).
Come avviene per tutti gli oggetti, la dichiarazione di un'istanza di Array è solo metà del lavoro di creazione di un Array. Prima di accedere alle proprietà o ai metodi di un'istanza di Array, è necessario creare l'istanza nella funzione di costruzione della classe PlayList.
public function PlayList()
{
this._songs = new Array();
// Set the initial sorting.
this.sortList(SortProperty.TITLE);
}
La prima riga della funzione di costruzione crea un'istanza della variabile
_songs
pronta per essere utilizzata. Inoltre, il metodo
sortList()
viene chiamato per impostare la proprietà iniziale in base alla quale effettuare l'ordinamento.
Aggiunta di un brano all'elenco
Se un utente aggiunge un nuovo brano nell'applicazione, il codice nel modulo di immissione dati chiama il metodo
addSong()
della classe PlayList.
/**
* Adds a song to the playlist.
*/
public function addSong(song:Song):void
{
this._songs.push(song);
this._needToSort = true;
}
All'interno di
addSong()
, viene chiamato il metodo
push()
dell'array
_songs
e il nuovo oggetto Song trasmesso ad
addSong()
come nuovo elemento viene inserito nell'array. Con il metodo
push()
, il nuovo elemento viene aggiunto alla fine dell'array, a prescindere da qualsiasi ordinamento precedentemente applicato. Di conseguenza, dopo la chiamata al metodo
push()
, è possibile che l'elenco dei brani non sia più ordinato correttamente e che quindi la variabile
_needToSort
sia impostata su
true
. In teoria, il metodo
sortList()
potrebbe essere chiamato immediatamente, per evitare di dover rilevare se l'elenco è stato o meno ordinato nel momento specificato. In pratica, tuttavia, è necessario che l'elenco dei brani sia ordinato solo immediatamente prima del suo recupero. Posticipando l'operazione di ordinamento, l'applicazione non esegue infatti gli ordinamenti non necessari, nel caso, ad esempio, vengano aggiunti vari brani all'elenco prima del suo recupero.
Ordinamento dell'elenco di brani
Poiché le istanze di Song gestite dall'elenco di riproduzione sono oggetti complessi, gli utenti dell'applicazione possono ordinare l'elenco in base a varie proprietà, quali titolo del brano o anno di pubblicazione. Nell'applicazione PlayList, l'attività di ordinamento dell'elenco dei brani è suddiviso in tre fasi: identificazione della proprietà in base alla quale l'elenco deve essere ordinato, indicazione delle opzioni di ordinamento da utilizzare ed esecuzione dell'operazione di ordinamento vera e propria.
Proprietà di ordinamento
Un oggetto Song è in grado di tenere traccia di varie proprietà, incluso titolo del brano, artista, anno di pubblicazione, nome del file e una serie di generi selezionati dall'utente associati a ciascun brano. Tra queste proprietà, solo le prime tre sono utili per l'ordinamento. Per ragioni di praticità, l'esempio include la classe SortProperty, che funge da elenco di valori che rappresentano le proprietà disponibili per eseguire l'ordinamento.
public static const TITLE:SortProperty = new SortProperty("title");
public static const ARTIST:SortProperty = new SortProperty("artist");
public static const YEAR:SortProperty = new SortProperty("year");
La classe SortProperty contiene tre costanti,
TITLE
,
ARTIST
e
YEAR
, ognuna delle quali contiene una stringa con il nome effettivo della proprietà della classe Song associata utilizzabile per l'ordinamento. Nella parte restante del codice, per indicare una proprietà di ordinamento viene utilizzato un membro dell'enumerazione. Ad esempio, nella funzione di costruzione PlayList, l'elenco viene ordinato chiamando il metodo
sortList()
, come indicato di seguito:
// Set the initial sorting.
this.sortList(SortProperty.TITLE);
Poiché la proprietà in base alla quale eseguire l'ordinamento viene specificata come
SortProperty.TITLE
, i brani vengono ordinati in base al titolo.
Ordinamento in base a una proprietà e impostazione delle opzioni di ordinamento
Il lavoro di effettivo ordinamento dell'elenco dei brani viene eseguito dalla classe PlayList mediante il metodo
sortList()
, come indicato di seguito:
/**
* Sorts the list of songs according to the specified property.
*/
public function sortList(sortProperty:SortProperty):void
{
...
var sortOptions:uint;
switch (sortProperty)
{
case SortProperty.TITLE:
sortOptions = Array.CASEINSENSITIVE;
break;
case SortProperty.ARTIST:
sortOptions = Array.CASEINSENSITIVE;
break;
case SortProperty.YEAR:
sortOptions = Array.NUMERIC;
break;
}
// Perform the actual sorting of the data.
this._songs.sortOn(sortProperty.propertyName, sortOptions);
// Save the current sort property.
this._currentSort = sortProperty;
// Record that the list is sorted.
this._needToSort = false;
}
Se si effettua l'ordinamento in base al titolo o all'artista, è possibile applicare un ordine alfabetico, mentre se si utilizza l'anno di pubblicazione, è più logico applicare un ordine numerico. L'istruzione
switch
viene utilizzata per definire l'opzione di ordinamento appropriata, memorizzata nella variabile
sortOptions
, in base al valore specificato nel parametro
sortProperty
. Anche in questo caso, per distinguere le varie proprietà vengono utilizzati i membri dell'enumerazione con nome anziché valori hard-coded.
Una volta impostati proprietà e opzioni di ordinamento, l'array
_songs
viene ordinato chiamando il metodo
sortOn()
e inviando tali valori come parametri. La proprietà di ordinamento corrente viene registrata, così come l'avvenuto ordinamento dell'elenco dei brani.
Combinazione di elementi di array in stringhe delimitate da caratteri
Oltre che per la gestione dell'elenco dei brani nella classe PlayList, gli array vengono utilizzati in questo esempio anche nella classe Song per la gestione degli elenchi dei generi da associare ai singoli brani. Considerate il seguente frammento di codice tratto dalla definizione della classe Song:
private var _genres:String;
public function Song(title:String, artist:String, year:uint, filename:String, genres:Array)
{
...
// Genres are passed in as an array
// but stored as a semicolon-separated string.
this._genres = genres.join(";");
}
Quando create una nuova istanza di Song, il parametro
genres
utilizzato per specificare il genere (o i generi) a cui il brano appartiene viene definito come un'istanza di Array. Ciò consente di raggruppare facilmente più generi in una singola variabile da inviare alla funzione di costruzione. Tuttavia, internamente, la classe Song conserva i generi nella variabile privata
_genres
come un'istanza di String separata da punto e virgola. Il parametro Array viene convertito in una stringa separata da punto e virgola mediante chiamata al metodo
join()
con il valore letterale di stringa
";"
come delimitatore specificato.
Grazie allo stesso token, le proprietà accessor
genres
consentono l'impostazione o il recupero dei generi come un array:
public function get genres():Array
{
// Genres are stored as a semicolon-separated String,
// so they need to be transformed into an Array to pass them back out.
return this._genres.split(";");
}
public function set genres(value:Array):void
{
// Genres are passed in as an array,
// but stored as a semicolon-separated string.
this._genres = value.join(";");
}
L'accessor
genres
set
si comporta esattamente come la funzione di costruzione, in quanto accetta un Array e chiama il metodo
join()
per convertirlo in una stringa separata da punto e virgola. L'accessor
get
esegue l'operazione opposta: viene chiamato il metodo
split()
della variabile
_genres
, per suddividere la stringa in una array di valori mediante il delimitatore specificato (il valore letterale di stringa
";"
come sopra).
|
|
|