Metodi

Cos'è un metodo? Nella programmazione OO, noi nonpensiamo ad operare sui dati direttamente dal'esterno diun oggetto; piuttosto, gli oggetti stessi sanno come operaresu loro stessi (quando gli viene chiesto gentilmente difarlo). Si potrebbe anche dire che passiamo dei messaggi adun oggetto, e quei messaggi causano un qualche tipo di azioneo di risposta significativa. Ciò deve accadere senzala necessità di sapere o di preoccuparsi di come vengaeffettivamente svolto il lavoro all'interno. I compitiche possiamo ci è permesso di chiedere di svolgere adun oggetto (o, in maniera equivalente, i messaggi che luipuò capire ) sono i metodi dell'oggetto.

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

ruby> "abcdef".length   6

 

Intuitivamente, a questo oggetto stringa si sta chiedendoquanto sia lungo. Tecnicamente, stiamo invocando ilmetodo length dell'oggetto"abcdef".

Altri oggetti avranno un'interpretazione leggermentedifferente di length, o magari nessuna. Tutte ledecisioni su come rispondere ad un messaggio vengonoeffettuate al volo, durante l'esecuzione di un programma,e l'azione intrapresa può cambiare a seconda diquale sia la variabile a cui ci si riferisce.

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

 

Quello che intendiamo dire con length puòcambiare a seconda dell'oggetto con il quale stiamoparlando. La prima volta che chiediamo a foo lasua lunghezza (length) nell'esempio precedente, facciamoriferimento ad una semplice stringa, e può essercisoltanto una risposta logica. La seconda volta ,foo si riferisce ad un array, e posiamoragionevolmente 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 essereestrapolati se si desidera farlo).

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

 

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

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

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

 

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

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

oggetto.metodo(arg1, arg2)

 

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

oggetto.metodo arg1, arg2

 

c'è una variabile speciale in ruby dettaself; essa si riferisce a qualunque oggetto stiachiamando un metodo. Ciò accade così spesso cheper convenienza la parte "self."può essere omessa dalle chiamate ai metodi da partedell'oggetto stesso:

self.nome_metodo(args...)

 

È lo stesso che scrivere

nome_metodo(args...)

 

Ciò a cui penseremmo tradizionalmente comechiamata a funzione è soltanto questo modoabbreviato di scrivere questa invocazione dei metodi da partedi self. Questo è quello che rende rubyun cosidetto linguaggio puramente ad oggetti. Ancora, imetodi funzionali funzionano in maniera abbastanza similealle funzioni in altri linguaggi di programmazione per ilbeneficio di coloro che non grokkano [comprendono.. chi haletto Straniero in Terra Straniera?] comprendono come lechiamate a funzione sianpo in effetti veri metodi di qualcheoggetto in ruby. Possiamo anche parlare di funzionicome se non fossero veramente metodi di un oggetto, sevogliamo.



Ti potrebbe interessare anche

commenta la notizia