L’exemple PlayList présente les techniques d’utilisation des tableaux, dans le contexte d’une application de lecture musicale qui gère une liste de chansons. Ces techniques sont les suivantes :
-
Création d’un tableau indexé
-
Ajout d’éléments à un tableau indexé
-
Tri d’un tableau d’objets en fonction de différentes propriétés, à l’aide d’options de tri différentes
-
Conversion d’un tableau en une chaîne séparée par des caractères
Pour obtenir les fichiers d’application de cet exemple, voir
www.adobe.com/go/learn_programmingAS3samples_flash_fr
. Les fichiers d’application PlayList se trouvent dans le dossier Samples/PlayList. L’application se compose des fichiers suivants :
Fichier
|
Description
|
PlayList.mxml
ou
PlayList.fla
|
Fichier d’application principal dans Flash (FLA) ou Flex (MXML).
|
com/example/programmingas3/playlist/PlayList.as
|
Classe représentant une liste de morceaux. Elle utilise un tableau pour enregistrer la liste et gère le tri des éléments de la liste.
|
com/example/programmingas3/playlist/Song.as
|
Objet de valeur représentant des informations sur une seule chanson. Les éléments gérés par la classe PlayList sont des occurrences Song.
|
com/example/programmingas3/playlist/SortProperty.as
|
Pseudo-énumération dont les valeurs disponibles représentent les propriétés de la classe Song en fonction desquelles une liste d’objets Song peut être triée.
|
Présentation de la classe PlayList
La classe PlayList gère un ensemble d’objets Song. Elle a des méthodes publiques qui permettent d’ajouter une chanson à la liste de lecture (la méthode
addSong()
) et de trier les chansons dans la liste (la méthode
sortList()
). En outre, la classe comprend une propriété d’accesseur en lecture seule,
songList
, qui permet d’accéder au groupe de chansons dans la liste de lecture. En interne, la classe PlayList conserve une trace de ses chansons à l’aide d’une variable Array privée :
public class PlayList
{
private var _songs:Array;
private var _currentSort:SortProperty = null;
private var _needToSort:Boolean = false;
...
}
En plus de la variable Array
_songs
utilisée par la classe PlayList pour conserver une trace de sa liste de chansons, deux autres variables privées vérifient si la liste doit être triée (
_needToSort
) et contrôlent la propriété sur laquelle est basé le tri de la liste de chansons à un moment donné (
_currentSort
).
Comme avec tous les objets, lorsque vous avez déclaré une occurrence de Array, vous n’avez effectué que la moitié du travail consistant à créer un tableau. Avant d’accéder à des méthodes ou à des propriétés d’une occurrence de Array, cette dernière doit être instanciée dans le constructeur de la classe PlayList.
public function PlayList()
{
this._songs = new Array();
// Set the initial sorting.
this.sortList(SortProperty.TITLE);
}
La première ligne du constructeur instancie la variable
_songs
pour qu’elle puisse être utilisée. En outre, la méthode
sortList()
est appelée pour définir la propriété de tri initiale.
Ajout d’une chanson à la liste
Lorsqu’un utilisateur ajoute une nouvelle chanson dans l’application, le code dans le formulaire de saisie des données appelle la méthode
addSong()
de la classe PlayList.
/**
* Adds a song to the playlist.
*/
public function addSong(song:Song):void
{
this._songs.push(song);
this._needToSort = true;
}
A l’intérieur de
addSong()
, la méthode
push()
du tableau
_songs
est appelée. Ceci permet d’ajouter l’objet Song transmis à
addSong()
en tant que nouvel élément dans ce tableau. Avec la méthode
push()
, le nouvel élément est ajouté à la fin du tableau, indépendamment du tri appliqué précédemment. Ceci signifie qu’une fois que la méthode
push()
a été appelée, la liste des chansons risque de ne plus être triée correctement. Par conséquent, la variable
_needToSort
est définie sur
true
. Théoriquement, la méthode
sortList()
pourrait être appelée immédiatement afin d’éviter de vérifier si la liste est triée ou non à un moment donné. En pratique, cependant, la liste des chansons n’a pas besoin d’être triée jusqu’au moment précédant immédiatement sa récupération. En retardant l’opération de tri, l’application n’effectue pas de tri inutile si, par exemple, plusieurs chansons sont ajoutées à la liste avant sa récupération.
Tri de la liste de chansons
Etant donné que les occurrences Song gérées par la liste de lecture sont des objets complexes, les utilisateurs de l’application peuvent trier la liste de lecture en fonction de différentes propriétés (titre de la chanson ou année de publication, par exemple). Dans l’application PlayList, le tri de la liste des chansons s’effectue en trois étapes : identification de la propriété sur laquelle est basé le tri de la liste, indication des options de tri à utiliser lors du tri en fonction de cette propriété et exécution du tri.
Propriétés de tri
Un objet Song conserve la trace de plusieurs propriétés, notamment le titre de la chanson, l’artiste, l’année de publication, le nom du fichier et un ensemble de genres sélectionné par l’utilisateur auquel la chanson appartient. Seules les trois premières propriétés sont pratiques pour le tri. Dans un souci de commodité pour les développeurs, l’exemple inclut la classe SortProperty, qui agit comme une énumération avec des valeurs représentant les propriétés disponibles pour le tri.
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 contient trois classes,
TITLE
,
ARTIST
et
YEAR
. Chacune d’elles stocke une chaîne comportant le nom de la propriété de la classe Song pouvant être utilisée pour le tri. Chaque fois qu’une propriété de tri est indiquée dans le reste du code, le membre de l’énumération est utilisé. Par exemple, dans le constructeur PlayList, la liste est triée initialement en appelant la méthode
sortList()
, comme suit :
// Set the initial sorting.
this.sortList(SortProperty.TITLE);
Etant donné que la propriété de tri est spécifiée sous la forme
SortProperty.TITLE
, les chansons sont triées par titre.
Tri par propriété et définition d’options de tri
La classe PlayList trie la liste de chansons dans la méthode
sortList()
, comme suit :
/**
* 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;
}
Lors du tri par titre ou par artiste, il est préférable d’effectuer un tri par ordre alphabétique. En revanche, lors du tri par année, il est plus logique d’effectuer un tri numérique. L’instruction
switch
sert à définir l’option de tri appropriée, stockée dans la variable
sortOptions
, en fonction de la valeur indiquée dans le paramètre
sortProperty
. Ici encore, les membres de l’énumération nommés sont utilisés pour faire la différence entre les propriétés, plutôt que les valeurs absolues.
Une fois que vous avez déterminé la propriété et les options de tri, le tableau
_songs
est trié en appelant sa méthode
sortOn()
, en transmettant ces deux valeurs comme paramètres. La propriété de tri est enregistrée et la liste des chansons est triée.
Combinaison d’éléments de tableau en une chaîne séparée par des caractères
Cet exemple utilise non seulement un tableau pour conserver la liste des chansons dans la classe PlayList mais également des tableaux dans la classe Song pour gérer la liste des genres auxquels une chanson appartient. Considérons ce fragment de code issu de la définition de la 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(";");
}
Lors de la création d’une occurrence de Song, le paramètre
genres
utilisé pour spécifier le genre (ou les genres) auquel la chanson appartient est défini comme occurrence d’Array. Ainsi, vous pouvez regrouper plusieurs genres en une seule variable qui peut être transmise au constructeur. Néanmoins, la classe Song conserve, en interne, les genres dans la variable privée
_genres
sous la forme d’une occurrence de String séparée par des points-virgules. Le paramètre Array est converti en une chaîne séparée par des points-virgules en appelant sa méthode
join()
avec la valeur de chaîne littérale
";"
comme séparateur spécifié.
De la même façon, les accesseurs
genres
permettent de définir ou de récupérer des genres sous la forme d’un tableau :
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’accesseur
genres
set
se comporte exactement comme le constructeur ; il accepte un tableau et appelle la méthode
join()
pour la convertir en une chaîne séparée par des points-virgules. L’accesseur
get
effectue l’opération inverse : la méthode
split()
de la variable
_genres
est appelée. Elle divise la chaîne en un tableau de valeurs utilisant le séparateur spécifié (la valeur de chaîne littérale
";"
comme précédemment).
|
|
|