Outils pour utilisateurs

Outils du site


cours2009:multimedia:usage_d_une_interface_pour_les_pages

Usage d'une interface pour les pages

Le but de cette activité est de régler un des plus gros problèmes du code :

_pageCourante.gotoAndPlay("anim sortie");

Quel est le problème ?

  • Toutes les pages doivent avoir une animation de sortie.
  • Cette animation de sortie doit être gérée par le scénario.
  • Elle doit comporté une étiquette ”anim sortie”.

Dit autrement :

  • Pas de modularité du code :
    • Un seul comportement possible (page avec sortie).
    • Une seule technique possible (utilisation de scénario).
  • Dépendance non voulue entre les objets :
    • Le code gérant la navigation doit savoir comment fonctionnent les pages :
      • Les pages doivent avoir un scénario.
      • L'animation de sortie doit être délimité par une étiquette nommée ”anim sortie”.
    • Mauvaise séparation des rôles :
      • C'est le code qui gère la navigation qui prend en charge la sortie.
      • Les pages n'ont pas de contrôle sur leur animation de sortie.

Ce qu'il faudrait :

_pageCourante.faitSortie();

On dit simplement à la page courante de faire sa sortie. Après, c'est son problème ! Charge à elle en retour de bien signaler qu'elle a fini.

Pour obtenir cela, on pourrait définir une Classe sur laquelle seraient basées toutes les Classes associées aux pages.

  • Cela permet de regrouper le comportement commun à toutes les pages.
    • Mais logiquement cela impose que ce comportement soit commun.
      • Remarque : on peut redéfinir un comportement dans une Classe enfant. Mais ce n'est pas nécessairement une bonne pratique dans ce cas.
  • Cela contraint les pages à toutes être de même type (basées sur un parent commun).
    • C'est en contradiction avec le fait de rendre la plus indépendante possible les Pages de la logique de navigation.

La bonne solution consiste en la définition d'une interface :
Fichier : IPage.as

package src0.grZ0.unNom.projet 
{
    public interface IPage
    {
        function faitSortie():void;
    }
}

La définition d'une interface est semblable à celle d'une Classe. Simplement elle ne comporte pas de code. Elle ne fait que définir un contrat : une page doit savoir faire sa sortie.

On peut l'utiliser de la façon suivante :

(_pageCourante as IPage).faitSortie();

L'opérateur ”as” permet de dire au compilateur que l'on sait que _pageCourante est bien de type IPage. 1)

Il ne nous reste qu'a faire une Classe qui sait faire sa sortie :

package src0.grZ0.unNom.projet
{
    import flash.display.MovieClip;
 
    public class PageTimeLine extends MovieClip implements IPage
    {
        public function faitSortie():void
        {
            gotoAndPlay("anim sortie");
        }
    }
}

Cette Classe réalise le comportement qui était auparavant dans le code gérant la navigation. ”implements IPage” signifie que cette Classe satisfait au contrat défini par IPage (elle sait faire sa sortie)

On l'utilise de la façon suivante :

  • Dans les paramètres d'export des symboles de chaque page :
    • Classe : ”src0.grZ0.unNom.projet.pages.PageAccueil” (nom unique pour chaque page)
    • Classe de base : ”src0.grZ0.unNom.projet.PageTimeLine” (classe de base qui est commune à plusieurs pages)

Maintenant on peut faire des pages utilisant des techniques différentes. Pas exemple, une page qui serait dépourvue d’animation de sortie. Elle signale donc immédiatement qu'elle a fini :

package src0.grZ0.unNom.projet
{   
    import flash.display.MovieClip;
    import flash.events.Event;
 
    public class PageSansSortie extends MovieClip implements IPage
    {
        public function faitSortie():void
        {
            dispatchEvent(new Event("fin sortie", true));
        }
    }
}
1) Une autre solution aurait consisté en le changement du type de _pageCourante en IPage
cours2009/multimedia/usage_d_une_interface_pour_les_pages.txt · Dernière modification: 2010/05/19 22:00 (modification externe)