playlist Introduction à Ruby - Les accesseurs

Publié il y a environ 3 ans dans la série : Ruby - Formation complète
Nicolas Cavigneaux
Votre formateur
Nicolas Cavigneaux

A la recherche d'un langage polyvalent, j'ai fait la découverte de Ruby en 2003. J'ai donc très vite commencé à utiliser Ruby au quotidien pour des tâches diverses et variées (scripting, applications lourdes…).

Courant 2004, une vague de fraicheur est apparue avec l'arrivée de Ruby on Rails qui m'a de suite conquis. J'ai donc décidé de participer activement à la communauté (forums, patches, librairies, …). En 2010, je fais la rencontre de Martin Catty et retrouve dans sa vision la rigueur et les bonnes pratiques que j'aime mettre en place, le déclic a donc été immédiat.

Synbioz met en place des solutions robustes sur la base d'outils modernes et funs, je veux faire partie de l'aventure.

Catégories : Développement


Vidéo dédiée à la découverte des accesseurs en ruby. Cette vidéo fait partie d'une série qui a pour but de vous faire découvrir les bases de la programmation en Ruby et des éléments de langage les plus utilisés au quotidien.

Afficher le transcript complet de la vidéo

Bienvenue dans cette vidéo consacrée à la création d’accesseurs dans une classe en Ruby.


Pour ce screencast nous utilisons la version 2.2 de Ruby.


Pour illustrer nos exemples, nous allons utiliser la console interactive IRB mais nous écrirons le code dans un éditeur de texte pour améliorer la lisibilité. Nous chargerons le fichier directement depuis IRB pour pouvoir utiliser et tester ce code.


La théorie


Dans la vidéo précédente nous avons créé une classe basique qui permet de gérer des animaux.


Bien souvent vous aurez besoin de pouvoir modifier les propriétés d’une instance existante. Le fait d’avoir créé des variables d’instances ne suffit pas à pouvoir les lire ou les modifier depuis l’extérieur de la classe. Pour pouvoir accéder à ces variables d’instances depuis l’extérieur, que ce soit en lecture ou en écriture, vous devez écrire ce qui dans beaucoup de langage s’appelle les “getter” et les “setter”.


Les accesseurs


En Ruby ce sont les accesseurs. Ce sont des méthodes dédiées à la lecture ou à la modification du contenu d’une variable d’instance. Nous allons améliorer notre classe existante pour pouvoir lire et modifier le contenu de la variable d’instance @age :

class Animal
  WILD = true

  @@counter = 0

  def initialize(name, sex, age)
    @@counter += 1
    @name, @sex, @age = name, sex, age
  end

  def age
    @age
  end

  def age=(age)
    @age = age
  end

  def description
    puts "#{@name} is #{@age} years old."
  end

  def self.instances_count
    puts "We created #{@@counter} animals."
  end
end


On a donc ajouter la méthode age qui fait office de “getter”, son but est simplement de retourner la valeur de la variable d’instance @age. On a également ajouté la méthode age= qui sert quant à elle de “setter”. Elle va permettre de modifier le contenu de la variable d’instance @age. On note la présence du = dans le nom de méthode. Ce n’est absolument pas obligatoire mais par convention et pour améliorer la lisibilité, les Rubyistes ont pour habitude d’ajouter un = au noms de méthodes servant de “setter”. Cette méthode prend un paramètre qui sera utilisé comme nouvelle valeur.


Testons cette classe améliorée :

load 'animal.rb'

a = Animal.new('Simba', 'male', 5)
a.age
a.description
a.age = 10
a.age
a.description


Ça fonctionne donc comme voulu, c’est satisfaisant sur le plan fonctionnel mais ce n’est pas du tout représentatif du code idiomatique à utiliser en Ruby. Ce besoin est tellement courant en Ruby qu’il met à notre disposition des macros permettant de faire ce travail à notre place.


On a donc à disposition trois méthodes qui sont attr_reader, attr_writer et attr_accessor qui permettent respectivement de créer un “getter”, un “setter” ou les deux à la fois. On peut donc modifier notre classe pour la simplifier :

class Animal
  WILD = true

  @@counter = 0

  attr_accessor :age

  def initialize(name, sex, age)
    @@counter += 1
    @name, @sex, @age = name, sex, age
  end

  def description
    puts "#{@name} is #{@age} years old."
  end

  def self.instances_count
    puts "We created #{@@counter} animals."
  end
end


On a donc supprimer nos deux méthodes dédiées à la gestion de l’âge pour les remplacer par un appel à attr_accessor suivi du nom de la variable d’instance pour laquelle les méthodes doivent être générées.


On peut recharger notre code dans IRB et vérifier que ça fonctionne toujours. On remarque un message d’avertissement qui nous dit que nous avons redéfinie une constante. Effectivement le fait de recharger notre fichier a écrasé la constante définie lors du premier chargement :

load 'animal.rb'

a = Animal.new('Simba', 'male', 5)
a.age
a.description
a.age = 10
a.age
a.description


Le comportement est identique mais le code est plus concis et les risques de bugs sont donc réduits.


Conclusion


Vous connaissez maintenant les bases de la création des accesseurs dans une classe en Ruby. Vous allez donc pouvoir améliorer vos classes existantes et mettre en place des méthodes permettant de manipuler vos attributs d’instances.