Capítulo 18. Módulos

Los módulos en Ruby son similares a las clases, excepto en:

Ciertamente ... la clase Module de un módulo es la superclase de la clase Class de una clase. ¿Se pilla esto? ¿No? Sigamos.

Existen dos usos típicos de los módulos. Uno es agrupar métodos y constantes relacionadas en un repositorio central. El módulo Math de Ruby hace esta función:

  ruby> Math.sqrt(2)
  1.414213562
  ruby> Math::PI
  3.141592654
  

El operador :: indica al interprete de Ruby qué módulo debe consultar para obtener el valor de la constante (es concebible, que algún otro módulo a parte de Math interprete PI de otra forma). Si queremos referenciar a los métodos o constantes de un módulo, directamente, sin utilizar ::, podemos incluir ese módulo con include:

  ruby> include Math
  Object
  ruby> sqrt(2)
  1.414213562
  ruby> PI
  3.141592654
  

El otro uso de los módulos se denomina mixin. Algunos lenguajes OO, incluidos el C++, permiten herencia múltiple, es decir, una clase puede heredar de más de una superclase. Un ejemplo de herencia múltiple en el mundo real es un despertador, se podría pensar que un despertador es una clase de reloj y que también pertenece a la clase de objetos que podríamos llamar zumbadores.

Ruby, con toda la intención del mundo, no implementa herencia múltiple real, aunque la técnica de los mixins es una buena alternativa. Recuérdese que los módulos no se pueden instanciar ni se pueden crear subclases de ellos; pero si se incluye un módulo en la definición de una clase sus métodos quedan añadidos a ella, es decir se asocian (mixin[1]) a la clase.

Se puede pensar que los mixins son una forma de pedir qué propiedades concretas se desean. Por ejemplo, si una clase tiene un método each funcional, asociarla con el módulo Enumerable de la biblioteca estándar nos proporciona gratuitamente los métodos sort y find.

Esta utilización de los módulos proporciona la funcionalidad básica de la herencia múltiple permitiéndonos representar las relaciones de la clase en una simple estructura en árbol que simplifica considerablemente la implementación del lenguaje (Los diseñadores de Java hicieron una elección parecida).

Notas

[1]

asociar