banner

Précédent   InfographiK - Communauté Graphique > FLASH & ACTION SCRIPT > Débuter avec Flash > Les cours de base

Réponse
 
LinkBack Outils de la discussion
  #1 (permalink)  
Vieux 05/04/2007, 13h06
Avatar de Smike
Administrateur
 
Date d'inscription: May 2002
Localisation: 26
Messages: 3 012
Zoom [ActionScript] La structure de données avec la pile

Qu'est-ce qu'une pile et pourquoi l'utiliser ?
Le principe d'une PILE est LIFO (Last In First Out), comprenez que le dernier élément de la pile sera le premier à être lu. Un exemple grossier d'utilisation serait une gestion de CTRL-Z à l'interieur d'une application.

On empile les actions de l'ulisateurs et on dépile à chaque CTRL-Z. Dans ce genre de structure, on ne peut donc accéder au'au dernier éléments. Quoi que l'on fasse, où que l'on soit, nous aurons toujours accès au dernier éléments et pas à un autre. C'est tout l'avantage de créer nos propres structures de données, on peut gérer les accès comme nous le souhaitons.

Comment mettre en place cette structure ?
Voyant déjà dans le futur Laughing, il y a 2 sortes piles à disposition :
  • BasicStack (pile d'objet indépendant à tous sens)
  • TypedStack (pile d'objet indépendant mais de même type)

Afin de conserver une parfaite intégriter je vais donc commencer par vous liver une interface Stack.as qui va permettre de faire le lien entre ces 2 classes, et permettre en même temps, l'utilisation du typage pour gérer nos piles. Interface Stack.as :

ActionScript Code:
  1. interface Stack
  2. {
  3. /**
  4. * Ajouter une valeur dans la pile<br />
  5. * @param p_value Une donnée de type quelconques (pas de typage fort)
  6. */
  7. public function push(p_value) : Void;
  8.  
  9. /**
  10. * On récupère la dernière valeur et on la supprimer de la pile<br />
  11. * @return la dernière donnée (pas de typage fort)
  12. */
  13. public function pop(Void);
  14.  
  15. /**
  16. * On récupère la dernière valeur<br />
  17. * @return la dernière donnée (pas de typage fort)
  18. */
  19. public function peek(Void);
  20.  
  21. /**
  22. * La pile est-elle vide<br />
  23. * @return Boolean true si la pile est vide.
  24. */
  25. public function isEmpty(Void) : Boolean;
  26.  
  27. /**
  28. * Retourne le nombre d'éléments de la pile<br />
  29. * @return Number Nombre d''éléments
  30. */
  31. public function getLength(Void) : Number;
  32.  
  33. /**
  34. * Tranformation pile -> tableau<br />
  35. * @return Array Tableau comportant les données de la pile
  36. */
  37. public function toArray(Void) : Array;
  38.  
  39. /**
  40. * Affichage du contenu<br />
  41. */
  42. public function toString(Void) : String;
  43. }

Maintenant le code de la 1ère pile, c'est à dire BasicStack :

ActionScript Code:
  1. class BasicStack implements Stack
  2. {
  3. private var __aDatas : Array;
  4.  
  5. public function BasicStack(p_aData : Array)
  6. {
  7. __aDatas = (p_aData) ? p_aData.concat() : __aDatas = new Array()
  8. }
  9.  
  10. public function push(p_value) : Void
  11. {
  12. __aDatas.push(p_value);
  13. }
  14.  
  15. public function pop(Void)
  16. {
  17. if (isEmpty()) {
  18. throw new Error("You tried to pop an element from an empty Stack.");
  19. }
  20. return __aDatas.pop();
  21. }
  22.  
  23. public function peek(Void)
  24. {
  25. if (isEmpty()) {
  26. throw new Error("You tried to peek an element from an empty Stack.");
  27. }
  28. return __aDatas&#91;__aDatas.length-1];
  29. }
  30.  
  31. public function isEmpty(Void) : Boolean
  32. {
  33. return (__aDatas.length < 1);
  34. }
  35.  
  36. public function getLength(Void) : Number
  37. {
  38. return __aDatas.length;
  39. }
  40.  
  41. public function toArray(Void) : Array
  42. {
  43. var aTemp : Array = __aDatas.concat();
  44. aTemp.reverse();
  45. return aTemp;
  46. }
  47.  
  48. public function toString(Void) : String
  49. {
  50. return '[BasicStack] \n\t\t' + toArray().toString();
  51. }
  52.  
  53. }

Maintenant quelques exemples d'utlisation :

ActionScript Code:
  1. var myPile : Stack = new BasicStack();
  2. myPile.push("communauté");
  3. myPile.push("adddvance");
  4. myPile.push(28);
  5. trace( myPile.pop() ) // Affiche 28
  6. trace( myPile.pop() ) // Affiche adddvance
  7. trace( myPile.getLength() ) // Affiche 1
  8. trace( myPile.peek() ) // Affiche communauté
  9. trace( myPile.getLength() ) // Affiche 1
  10.  


Imaginons maintenant que l'on veulle vérifier que les données que nous voulons ajouter soient compatible, entendez par là, de même type.
En effet, il peut être très pratique de vérifer le typage des données que l'on gère.

Si nous voulons travailler uniquement sur des chaines de caractères par exemple, nous devons vérifer que chaque données empiler dans notre pile est bien de type "chaine de caractère". Pour cela nous allons créer une nouvelle classe Typedstack. Cette class va hériter de notre 1ere class BasicStack tout en implémentant notre interface Stack. Code de la classe TypedStack :

ActionScript Code:
  1. classTypedStack extends BasicStack implements Stack
  2. {
  3. private var __fType : Function;
  4.  
  5. public function TypedStack(p_fValue : Function)
  6. {
  7. __fType = p_fValue;
  8. if(!p_fValue)
  9. throw new Error("You must define a type for TypedStack")
  10.  
  11. if (arguments.length > 1) {
  12. arguments.shift();
  13. super(arguments);
  14. }
  15. }
  16.  
  17. public function push(p_value) : Void
  18. {
  19. _validateData(p_value);
  20. super.push(p_value);
  21. }
  22.  
  23. public function toString(Void) : String
  24. {
  25. return '[TypedStack] \n\t\t' + __aDatas.toString();
  26. }
  27.  
  28. private function _validateData(p_value) : Void
  29. {
  30. if(!com.asdk.utils.ClassUtil.typeOf(p_value, __fType))
  31. throw new Error("Invalid type " + p_value)
  32. }
  33.  
  34. }

Vous remarquerez que le grand changement ce fait au niveau de la méthode push qui vérifie maintenant le type de donnée et empile celle ci uniquement si le type est correcte.

Pour vérifer le type des données envoyées à la pile, j'ai réalisé une simple méthode statique de test. Cette méthode sera certainement à revoir pour la gestion de types plus complexe, je ne la considère donc pas comme définitive à l'heure actuelle. Classe ClassUtil :

ActionScript Code:
  1. class com.asdk.utils.ClassUtil
  2. {
  3. static public function typeOf(instance, type) : Boolean
  4. {
  5. return instance.__constructor__ == type;
  6. }
  7. }

Exemple d'utilisation :

ActionScript Code:
  1. var myPile : Stack = new TypedStack(String, "toto");
  2. myPile.push("Romain");
  3. trace(myPile) //Affiche toto, romain
  4. myPile.push(28); //Exception de la classe TypedStack.Arret
  5.  

Encore rien de bien compliqué, mais ce genre de structure permet souvent d'éliminer des erreurs de typage à l'intérieur de nos projets.
__________________
[La musique fait danser les consciences]
Réponse avec citation
Réponse

Outils de la discussion

Règles de messages
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui



Fuseau horaire GMT +2. Il est actuellement 09h10.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.1.0 Tous droits réservés.
Version française #13 par l'association vBulletin francophone

Communauté Graphique
CNIL : 1130886