Moduli

In ruby i moduli sono simili alle classi, eccetto che:

  • Un modulo non può avere istanze.
  • Un modulo non può avere sottoclassi.
  • Un modulo è definito dalle parole chiave module ... end.

In realtà... la classe Module dei moduli è la superclasse della classe Class delle classi. Avete capito? No? Lasciatemi andare avanti.

Ci sono due modi di utilizzare i moduli. Uno è quello di raccogliere i metodi e le costanti correlate in un unico posto. Il modulo Math della libreria standard del ruby funziona così: plays such a

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

 

L'operatore :: dice all'interprete ruby quale modulo dovrebbe consultare per ottenere il valore di una costante (concepibilmente, alcuni moduli oltre a Math potrebbere intendere qualche altra cosa perPI). Se vogliamo riferirci ai metodi e alle costanti di un modulo direttamente senza usare ::, possiamo includere, con include, quel modulo:

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

Un altro utilizzo dei moduli è chiamato mixin. Alcuni linguaggi di programmazione OO, incluso il C++, permettono l'ereditarietà multipla, che è, l'ereditarietà da più di una superclasse. Un esempio dal mondo-reale di ereditarietà multipla è una sveglia; è possibile pensare ad una sveglia come appartenente alla classe degli orologi e anche alla classe delle cose che suonano.

Ruby intenzionalmente non implementa una vera ereditarietà multipla, ma la caratteristica mixin è una buona alternativa. Ricordate che i moduli non possono essere istanziati o avere sottoclassi; ma se includiamo, con include, un modulo nella definizione di una classe, i suoi metodi saranno aggiunti, o "mixed in" (mescolati), a quelli della classe.

Il mixin può essere pensato come un modo per chiedere qualsiasi particolare proprietà che vogliamo avere. Ad esempio, se una classe ha un metodo each funzionante, mescolandola con il modulo Enumerable della libreria standard riceviamo i metodi sort e find senza fatica.

Questo utilizzo dei moduli ci da le funzionalità di base dell'ereditarietà multipla ma ci permette di rappresentare le relazioni tra le classi con una semplice struttura ad albero, semplificando in questo modo notevolmente l'implementazione del linguaggio (una scelta simile fu fatta dai progettisti del Java).

Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Lorenzo
Hai qualche domanda da fare?