Acces­seurs


Je déteste avoir à program­mer ou utili­ser des acces­seurs. Voilà, c’est dit.

Sérieu­se­ment, qui a eu l’idée de faire des méthodes getX() et setX() ? Dans le meilleur des cas c’est pénible a écrire et diffi­cile à lire.

Qu’on ne me parle pas d’en­cap­su­la­tion, ces méthodes arti­fi­cielles sont tout sauf un besoin d’en­cap­su­la­tion. C’est même exac­te­ment le contraire de l’en­cap­su­la­tion : C’est parce que je n’ai pas à savoir si un attri­but est en accès direct ou non que je n’ai pas à utili­ser d’ac­ces­seurs.

Il n’est pas besoin d’im­pac­ter la manière dont on appelle les attri­buts d’un objet pour diffé­ren­cier l’in­ter­face publique et les données internes. De nombreux langages on trouvé une manière élégante de gérer les acces­seurs au niveau du langage au lieu de faire faire des pirouettes à l’uti­li­sa­teur. Un des gros avan­tages c’est qu’on ne commence à défi­nir des méthodes d’ac­ces­seur que quand on en a vrai­ment l’uti­lité, pas « partout, au cas où pour plus tard ».

Donc, quand il s’agit de migrer un attri­but autre­fois en accès direct, en Javas­cript :

A = { 
  get b() { return this._b; },
  set b(val) { return this._b = val;} 
};
// ou 

A.__defineGetter__("b", function() { return this._b; };
A.__defineSetter__("b", function(val) { return this._b = val; };

en Ruby :

class A
  def b
    @b
  end
  def b=(val)
    @b = val
  end
end

en Python :

class X(object):
  def getb(self):
    return self._b
  def setb(self, val):
    self._b = val
  b = property(getb, setb)

# ou mieux :

class X(object):
  @property
  def b(self):
    return self._b
  @b.setter
  def b(self, val):
    self._b = val

Sérieu­se­ment, c’est moins de complexité pour démar­rer du code (pas besoin de déve­lop­per des acces­seurs passe-plat au cas où on en aurait besoin plus tard, on peut s’en occu­per unique­ment quand le besoin arrive), et c’est plus de clarté pour tout ce qui utilise notre code (et là le gain est immense même si ça semble juste quelques carac­tères). Je n’ima­gine pas de m’en passer dans les langages où ça existe.

Si vous utili­sez des getter et setter passes-plat, c’est soit votre code qui est mauvais, soit votre langage qui est bridé (soit que vous utili­sez consciem­ment un langage bas niveau). Dans les deux premiers cas il y a quelque chose à repen­ser.

Bien entendu PHP reste à la traine, sous prétexte de simpli­cité (allez comprendre).


2 réponses à “Acces­seurs”

  1. Juste une petite précision, en ruby,

    class A
    attr_accessor :b
    end

    suffit largement, avec des variantes attr_reader et attr_writer si on veux respectivement n’authoriser que la lecture ou l’écritue…

    Bref, c’est vrai qu’ayant fait du java, j’en ai écrit un paquet d’accesseur, et je suis bien content d’en être sorti. Je pensait par contre qu’il existait une solution élégante en PHP… désolé d’apprendre que non.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.