Патч обезьяна
В компьютерном программировании обезьянье исправление — это метод, используемый для динамического обновления поведения фрагмента кода во время выполнения. Он используется для расширения или изменения кода времени выполнения динамических языков, таких как Smalltalk , JavaScript , Objective-C , Ruby , Perl , Python , Groovy и Lisp , без изменения исходного исходного кода.
Этимология
[ редактировать ]Термин «обезьяний патч», по-видимому, произошел от более раннего термина «партизанский патч» , который относился к скрытому изменению кода – и, возможно, несовместимому с другими подобными патчами – во время выполнения. Слово «партизан» , почти гомофонное слову «горилла» , превратилось в «обезьяна» , возможно, чтобы патч звучал менее устрашающе. [1]
Альтернативная этимология заключается в том, что это относится к «игранию» с кодом (возиться с ним). [ нужна ссылка ]
Несмотря на название, «monkey patch» иногда является официальным методом расширения программы. Например, такие веб-браузеры, как Firefox и Internet Explorer, поощряли это, хотя современные браузеры (включая Firefox) теперь имеют официальную систему расширений. [ нужна ссылка ]
Определения
[ редактировать ]Определение этого термина варьируется в зависимости от сообщества, использующего его. В Руби , [2] Питон , [3] и многих других динамических языках программирования , термин «заплатка обезьяны» относится только к динамическим модификациям класса или модуля во время выполнения, мотивированным намерением исправить существующий сторонний код в качестве обходного пути к ошибке или функции, которая не работает должным образом. Другие формы изменения классов во время выполнения имеют разные имена в зависимости от их разных целей. Например, в Zope и Plone исправления безопасности часто доставляются с использованием динамической модификации классов, но они называются горячими исправлениями . [ нужна ссылка ]
Приложения
[ редактировать ]Патчи Monkey используются для:
- Заменять методы / классы / атрибуты / функции во время выполнения, например, чтобы заглушить функцию во время тестирования;
- Изменять/расширять поведение стороннего продукта без сохранения частной копии исходного кода;
- Применить результат патча во время выполнения к состоянию в памяти , а не к исходному коду на диске ;
- Распространять исправления безопасности или поведения, которые находятся рядом с исходным исходным кодом (примером этого может быть распространение исправления в виде плагина для платформы Ruby on Rails );
Подводные камни
[ редактировать ]Вредоносные, некомпетентно написанные и/или плохо документированные обезьяньи патчи могут привести к проблемам:
- Они могут привести к проблемам обновления, когда патч делает предположения об исправленном объекте , которые больше не соответствуют действительности; новый выпуск вполне может сломать патч. По этой причине обезьяньи патчи часто делаются условными и применяются только в случае необходимости. [4]
- Если два модуля пытаются выполнить обезьяний патч одного и того же метода , один из них (в зависимости от того, какой из них запускается последним) «побеждает», а другой патч не имеет никакого эффекта, если только обезьяньи патчи не написаны по шаблону, например
alias_method_chain
. [5] - Они создают несоответствие между исходным исходным кодом и наблюдаемым поведением, что может сбить с толку любого, кто не знает о существовании патча. Например, ядро Linux обнаруживает проприетарные и другие сторонние модули, такие как драйвер Nvidia , которые вмешиваются в структуры ядра, поэтому разработчики не будут тратить свое время на попытки отладить проблему, которую они не могут исправить. [6]
- Они могут быть написаны с использованием вредоносного кода для атаки на основную программу или друг на друга. Например, в 2009 году Джорджио Маоне, разработчик NoScript , атаковал расширение Adblock Plus для Firefox, добавив исключения, чтобы реклама на его собственных сайтах работала. Нарушающий код также гарантировал, что если пользователь попытается удалить исключения, они будут добавлены снова. Ссора вызвала всеобщий гнев, что привело к войне между новыми правилами блокировки рекламы, которые предлагались пользователям, после чего Маоне саботировал новые, что в конечном итоге привело к тому, что Mozilla вмешалась и изменила политику в отношении надстроек. [7]
Примеры
[ редактировать ]В следующем примере Python корректируется значение числа Пи из стандартной математической библиотеки Python, чтобы оно соответствовало Закону штата Индиана о Пи .
>>> 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
>>>
См. также
[ редактировать ]- Полифилл
- Консультации (программирование)
- Аспектно-ориентированное программирование
- Категория в Objective-C
- Динамическая загрузка
- Метод расширения в C#
- Самомодифицирующийся код
Ссылки
[ редактировать ]- ^
«Глоссарий — Определение «пятна обезьяны» » . Система управления контентом 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 г.