Техника компьютерного программирования
В программировании , обезьянья патча — это метод, используемый для динамического обновления поведения фрагмента кода во время выполнения. Он используется для расширения или изменения кода времени выполнения динамических языков, таких как Smalltalk , JavaScript , Objective-C , Ruby , Perl , Python , Groovy и Lisp , без изменения исходного кода.
Этимология
Термин monkey patch , похоже, произошел от более раннего термина guerrilla patch , который означал скрытное изменение кода – и, возможно, несовместимое с другими подобными патчами – во время выполнения. Слово guerrilla , почти гомофонное с gorilla , стало monkey , возможно, чтобы сделать патч менее устрашающим. [1]
Альтернативная этимология заключается в том, что это относится к «возне» с кодом (возне с ним). [ необходима цитата ]
Несмотря на предположение из названия, «monkey patch» иногда является официальным методом расширения программы. Например, веб-браузеры, такие как Firefox и Internet Explorer, раньше поощряли это, хотя современные браузеры (включая Firefox) теперь имеют официальную систему расширений. [ необходима цитата ]
Определения
Определение термина различается в зависимости от сообщества, использующего его. В Ruby , [2] Python , [3] и многих других динамических языках программирования термин monkey patch относится только к динамическим изменениям класса или модуля во время выполнения, мотивированным намерением исправить существующий сторонний код в качестве обходного пути для ошибки или функции, которая не действует так, как хотелось бы. Другие формы изменения классов во время выполнения имеют разные названия, основанные на их разных намерениях. Например, в Zope и Plone исправления безопасности часто доставляются с помощью динамической модификации класса, но они называются hot fixes . [ необходима цитата ]
Приложения
Обезьянья заплатка используется для:
- Заменять методы / классы / атрибуты / функции во время выполнения, например, для заглушки функции во время тестирования;
- Изменять/расширять поведение стороннего продукта без сохранения частной копии исходного кода;
- Применить результат патча во время выполнения к состоянию в памяти , а не к исходному коду на диске ;
- Распространять исправления безопасности или поведения, которые находятся рядом с исходным кодом (примером этого может быть распространение исправления в виде плагина для платформы Ruby on Rails );
Подводные камни
Вредоносные, некомпетентно написанные и/или плохо документированные патчи могут привести к проблемам:
- Они могут привести к проблемам обновления, когда патч делает предположения о пропатченном объекте , которые больше не являются верными; новый релиз может вполне сломать патч. По этой причине обезьяньи патчи часто делаются условными и применяются только в случае необходимости. [4]
- Если два модуля попытаются применить обезьяний патч к одному и тому же методу , один из них (тот, который запустится последним) «побеждает», а другой патч не оказывает никакого эффекта, если только обезьяньи патчи не написаны с использованием шаблона вроде
alias_method_chain
. [5] - Они создают несоответствие между исходным кодом и наблюдаемым поведением, которое может быть очень запутанным для любого, кто не знает о существовании патча. Например, ядро Linux обнаруживает проприетарные и другие сторонние модули, такие как драйвер Nvidia , которые вмешиваются в структуры ядра, так что разработчики не будут тратить свое время, пытаясь отладить проблему, которую они не могут исправить. [6]
- Они могут быть написаны с использованием вредоносного кода для атаки на основную программу или друг на друга. Например, в 2009 году Джорджио Маоне, разработчик NoScript , атаковал расширение Adblock Plus для Firefox, добавив исключения, чтобы реклама на его собственных веб-сайтах работала. Оскорбительный код также гарантировал, что если пользователь попытается удалить исключения, они будут добавлены снова. Ссора вызвала всеобщий гнев, что привело к войне между новыми правилами AdBlock, которые были предложены пользователям, и последующим саботажем Маоне новых, что в конечном итоге привело к вмешательству Mozilla для изменения политики в отношении дополнений. [7]
Примеры
В следующем примере Python значение числа Пи из стандартной математической библиотеки Python подвергается патчу, чтобы соответствовать закону штата Индиана о числе Пи .
>>> import math >>> math . pi 3.141592653589793 >>> math . pi = 3.2 # monkey-patch значение Pi в модуле math >>> math . pi 3.2 ================================= ПЕРЕЗАПУСК =============================== >>> import math >>> math . pi 3.141592653589793 >>>
Смотрите также
В Викицитатнике есть цитаты, связанные с Monkey patch .
Ссылки
- ^ "Глоссарий — Определение 'Monkey patch'". Система управления контентом Plone . Архивировано из оригинала 2021-01-22 . Получено 2021-07-02 .
когда кто-то очень тщательно создавал партизанский патч и пытался избежать любых сражений, они пытались сделать его менее сильным, называя его monkey patch
- ^ Наттер, Чарльз Оливер. «Очищение Рубина». Чарльз Оливер Наттер .
- ^ Biswal, Bimal. "Monkey Patching in Python". Советы по программным технологиям . Mindfire Solutions. Архивировано из оригинала 22 августа 2012 г. Получено 9 декабря 2013 г.
- ^ Закас, Николас К. (2 марта 2010 г.). «Поддерживаемый JavaScript: не изменяйте объекты, которыми вы не владеете — Human Who Codes». Human Who Codes .
- ^ "Новое в Rails: Module#alias_method_chain". Ruby on Rails .
- ^ «Испорченные ядра — Документация ядра Linux». www.kernel.org . Получено 12 июля 2020 г. .
- ^ Пол, Райан (2009-05-04). «Mozilla обдумывает изменение политики после битвы за расширения Firefox». Ars Technica . Получено 2020-07-12 .