Camina como pato, parpa como pato, ¿será un pato?: Duck Typing

Enviado por clbustos el Mié, 22/06/2005 - 23:07.
Clasificado en:

Parpa: Voz del pato (por si acaso).
Duck Typing, o Tipeo Pato, es una forma de pensar los objetos característica de Ruby. Está muy relacionada con la generación de objetos por prototipos, aunque no es lo mismo.
Para partir, una de las cosas que más me gustó del venerable Design Patterns de Gamma (y los otros tres) fue el capítulo que habla sobre las interfaces. Resumiendo, la idea es que cuando uno crea las clases, lo importante no es definir que tal objeto es de cual o tal clase, sino la interface que presenta a los otros objetos. Muchas de las técnicas tienen como único objetivo entregar una interface más consistente o más simple para lograr un determinado objetivo.
En lenguajes como C++ o Java, encontramos un enfoque platónico de la generación de objetos. Nosotros creamos nuestras clases "ideales" (e incluso "metaideales", cuando las definimos como abstractas), que se concretan en objetos reales al instanciarlos. Ahora bien, una vez creado un objeto ya no podemos cambiar su interface, porque para mantener la coherencia de nuestro sistema celestial no podemos hacer que nuestros objetos cambien de interface o de implementación de un momento a otro, ya que la clase es el tipo. El problema es que, muchas veces, necesitamos hacer PRECISAMENTE ESO.
Para Ruby, las cosas son distintas. Un objeto es sólo eso, un objeto. Si bien puede pertenecer a una clase en particular, su tipo (o que es lo mismo, su interface), puede ser manipulada en cualquier momento.
Para trabajar, entonces, en Ruby, vamos a preguntarnos más "que es lo que puede hacer este objeto" que "de que clase es este objeto". O, como dice la hermosa frase: "Camina como pato, grazna como pato, debe ser un pato"
Entonces, por ejemplo, en vez de definir un método a la Javiana

function habla(Animal animal)

Lo que hacemos en ruby es decir, cuando queramos que nuestro animal hable

animal.habla if animal.respond_to?(habla)

En términos más técnicos, esto hace que el tipo (o la interface), no sea definida en tiempo de compilación (Java, alguien?), sino en tiempo real. Podemos ir agregándoles piernas, brazos, voz a nuestro objeto a lo largo del programa, hasta el hermoso momento en que hagamos decir a nuestro pato:

pato.rebuzna if pato.respond_to?(rebuzna)

O sea, claro, mientras rebuzne, puede ser un burro :S

Imagen de clbustos

Lo mismo,pero más claro:
El concepto de "Duck Typing"

Enviado por clbustos el Lun, 27/06/2005 - 14:36.

Enviar un comentario nuevo

El contenido de este campo se mantiene como privado y no se muestra públicamente.
If you have a Gravatar account, used to display your avatar.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Saltos automáticos de líneas y de párrafos.

Más información sobre opciones de formato