AS : Evaluation ET/OU

Posted on 24/07/2008 · Posted in Flash

A votre avis, quel sera le résultat de ce bout de code ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function un () : Boolean
{
        trace ("un");
        return false;
}

function deux () : Boolean
{
        trace ("deux");
        return true;
}

if (un() && deux ())
        trace ("trois");

//Affiche : un

Que peut-on retenir de cela ?
Simplement, lors de l’évaluation de deux conditions avec un ET, si l’on tombe sur une condition fausse, les autres ne sont pas évaluées.
Si vous ne voyez pas l’intérêt, je vais vous donner un exemple tout simple.

1
2
3
4
5
6
7
for (var i : int = 0 ; i < numChildren ; i++)
{
        if ((getChildAt (i) as MovieClip).hasOwnProperty)
        {
                trace ("ok");
        }
}

Ce bout de code peut nous donner une erreur à l’exécution dans le cas ou getChildAt (i) ne retourne pas un objet qui soit de type MovieClip.
Même si “as” retourne NULL lorsque l’objet ne peut être caster, contrairement au cast explicite qui génère une erreur, NULL n’ayant aucune propriété vous allez avoir une erreur “Vous essayer d’atteindre une propriété d’un objet de référence null.”

Il faut donc vérifier le type de l’objet avant de l’utiliser.

1
2
3
4
5
6
7
8
9
10
for (var i : int = 0 ; i < numChildren ; i++)
{
        if (getChildAt (i) is MovieClip)
        {
                if ((getChildAt (i) as MovieClip).hasOwnProperty)
                {
                        trace ("ok");
                }
        }
}

Ici, pour que l’on puisse utiliser hasOwnProperty, il faut que notre objet soit de type MovieClip. Mais, avouer que cela ne fait pas jolie, plus on peut limiter le nombre de boucles imbriquées, mieux c’est.

Voici comment mettre en pratique la démonstration du début pour notre cas.

1
2
3
4
5
6
7
for (var i : int = 0 ; i < numChildren ; i++)
{
        if ((getChildAt (i) is MovieClip) && ((getChildAt (i) as MovieClip).hasOwnProperty)
        {
                trace ("ok");
        }
}

Je ne vous ferai pas l’affront de vous dire que le poids du code source sera allégé, mais cela peut augmenter la facilité de lecture.

De la même manière, pour l’étude d’un OU lorsque l’on rencontre une condition “vrai”, on ne regarde pas les autres valeurs.

Démonstration :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function un () : Boolean
{
        trace ("un");
        return true;
}

function deux () : Boolean
{
        trace ("deux");
        return false;
}

if (un () || deux ())
        trace ("trois");

//Affiche "un" "trois"

Pour tout vous dire, je n’ai pas d’exemple concret en tête… Mais bon, vous en trouverez surement un 😉