Mise en cache du résultat des méthodes d’un objet ou modèle en Ruby

Certaines méthodes peuvent être assez gourmandes lors de leur exécution, et il est parfois nécessaire d’appliquer les méthodes adaptées de mise en cache. La plus commune consiste à enregistrer le résultat de l’appel d’une méthode dans une variable locale, pour pouvoir ensuite utiliser la variable dans le reste du code, comme ceci :

# Définition
class MyObject
  def heavy_method
    # Actions gourmandes
  end
end

# Création d'instance et appel de la méthode
my_object = MyObject.new
result = my_object.heavy_method

# Utilisation de la valeur
puts result
...
puts result

Mise en cache

Que ce soit par élégance ou pour alléger le code et le rendre plus lisible, il peut être intéressant de ne pas avoir à utiliser de variable locale. La solution alternative consiste alors à faire la mise en cache au sein de la méthode elle-même. Voilà comment :

# Définition
class MyObject
  def heavy_method
    @heavy_method_cache ||= begin
      # Ici on fait les actions gourmandes
    end
  end
end

||= est un opérateur d’affectation qui fonctionne de deux manières :

La première fois que la méthode est appelée, la variable @heavy_method-cache vaut alors nil. L’opérateur d’affectation exécute donc l’ensemble du block begin...end pour en stocker le résultat dans la variable @heavy_method-cache.

La fois suivante, la variable @heavy_method-cache contient une valeur, donc l’ensemble du block begin...end ne sera pas exécuté. C’est la valeur de la variable @heavy_method-cache qui sera directement retournée par la méthode.

Ainsi, on peut appeler la méthode autant de fois que nécessaire sans utiliser de variable locale, et le contenu du block begin...end ne sera exécuté qu’une seule fois :

# Création d'instance
my_object = MyObject.new

# Utilisation de la valeur à travers la méthode
puts my_object.heavy_method
...
puts my_object.heavy_method

Pour aller plus loin

Newsletter

Publié par

Benj

Artisan du web à plusieurs facettes, du développement à la gestion de produits complexes en passant par le pilotage de projets internationaux.

Laisser un commentaire

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

3 × 2 =