La mecanografía de pato en la programación de computadoras es una aplicación de la prueba del pato - "Si camina como un pato y grazna como un pato, entonces debe ser un pato" - para determinar si un objeto puede usarse para un propósito particular. Con la escritura normal, la idoneidad está determinada por el tipo de objeto. En la tipificación de pato, la idoneidad de un objeto está determinada por la presencia de ciertos métodos y propiedades, en lugar del tipo de objeto en sí. [1] [2]
Ejemplo
Este es un ejemplo simple en Python 3 que demuestra cómo se puede usar cualquier objeto en cualquier contexto, hasta que se usa de una manera que no es compatible.
class Duck : def fly ( self ): print ( "Pato volando" )clase Ballena : def nadar ( yo mismo ): imprimir ( "Ballena nadando" )para animal en ( pato (), ballena ()): animal . volar ()
Producción:
Pato volandoAttributeError: el objeto 'Whale' no tiene el atributo 'fly'
En lenguajes de tipado estático
En algunos lenguajes de tipado estático como C # y Boo , [3] [4] se puede especificar que la verificación de tipos de clases ocurra en tiempo de ejecución en lugar de tiempo de compilación. La escritura de pato se puede lograr en Java utilizando la API MethodHandle. [5]
Comparación con otros tipos de sistemas
Sistemas de tipo estructural
La tipificación de pato es similar pero distinta a la tipificación estructural . La tipificación estructural es un sistema de tipificación estático que determina la compatibilidad y equivalencia de tipos mediante la estructura de un tipo, mientras que la tipificación de pato es dinámica y determina la compatibilidad de tipos solo por la parte de la estructura de un tipo a la que se accede durante el tiempo de ejecución .
Los lenguajes TypeScript , [6] OCaml , Scala , Go , Elm , [7] Gosu y PureScript admiten la escritura estructural en diversos grados.
Protocolos e interfaces
Los protocolos y las interfaces pueden proporcionar algunos de los beneficios de la escritura de pato, sin embargo, la escritura de pato se distingue por no tener una interfaz explícita definida. Por ejemplo, si una biblioteca de terceros implementa una clase que no se puede modificar, un cliente no puede usar una instancia de la misma con una interfaz desconocida para esa biblioteca, incluso si la clase, de hecho, satisface los requisitos de la interfaz. (Una solución común a este problema es el patrón Adaptador ). La escritura en forma de pato permitiría esto. Nuevamente, toda una interfaz debe satisfacerse para que sea compatible.
Plantillas o tipos genéricos
La plantilla o las funciones o métodos genéricos aplican la prueba de pato en un contexto de escritura estático ; esto trae todas las ventajas y desventajas de la verificación de tipos estática versus dinámica en general. Duck typing también puede ser más flexible en el sentido de que solo deben implementarse los métodos realmente llamados en tiempo de ejecución, mientras que las plantillas requieren implementaciones de todos los métodos que no pueden demostrarse inalcanzables en tiempo de compilación .
Los lenguajes como Python, Java y Objective-C son ejemplos de escritura pato porque en ellos es posible construir nuevos tipos en tiempo de ejecución a través de la reflexión e inspeccionar si estos objetos implementan ciertos métodos. Por otro lado, hay lenguajes que se basan en técnicas de metaprogramación en tiempo de compilación (como C ++ y su sistema de plantillas) y, por lo tanto, no encajan en la categoría de escritura pato; en cambio, en algún punto de la canalización de compilación, todos los tipos de marcadores de posición se sustituyen por algunos tipos concretos especificados en una instanciación particular. Aunque en ellos es posible borrar ciertos tipos, la inspección en tiempo de ejecución es limitada.
Ver también
Referencias
- ^ "Glosario - Documentación de Python 3.7.1" . docs.python.org . Consultado el 8 de noviembre de 2018 .
- ^ "Escritura de pato en Python - Ejemplo" . Horas de Techie . 2020-06-28 . Consultado el 26 de julio de 2020 .
- ^ Boo: Duck Typing Archivado el 6 de octubre de 2008 en la Wayback Machine.
- ^ "Anders Hejlsberg presenta C # 4.0 en PDC 2008" . Consultado el 30 de enero de 2017 .
- ^ "StackOverflow: Implementar la escritura de pato usando Java MethodHandles" . Consultado el 13 de junio de 2020 .
- ^ "Episodio 384 de SE Radio: Boris Cherny en TypeScript" . se-radio.net . Consultado el 25 de octubre de 2019 .
- ^ Czaplicki, Evan. "Core Language · Una introducción a Elm" . Consultado el 30 de enero de 2017 .