Si algo luce como un pato y habla como un pato, es una variable de tipo «pato».
Muchos lenguajes de programación tienen esta regla: si necesitas procesar varios objetos a la vez, deben ser del mismo tipo. Esto te permitirá ejecutar las mismas acciones sobre ellos y obtener resultados predecibles.
Sin embargo, en algunos lenguajes, los objetos o las variables pueden pertenecer a diferentes tipos o clases, pero aún así se pueden mezclar y procesar como si fueran del mismo tipo. Los programadores lo llaman Duck Typing o -en español- tipado de pato.
¿Qué es el Duck Typing o Tipado de Pato?
El tipado de pato es un método de programación que se puede describir con la frase:
Si algo luce como un pato, nada como un pato y grazna como un pato, entonces lo más probable es que sea un pato.
Ahora, con un ejemplo muy simple, te mostraremos cómo funciona.
En Pascal, una variable de tipo «cadena» se designa como String
y los arreglos como Array
, por ejemplo:
var s : string; // cadena
var a : array[1..3] of integer; // arreglo de 3 números
Hasta aquí todo bien: en la variable de cadena almacenaremos una cadena y en el arreglo una secuencia de números:
s := '¡Hola!'
a[1] := 10;
a[2] := 20;
a[3] := 30;
Para mostrar el arreglo, usamos un ciclo for
y entre paréntesis indicamos los números de los elementos:
for i := 1 to 3 do
write(a[i]); // mostrar el elemento del arreglo
Pero si necesitamos mostrar la cadena carácter por carácter, podemos hacerlo en un ciclo e indicar los números de los caracteres entre paréntesis:
for i := 1 to Lenght(s) do
write(s[i]); // mostrar el carácter de la cadena
Para cambiar el valor de los elementos del arreglo, puedes hacer referencia a ellos directamente, indicando el número del elemento entre paréntesis:
a[1] := 10;
Pero si necesitamos referirnos a un carácter específico de la cadena, podemos indicar su índice entre corchetes:
s[1] = 'J'
s[2] := 'C'
Resulta que, aunque la cadena y el arreglo son tipos de datos diferentes, se comportan de la misma manera. Y si la cadena se muestra como un arreglo, se llena como un arreglo y se cambia como un arreglo, entonces, desde el punto de vista práctico, es un arreglo y puedes trabajar con ella como tal. Esto es tipado de pato (duck typing), cuando no importa lo que es en realidad, sino cómo se comporta y cómo trabajar con ello.
¿Dónde se Aplica y Cómo Funciona el Duck Typing?
En la programación orientada a objetos (POO), existe una regla: si quieres trabajar con objetos, debes utilizar los métodos que están escritos en su clase. En otras palabras…
«Solo puedes hacer con un objeto lo que el autor que escribió las reglas para todos los objetos similares ha permitido».
Supongamos que tenemos un procesador de pelotas virtuales. Su tarea es contar cómo rebotan las pelotas virtuales en diferentes superficies. El procesador funciona según el siguiente algoritmo:
- Recibe varios objetos de la clase
Ball
. - Esta clase tiene métodos
drop
ycatch
, es decir, la pelota se puede soltar y atrapar. - El procesador toma el primer objeto, llama al método
drop
(lo suelta), luego al métodocatch
(lo atrapa) y observa el resultado de los cálculos. - Si el resultado coincide con el esperado, pasa al siguiente objeto; de lo contrario, muestra un mensaje.
- De esta manera, el procesador itera sobre todos los objetos que recibe.
Queremos que este procesador pueda procesar nuestros objetos, pero de otra clase, Cube
. Es decir, no rebotar una pelota, sino rebotar un cubo. Para ello, nuestros objetos deben verse externamente para el procesador exactamente igual que los objetos de la clase Ball
, lo que significa que deben tener los métodos drop
y catch
. Desde el punto de vista del procesador, si un objeto se puede utilizar como pelota, es una pelota.
Los desarrolladores suelen utilizar esto cuando necesitan crear una interfaz compatible con un algoritmo antiguo, pero que funcione con una lógica nueva. En este caso, utilizan los mismos métodos y nombres que los objetos necesarios, pero internamente tienen nuevos algoritmos. Gracias a esto, los microservicios se comunican entre sí.
En pocas palabras, si algo responde a una solicitud como un servidor de correo y envía datos en formato de servidor de correo, entonces, desde el punto de vista del microservicio, es un servidor de correo.
Ejemplo de Duck Typing
Imaginemos que en nuestro código hay un fragmento que obtiene la longitud del objeto que recibe y luego hace algo con ella. En Python, la función len()
se encarga de esto, por ejemplo:
len([1,2,3,4,5])
// devolverá el número 5
len('Hola, esta es la revista "Código"!')
// devolverá el número 25
Pero si como parámetro en len()
se pasa un objeto de nuestra nueva clase, el ordenador devolverá un error: no sabe cómo calcular la longitud de los objetos.
len(mi_nueva_superclase)
// devolverá un error
Para sortear esta limitación, se puede utilizar el tipado de pato. Esto significa que si enseñamos al objeto a devolver la longitud en respuesta a la solicitud len()
, dicho objeto no se diferenciará en nada de una matriz o una cadena en este aspecto. Añadamos a nuestra clase el método __len__
: éste es el que se invoca implícitamente cada vez que se calcula la longitud de las cadenas o matrices:
class mi_nueva_superclase:
def __len__(self):
return 888
Traducción: «Creamos una nueva clase de objetos que llamamos mi_nueva_superclase
. Podemos crear un objeto a partir de esta clase. Si preguntamos cuál será la longitud de este objeto, obtendremos constantemente el número 888″:
len(mi_nueva_superclase)
// devolverá el número 888
¿Qué Lenguajes Admiten el Duck Typing?
De una forma u otra, el tipado de pato está presente en muchos lenguajes modernos; los programadores lo utilizan para sortear algunas limitaciones. Se suele encontrar en lenguajes de scripting, cuando a menudo no se sabe de antemano con qué se va a trabajar, pero sí se entiende cómo hacerlo.
En cuanto a los lenguajes más populares que cuentan con tipado de pato, son los siguientes:
- Python
- Perl
- Ruby
- JavaScript
- Go
- Scala
- Objective-C
En Resumen
Para el tipado de pato no importa a qué tipo o clase pertenecen los objetos. Lo principal es cómo se comportan y cómo funcionan, y lo que tienen dentro en realidad es asunto suyo.