Parche de mono - Monkey patch
Un parche de mono es una forma de que un programa extienda o modifique el software del sistema de soporte localmente (afectando solo la instancia en ejecución del programa).
Etimología
El término parche de mono parece provenir de un término anterior, parche de guerrilla , que se refería a cambiar el código de manera furtiva, y posiblemente incompatible con otros parches similares, en tiempo de ejecución. La palabra guerrilla , homófona con gorila (o casi), se convirtió en mono , posiblemente para hacer que el parche suene menos intimidante.
Una etimología alternativa es que se refiere a "hacer el tonto" con el código (jugar con él).
A pesar de la sugerencia del nombre, el "parche de mono" es a veces el método oficial para extender un programa. Por ejemplo, los navegadores web como Firefox e Internet Explorer solían fomentar esto, aunque los navegadores modernos (incluido Firefox) ahora tienen un sistema de extensiones oficial.
Definiciones
La definición del término varía según la comunidad que lo usa. En Ruby , Python y muchos otros lenguajes de programación dinámica , el término parche mono solo se refiere a modificaciones dinámicas de una clase o módulo en tiempo de ejecución, motivadas por la intención de parchear el código de terceros existente como solución a un error o característica que no lo hace. no actuar como se desea. Otras formas de modificar clases en tiempo de ejecución tienen diferentes nombres, según sus diferentes intenciones. Por ejemplo, en Zope y Plone , los parches de seguridad a menudo se entregan mediante la modificación de clase dinámica, pero se denominan correcciones urgentes .
Aplicaciones
El parche de mono se usa para:
- Reemplazar métodos / clases / atributos / funciones en tiempo de ejecución, por ejemplo, para stub a cabo una función durante la prueba;
- Modificar / ampliar el comportamiento de un producto de terceros sin mantener una copia privada del código fuente;
- Aplicar el resultado de un parche en tiempo de ejecución al estado en la memoria , en lugar del código fuente en el disco ;
- Distribuir las correcciones de seguridad o de comportamiento que conviven con el código fuente original (un ejemplo de esto sería distribuir la corrección como un complemento para la plataforma Ruby on Rails );
- Explore diferentes correcciones automatizadas para proporcionar autorreparación.
Trampas
Los parches de mono maliciosos, mal escritos o mal documentados pueden provocar problemas:
- Pueden dar lugar a problemas de actualización cuando el parche hace suposiciones sobre el objeto parcheado que ya no son ciertas; una nueva versión puede romper el parche. Por esta razón, los parches de mono a menudo se condicionan y solo se aplican si corresponde.
- Si dos módulos intentan parchear el mono con el mismo método , uno de ellos (el que se ejecute en último lugar) "gana" y el otro parche no tiene ningún efecto, a menos que los parches mono se escriban con un patrón similar
alias_method_chain. - Crean una discrepancia entre el código fuente original y el comportamiento observado que puede resultar muy confuso para cualquiera que desconozca la existencia del parche. Por ejemplo, el kernel de Linux detecta módulos propietarios y otros módulos de terceros, como el controlador Nvidia , que alteran las estructuras del kernel, de modo que los desarrolladores no pierdan el tiempo tratando de depurar un problema que no pueden solucionar.
- Se pueden escribir con código malicioso para atacar el programa principal o entre sí. Como ejemplo, en 2009, Giorgio Maone, desarrollador de NoScript , atacó la extensión Adblock Plus para Firefox, agregando excepciones para que los anuncios en sus propios sitios web funcionaran. El código infractor también aseguró que si el usuario intentaba eliminar las excepciones, se agregarían nuevamente. La disputa provocó una ira generalizada, lo que llevó a una guerra de ida y vuelta entre las nuevas reglas de adblock que se enviaban a los usuarios, seguido de Maone saboteando las nuevas, lo que finalmente llevó a Mozilla a intervenir para cambiar las políticas con respecto a los complementos.
Ejemplos de
El siguiente ejemplo de Python monkey-parchea el valor de Pi de la biblioteca matemática estándar de Python para que sea compatible con Indiana Pi Bill .
>>> import math
>>> math.pi
3.141592653589793
>>> math.pi = 3.2 # monkey-patch the value of Pi in the math module
>>> math.pi
3.2
================================ RESTART ================================
>>> import math
>>> math.pi
3.141592653589793
>>>
Ver también
- Polyfill
- Programación Orientada a Aspectos
- Categoría en Objective-C
- Carga dinámica
- Método de extensión en C #
- Código auto modificable