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