Link sponsorizzati

Polimorfismo e Duck Typing in Ruby

Articolo scritto da Alessio Saltarin
Pagina 2 di 2

Vediamo l'esempio di prima in Ruby.

#!/usr/bin/env ruby

class Triangolo
	def initialize(base, altezza)
		@mbase= base
		@maltezza = altezza
	end

	def calcolaArea
	    return (@mbase*@maltezza)/2
	end

	def to_s
            return "Triangolo di area #{calcolaArea}"
	end
end

class Quadrato
	def initialize(lato)
		@mlato = lato
	end

	def calcolaArea
	    return (@mlato*@mlato)
	end

	def to_s
            return "Quadrato di area #{calcolaArea}"
	end
end

def main()

    forme = Array.new
    forme.push(Triangolo.new(10,4))
    forme.push(Quadrato.new(5))
    forme.push(Triangolo.new(12,3))
    forme.push(Quadrato.new(7))

    for g in forme
        puts g
    end

end

main
Duck typing

Nell'esempio in Ruby, del tutto analogo a quello visto sopra in Java, risulta evidente che la parte di codice polimorfica, cioè sostanzialmente:

puts g
funziona sulla base del fatto che puts, dovendo stampare una stringa a video, cerca se nella classe è presente un metodo che converte l'oggetto a stringa: nel nostro caso è "to_s".

Questo metodo richiama il famoso calcolaArea ed è questo il metodo che deve essere presente nell'oggetto perchè il codice in main abbia un senso.

(L'articolo continua più sotto...)

A differenza di Java però, Ruby ci permette di attuare questo meccanismo anche senza la specifica di un'interfaccia comune per Quadrato e Triangolo: molto semplicemente tale controllo è demandato al programmatore, il quale "sa" che Triangolo e Quadrato "sono" FormeGeometriche, e questo gli risparmia il lavoro di dover scrivere l'interfaccia. Questa tecnica è nota come duck typing (tipizzazione ad anatra).

Il prezzo da pagare è che, mentre in Java, un eventuale errore (ad esempio l'inserimento nella collezione forme di un oggetto che non è una FormaGeometrica, e quindi non ha un metodo calcolaArea) viene rilevato a compile-time, qui ce ne accorgeremo solamente a run-time.

Tirando le somme

Il polimorfismo è una tecnica dei linguaggi OOP che serve per limitare le parti di un programma che devono essere modificate, potendo costruire metodi che si comportano in modo diverso a seconda del tipo dell'oggetto passato come argomento.

Nei linguaggi OOP tradizionali, la tecnica prevede che tutti gli oggetti passati al metodo polimorfico debbano implementare la stessa interfaccia, mentre nei linguaggi OOP di scripting, come Ruby o Python, ciò non è necessario poichè si adotta il duck typing, ovvero il controllo sulla coerenza della tassonomia dei tipi è demandata al programmatore e non è necessario esplicitarla nel codice.

Nella stessa categoria...
E-Learning
Corso Ruby e Ruby On RailsCorso Ruby e Ruby On Rails
Creare software ed applicazioni Web con Ruby e ROR. A partire da 49 €.
Link sponsorizzati