Monkey Patching, Duck Typing e Inyección de Dependencias. https://podcast.jcea.es/podcastz/2
00:50: Se utiliza un caso real para explicar estas técnicas con más facilidad. 01:50: La librería estándar para el envío de correo electrónico en Python, la SMTPlib, se nos queda pequeña (para este proyecto en concreto).
02:01: ¡Sí!, ¡por supuesto que usamos Python!. 02:12: Pero estas técnicas son aplicables también a otros lenguajes dinámicos. 02:48: Los motivos por los que la SMTPlib se me quedaba pequeña: Quiero
"timeouts" dinámicos, quiero limitar el número de conexiones simultaneas por servidor de correo,
y quiero controlar la IP de origen de la conexión saliente.
05:52: ¿Por qué no modificamos el código directamente o utilizamos los mecanismos de herencia normales?. Por mantenimiento de código y porque lo que queremos modificar no es
fácilmente accesible por herencia porque está muy "profundo" en la clase original.
09:04: Por fin entramos en materia. Empezamos con Monkey Patching. Modificación
de código, clases y objetos en memoria.
12:44: ¿Cuándo es preferible utilizar Monkey Patching en vez
de mecanismos más habituales?.
Monkey Patching: Los
"hot fixes"
tradicionales de ZOPE.
16:29: Por supuesto, esta técnica es compleja y delicada, y tiene sus riesgos. 18:17: Pasamos a hablar de Duck Typing. Polimorfismo sin
herencia. Frase del día: "Es un pato a efectos prácticos". O su corolario posterior:
"Si parece un pato, es un pato. Aunque no lo sea" :-).
20:25: En lenguajes estáticos como Java, se utiliza el concepto de "interfaces abstractos",
verificados en tiempo de compilación. Con Python no se realiza ninguna comprobación, y la compatibilidad
de tipos se decide en tiempo de ejecución, cuando se invocan métodos concretos con parámetros concretos.
22:19: Los interfaces abstractos te permite definir dos objetos como compatibles, aunque no hereden de las mismas clases.
22:28: Un ejemplo de interfaces es la abstracción de ficheros en Python (o, por ejemplo, en la filosofía UNIX de que todo es un fichero).
también tiene sus problemas.
25:09: Hay dos escuelas de pensamiento en casi todo, dicotomías por doquier. 26:00: Una forma de estar tranquilos es tener una buena batería de test.
inyección de dependencias.
Recapitulamos y, ahora, todo encaja.
28:41: Desvinculamos la dependencia implícita interna que tiene una librería, y la hacemos explícita y manipulable.
29:00: La inyección de dependencias te facilita mucho la vida a la hora de probar el código. 30:40: Bueno, en realidad el programa de ejemplo que he usado para ilustrar la descripción de estas técnicas no funciona como se ha descrito :-). Se emplea también Monkey Patching,
pero de forma diferente y más estable
ante actualizaciones python. Lo detallé en mi web en 2007.