AS3 : Que choisir, variable publique, methode publique ou Getter / setter

22 décembre 2015

Prenons le cas d’une classe simple, contenant une propriété

package  
{
    public class MyClass
    {
        var _myProp:int = 0;
       
        public function MyClass() {}
       
    }
}

Pour modifier la variable _myProp depuis l’exterieur, il existe 3 solutions, que je vais présenter, de la plus mauvaise, à la meilleure :

1/ La propriété publique (AKA le diable personifié)

Mettre la variable _myProp en public, puis la modifier de la manière suivante :
(je précise que _myOccurence est une occurence de la classe MyClass)

_myOccurence._myProp = 5;

CECI EST EXTREMEMENT MAUVAIS.

Evidemment, à première vue, ça paraît rapide et pratique, on pourrait même argumenter que pour un projet simplissime, ça peut faire l’affaire. Mais à l’échelle d’un gros projet, ammené à évoluer, c’est le meilleur moyen de perdre le controle sur votre programme. Car cela permet d’accéder à toute variables, depuis n’importe où, ce qui mène à ce qu’on appelle un « code spaghetti », dans lequel vous ne serez plus en mesure de comprendre pourquoi telle variable prend telle valeur dans telle condition.

Mais pour ceux qui ne sont toujours pas convaincu, le meilleur moyen est de le faire malgrès tout, pour s’en rendre compte par soi même pour ensuite dire « PLUS JAMAIS » ! :)

2/ Utiliser une méthode publique

Il faut donc, vous l’aurez compris, garder ses variables privées. On peut ensuite créer une méthode publique qui se chargera de modifier la propriété privée en question.

private var _myProp:int;

public function setMyProp(_value:int):void
{
    _myProp = _value;
}

Cela peut paraître, à première vue, une encombre inutile, mais l’intêret majeur, est que votre fonction setMyProp, souvent, ne fera pas que changer la valeur de _myProp, mais accompliera d’autres taches associées, afin de maintenir la cohérence interne de l’objet.

Exemple avec une classe Rectangle, possédant les propriétés : top, left, right, bottom, width et height :
en modifiant les propriétés top et bottom : on transforme la hauteur du rectangle, il faudrait donc synchroniser la valeur de height avec les changement de top ou bottom.

public function setTop(_value):void
{
    _top = _value;          //on définit la valeur top
    _height = _bottom - _top;   //on actualise la hauteur en fonction de la nouvelle modification
}

C’est là tout l’intêret de la programmation objet : maintenir la cohérence interne d’un objet, sans qu’on ait à s’en soucier depuis l’exterieur.
La personne manipulant un objet rectangle peut changer ses propriétés, sans avoir à se soucier de créer une incohérence dans le programme.

3/ Les getter / setter

Les getter et setter fonctionnent de la même manière que des méthodes standards (comme présentée au dessus), ce qui change et la manière dont on y accède de l’exterieur.

//définition du setter
public function set myProp(_value:String):void
{
    _myProp = _value;
}

//accès au setter depuis l'exterieur
_myOccurence.myProp = _value;

C’est comme si on utilisait une fonction publique (avec tous les bienfaits mentionnés plus haut), mais en permettant depuis l’exterieur, le même accès qu’avec une variable publique (plus simple et lisible).

Les getter / setter recèlent un autre interêt tout particulier, lié aux tween dont je parle ici :
Faire défiler un score grâce aux Tween et au getter / setter.


2 comments on “AS3 : Que choisir, variable publique, methode publique ou Getter / setter

  1. […] Suite à l’article ou j’expliquai comment fonctionnent les getter / setter, […]

  2. Kayleigh dit :

    Your post has lietfd the level of debate

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *