Термин «monkey patch» происходит от изначального термина «guerrilla
patch
» (
партизанский патч
), который означал незаметную подмену
кода
во время исполнения программы. Слово
guerrilla
(партизанский) созвучно слову
gorilla
(горилла), и таким образом термин из «guerrilla patch» превратился в «gorilla patch», а затем и в «monkey patch».
Точное определение и степень негативности термина зависит от языка программирования, по отношению к которому он употребляется. Так, в Ruby, Python и многих других динамических языках программирования термин «обезьяний патч» употребляется только по отношению к динамическому изменению классов или модулей, например, для исправления ошибки или добавления новой функциональности во внешнем коде. Такой же подход в других языках программирования может называться по-другому, например, «горячими исправлениями» (
hot fix
).
Применение
Динамическая подмена кода методов, функций и атрибутов, например, для создания функции-заглушки для
тестов
;
Изменение или расширение функциональности внешних
библиотек
или продуктов в условиях отсутствия исходного кода или при нежелании поддерживать его в дальнейшем;
Подмена объектов в
памяти
во время исполнения программы, а не изменение исходного кода программы;
Распространение исправлений для некоего продукта, которые будут исполняться независимо от основного кода продукта.
Потенциальные проблемы
При обновлении продукта, к которому применяется «обезьяний патч», могут возникать непредвиденные изменения поведения программы, когда сам патч начинает основываться на неправильных предположениях о коде заменяемых функций. По этой причине чаще всего такие патчи проверяют некоторые специфические условия, например, версию продукта;
Если одновременно несколько патчей попытаются подменить один и тот же метод, то, как правило, «победит» первый, а второй будет работать исходя из неверного представления о том, что он сам подменил код;
Наиболее очевидная проблема: исходный код и наблюдаемое поведение исполняемой программы могут разительно отличаться, и неосведомлённому об «обезьяньем патче» человеку будет сложно найти проблему в коде.