Modules

Les modules de ruby sont semblables à des classes, sauf que :

  • un module ne peut avoir d’instances ;
  • un module ne peut avoir de sous-classes ;
  • un module est défini par module … end.

En fait… la classe Module des modules est la super-classe de la classe Classe des classes. Compris ? Non ? Bon, on continue.

Il y a deux usages typiques des modules. L’un est de réunir des constantes et des méthodes en rapport les unes avec les autres dans un lieu commun. Le module Math dans la librairie standard joue un tel rôle :

ruby> Math.sqrt(2)
  1.41421
ruby> Math::PI
  3.14159

L’opérateur :: indique à l’interpréteur ruby quel module il devrait consulter pour trouver la valeur d’une constante (on pourrait avoir d’autres modules que Math qui donne un sens à PI). Si nous voulons nous référer aux méthodes ou constantes d’un module directement, sans utiliser le ::, nous pouvons include (inclure) ce module :

ruby> include Math
  Object
ruby> sqrt(2)
  1.41421
ruby> PI
  3.14159

Un autre usage des modules est appelé mixin (mélange). Certains langages orientés objet, dont C++, permettent l’héritage multiple, c’est-à-dire le fait d’avoir plusieurs super-classes directes pour une classe donnée. Un exemple concret d’héritage multiple est le réveil-matin : vous pouvez ranger les réveils-matin dans la classe des horloges, mais aussi dans la classe des trucs qui font du bruit.

Ruby — à dessein — n’offre pas le véritable héritage multiple, mais propose la technique du mixin (prononcez « mixine » – Ndt) comme une alternative avantageuse. Souvenez-vous qu’un module ne peut être instancié ni sous-classé ; mais si on inclut un module dans la définition d’une classe, ses méthodes sont effectivement ajoutées (ou « mélangées ») à la classe.

Les mixin peuvent être compris comme une façon d’obtenir les propriétés particulières qu’on veut avoir. Par exemple, si une classe a une méthode each, y mêler (par include) le module Enumerable de la librairie standard nous offre « gratis » les méthodes sort (trie) et find (cherche).

Cette utilisation des modules nous offre les fonctionnalités de base de l’héritage multiple, mais nous permet de représenter par un simple arbre les relations de classe, ce qui simplifie considérablement l’implémentation du langage (un choix semblable a été fait par les concepteurs de Java).

Guide de l’utilisateur

Précédent : GDU : Méthodes singletons Suivant : GDU : Objets Procédure