sábado, 17 de mayo de 2014

Métodos singleton

El comportamiento de una instancia viene determinado por su clase, pero hay veces que sabemos que una determinada instancia debe tener un comportamiento especial. En la mayoría de los lenguajes debemos meternos en la problemática de crear otra clase e instanciarla sólo una vez. En Ruby se puede asignar a cada objeto sus propios métodos. Veamos un ejemplo:

class Prueba
def imprimir_valor
print "Hola!!\n"
end
end

test1 = Prueba.new
test2 = Prueba.new

def test2.imprimir_valor
  print "Hola desde test2!!\n"
end

ruby> test1.imprimir_valor
Hola!!
nil
ruby> test2.imprimir_valor
Hola desde test2!!
nil

En este ejemplo, test1 y test2 pertenecen a la misma clase, pero a test2 se le ha redefinido el método imprimir_valor y por lo tanto se comportan de forma diferente. Un método que pertenece sólo a un objeto se conoce como método singleton.

Los métodos singleton no son únicos de Ruby, aparecen también en CLOS, Dylan, entre otros. Otros lenguajes como por ejemplo Self, Javascript, NewtonScript, Lua y Io sólo tienen métodos singleton. A estos se les conoce como lenguajes basados en prototipos, dado que implementan la orientación a objetos sin el concepto de clase, sino que por medio del prototipado.

En Dylan, los métodos no están intrínsecamente asociados a ninguna clase en particular; métodos se pueden considerar como existente fuera de las clases. Como CLOS, Dylan se basa en multimethods o Multiple dispatch.  Multimethods es una característica de algunos lenguajes orientados a objetos en los cuales los métodos o funciones, pueden ser dinámicamente seleccionados en tiempo de ejecución para ser ejecutados dependiendo por ejemplo del tipo de un parámetro o del contexto.

Métodos singleton es una característica muy interesante y algunos lenguajes lo implementan con prototipos y otros con  Multimethods.