Esempio di array: PlayList

Flash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive

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 genresset 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).