El "monkey patching" consiste en modificar dinámicamente el código de ejecución (no el código fuente ) de un lenguaje de programación dinámico , y se refiere a la información (datos/código) utilizada para modificar dicho código. El "monkey patching" añade o reemplaza elementos de programación como métodos , clases , atributos y funciones en memoria . Modificar el código de ejecución permite alterar el comportamiento de software de terceros sin necesidad de mantener una versión modificada del código fuente.
El término «monkey patch» parece provenir de un término anterior, «guerrilla patch» , que se refería a modificar el código sigilosamente —y posiblemente de forma incompatible con otros parches similares— durante la ejecución. La palabra «guerrilla» , casi homófona de «gorila» , se convirtió en «monkey» , posiblemente para que el parche sonara menos intimidante. [ 1 ]
A pesar de lo que sugiere su nombre, un 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 fomentarlo, aunque hoy en día los navegadores (incluido Firefox) admiten las extensiones de forma diferente. [ 2 ]
El término "monkey patch" varía según el contexto. En Ruby , [ 3 ] Python , [ 4 ] y otros lenguajes, "monkey patch" se refiere únicamente a la modificación dinámica de una clase o módulo en tiempo de ejecución, motivada por la intención de parchear código de terceros existente como solución alternativa a un error o característica que no funciona como se desea. Otras formas de modificar clases en tiempo de ejecución tienen nombres diferentes. Por ejemplo, en Zope y Plone , los parches de seguridad a menudo se entregan mediante la modificación dinámica de clases, pero se denominan "hot fixes" .
Escollos
Algunos inconvenientes de la técnica de parcheo por reposición:
- Incompatibilidad
Una nueva versión del software parcheado puede invalidar el parche. Por esta razón, un parche de modificación puede ser condicional y, por lo tanto, solo aplicarse si es apropiado. [ 5 ]
- Sobrescritura
Si se aplica el mismo método varias veces, solo se utiliza el último; los demás parches no tienen efecto, a menos que se escriban parches de tipo monkey con un patrón como alias_method_chain . [ 6 ]
- Confusión
Un monkey patch crea una discrepancia entre el código fuente y el comportamiento real que puede confundir a los desarrolladores. Por ejemplo, el kernel de Linux detecta módulos propietarios y de terceros, como el controlador de Nvidia , que alteran las estructuras del kernel, para que los desarrolladores no pierdan el tiempo intentando depurar un problema que no pueden solucionar. [ 7 ]
- Caos
Un monkey patch puede contener código malicioso que ataca el programa u otros parches. Por ejemplo, en 2009, Giorgio Maone, desarrollador de NoScript , atacó la extensión Adblock Plus para Firefox, añadiendo excepciones para que los anuncios en sus sitios web funcionaran. El código malicioso también garantizaba que si el usuario intentaba eliminar las excepciones, estas se volverían a añadir. Se desató una guerra cada vez más intensa con nuevas reglas de bloqueo de anuncios impuestas a los usuarios, seguidas de sabotajes por parte de Maone, lo que finalmente llevó a Mozilla a intervenir para cambiar las políticas relativas a los complementos. [ 8 ]
Ejemplos
El siguiente código modifica el valor de pi en la biblioteca matemática estándar de Python para que cumpla con la ley de pi de Indiana .
>>> import math >>> math.pi 3.141592653589793 >>> math.pi = 3.2 # modifica el valor de Pi en el módulo math >>> math.pi 3.2La próxima vez que se inicie Python, el valor de pi será el que era antes del parche: 3.141592653589793.
Véase también
- Consejos (programación)
- Programación orientada a aspectos
- Carga dinámica
- Método de extensión
- Categoría Objective-C
- Relleno de poliéster
- Código automodificable
Referencias
- ^ "Glosario — Definición de 'Parche de mono'"" . Sistema de gestión de contenido Plone . Archivado del original el 22/01/2021 . Recuperado el 02/07/2021 .
Cuando alguien creó un parche de guerrilla con mucho cuidado y trató de evitar cualquier batalla, intentó que sonara menos agresivo llamándolo parche de mono
- ^ Guha, Arjun; Fredrikson, Matthew; Livshits, Benjamin; Swamy, Nikhil (22–25 de mayo de 2011). «Seguridad verificada para extensiones de navegador». Simposio IEEE de 2011 sobre seguridad y privacidad . págs. 115–130 . doi : 10.1109/SP.2011.36 . ISBN 978-1-4577-0147-4.
- ^ Nutter, Charles Oliver. "Refinando el rubí" . Charles Oliver Nutter .
- ^ Biswal, Bimal. "Monkey Patching en Python" . Consejos sobre tecnología de software . Mindfire Solutions. Archivado del original el 22 de agosto de 2012. Recuperado el 9 de diciembre de 2013 .
- ^ Zakas, Nicholas C. (2 de marzo de 2010). "JavaScript mantenible: No modifiques objetos que no te pertenecen - Human Who Codes" . Human Who Codes .
- ^ "Novedad en Rails: Módulo#alias_method_chain" . Ruby on Rails .
- ^ "Núcleos contaminados: la documentación del núcleo de Linux" . www.kernel.org . Consultado el 12 de julio de 2020 .
- ^ Paul, Ryan (2009-05-04). "Mozilla sopesa un cambio de política tras la batalla por la extensión de Firefox" . Ars Technica . Recuperado el 12 de julio de 2020 .
- Programación orientada a objetos
- Estructuras de programación
