Metodi

Cos'è un metodo? Nella programmazione OO, noi non pensiamo ad operare sui dati direttamente dal'esterno di un oggetto; piuttosto, gli oggetti stessi sanno come operare su loro stessi (quando gli viene chiesto gentilmente di farlo). Si potrebbe anche dire che passiamo dei messaggi ad un oggetto, e quei messaggi causano un qualche tipo di azione o di risposta significativa. Ciò deve accadere senza la necessità di sapere o di preoccuparsi di come venga effettivamente svolto il lavoro all'interno. I compiti che possiamo ci è permesso di chiedere di svolgere ad un oggetto (o, in maniera equivalente, i messaggi che lui può capire ) sono i metodi dell'oggetto.

In ruby, invochiamo i metodi di un oggetto con la notazione puntata (come in C++ o Java). L'oggetto a cui coi si riferisce si trova alla sinistra del punto.

ruby> "abcdef".length
   6

 

Intuitivamente, a questo oggetto stringa si sta chiedendo quanto sia lungo. Tecnicamente, stiamo invocando il metodo length dell'oggetto "abcdef".

Altri oggetti avranno un'interpretazione leggermente differente di length, o magari nessuna. Tutte le decisioni su come rispondere ad un messaggio vengono effettuate al volo, durante l'esecuzione di un programma, e l'azione intrapresa può cambiare a seconda di quale sia la variabile a cui ci si riferisce.

ruby> foo = "abc"
   "abc"
ruby> foo.length
   3
ruby> foo = ["abcde" , "fghij"]
   ["abcde" , "fghij"]
ruby> foo.length
   2

 

Quello che intendiamo dire con length può cambiare a seconda dell'oggetto con il quale stiamo parlando. La prima volta che chiediamo a foo la sua lunghezza (length) nell'esempio precedente, facciamo riferimento ad una semplice stringa, e può esserci soltanto una risposta logica. La seconda volta , foo si riferisce ad un array, e posiamo ragionevolmente pensare che la sua lunghezza sia 2, 5, o 10; ma la risposta applicabile più in genarale è ovviamente 2 (gli altri tipi di lunghezza possono essere estrapolati se si desidera farlo).

ruby> foo[0].length
   5
ruby> foo[0].length + foo[1].length
   10

 

La cosa da notare qui è che un array sa qualcosa su cosa significhi essere un array. I pezzi di dati in ruby portano sempre con loro una tale conoscenza, in maniera che le richieste a cui vengono sottoposti possano essere soddisfatte automaticamente nella maniera più appropriata . Questo solleva il programmatore dal peso di memorizzare un gran numero di nomi di funzione specifici, poiché un numero relativamente piccolo di metodi, corrispondenti ai concetti che sappiamo esprimere in linguaggio naturale, possono essere applicati a diferenti tipi di datoed i risultati saranno quelli che ci aspettiamo . Questa caratteristica dei linguaggi di programmazione orientati agli oggetti (che, IMHO, Java non ha sfruttato molto bene) viene detto polimorfismo.

Quando un oggetto riceve un messaggio che non comprende, viene "sollevato" un errore:

ruby> foo = 5
   5
ruby> foo.length
ERR: (eval):1: undefined method `length' for 5(Fixnum)

 

Dunque è necessario sapere quali metodi siano accettabili per un oggetto, anche se non abbiamo bisogno di sapere come i metodi vengano processati.

Se vengono passati degli argomenti ai metodi , essi in genere vengono racchiusi tra parentesi,

oggetto.metodo(arg1, arg2)

 

Ma si possono anche omettere se facencdo così non si causa nessuna ambiguità.

oggetto.metodo arg1, arg2

 

c'è una variabile speciale in ruby detta self; essa si riferisce a qualunque oggetto stia chiamando un metodo. Ciò accade così spesso che per convenienza la parte "self." può essere omessa dalle chiamate ai metodi da parte dell'oggetto stesso:

self.nome_metodo(args...)

 

È lo stesso che scrivere

nome_metodo(args...)

 

Ciò a cui penseremmo tradizionalmente come chiamata a funzione è soltanto questo modo abbreviato di scrivere questa invocazione dei metodi da parte di self. Questo è quello che rende ruby un cosidetto linguaggio puramente ad oggetti. Ancora, i metodi funzionali funzionano in maniera abbastanza simile alle funzioni in altri linguaggi di programmazione per il beneficio di coloro che non grokkano [comprendono.. chi ha letto Straniero in Terra Straniera?] comprendono come le chiamate a funzione sianpo in effetti veri metodi di qualche oggetto in ruby. Possiamo anche parlare di funzioni come se non fossero veramente metodi di un oggetto, se vogliamo.

Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Redazione
Condividi le tue opinioni su questo articolo!