Патч обезьяны - Monkey patch

Обезьяна патч является для программы , чтобы расширить или изменить поддержку программного обеспечения системы локально (затрагивающий только запущенный экземпляр программы).

Этимология

Термин « обезьяний патч», похоже, произошел от более раннего термина « партизанский патч» , который относился к изменению кода незаметно - и, возможно, несовместимо с другими подобными патчами - во время выполнения. Слово « партизан» , перекликающееся с словом « горилла» (или почти так), превратилось в « обезьяну» , возможно, чтобы сделать патч менее устрашающим.

Альтернативная этимология состоит в том, что это относится к «обмануться» с кодом (возиться с ним).

Несмотря на предполагаемое название, «обезьяний патч» иногда является официальным методом расширения программы. Например, такие веб-браузеры, как Firefox и Internet Explorer, раньше поощряли это, хотя современные браузеры (включая Firefox) теперь имеют официальную систему расширений.

Определения

Определение термина варьируется в зависимости от сообщества, которое его использует. В Ruby , Python и многих других языках динамического программирования термин « патч обезьяны» относится только к динамическим модификациям класса или модуля во время выполнения, мотивированным намерением исправить существующий сторонний код в качестве обходного пути к ошибке или функции, которая делает действовать не так, как хотелось бы. Другие формы изменения классов во время выполнения имеют разные имена в зависимости от их различных целей. Например, в Zope и Plone исправления безопасности часто доставляются с использованием динамической модификации класса, но они называются оперативными исправлениями .

Приложения

Патч Monkey используется для:

  • Заменить методы / классы / атрибуты / функции во время выполнения, например, чтобы заглушить функцию во время тестирования;
  • Изменять / расширять поведение стороннего продукта без сохранения частной копии исходного кода;
  • Применить результат исправления во время выполнения к состоянию в памяти , а не к исходному коду на диске ;
  • Распространять исправления безопасности или поведения, которые существуют вместе с исходным исходным кодом (примером этого может быть распространение исправления в виде подключаемого модуля для платформы Ruby on Rails );
  • Изучите различные автоматические исправления для самовосстановления.

Ловушки

Вредоносные, некомпетентно написанные и / или плохо документированные патчи обезьян могут привести к проблемам:

  • Они могут привести к проблемам при обновлении, когда исправление делает предположения о исправленном объекте , которые больше не соответствуют действительности; новый выпуск вполне может сломать патч. По этой причине обезьяны часто делаются условными и применяются только в случае необходимости.
  • Если два модуля пытаются исправить один и тот же метод обезьяны , один из них (какой из них запускается последним) «выигрывает», а другой патч не имеет никакого эффекта, если только обезьяны не написаны с шаблоном вроде alias_method_chain.
  • Они создают несоответствие между исходным исходным кодом и наблюдаемым поведением, которое может сбить с толку любого, кто не знает о существовании патча. Например, ядро Linux обнаруживает проприетарные и другие сторонние модули, такие как драйвер Nvidia , которые изменяют структуру ядра, так что разработчики не будут тратить свое время на отладку проблемы, которую они не могут исправить.
  • Они могут быть написаны с использованием вредоносного кода, чтобы атаковать основную программу или друг друга. Например, в 2009 году Джорджио Маоне, разработчик NoScript , атаковал расширение Adblock Plus для Firefox, добавив исключения, чтобы реклама на его собственных веб-сайтах работала. Оскорбительный код также удостоверился, что если пользователь попытается удалить исключения, они будут добавлены снова. Ссора вызвала всеобщее возмущение, что привело к войне между новыми правилами блокировки рекламы, навязываемыми пользователям, а затем саботажем Маоне новых, что в конечном итоге привело к тому, что Mozilla вмешалась, чтобы изменить политику в отношении надстроек.

Примеры

В следующем примере 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
>>>

Смотрите также

Рекомендации