Что именно меняют при monkey patching

Monkey patching — это приём, при котором во время работы программы заменяют или дополняют уже существующую функцию, метод либо свойство объекта. Методом называют функцию, связанную с объектом или классом. Вместо правки исходного файла код подставляет новую реализацию туда, откуда программа будет брать её при следующем вызове.

Например, библиотека может предоставлять функцию отправки запроса. Другой код сохраняет исходную функцию, назначает на её место обёртку — функцию, которая сначала выполняет дополнительное действие, а затем вызывает оригинал. Обёртка может записать запрос в журнал или изменить его параметры. Для остальной программы вызов по-прежнему выглядит привычно, но за ним теперь происходит больше.

Почему это работает — и чем опасно

В языках, где программу можно менять во время выполнения, обращения к функциям и методам нередко разрешаются через таблицы имён или свойства объектов. Если заменить нужную запись, последующий код получит новую реализацию. Но такой приём доступен не во всех языках и не во всех ситуациях: часть решений определяется заранее, а некоторые ссылки на старую функцию уже могли быть сохранены.

Техника полезна для временного исправления ошибки, подключения дополнительного поведения или подмены функции в тесте. Однако замена может повлиять не только на тот участок, где её установили: другие части программы способны пользоваться тем же объектом или классом. Тогда результат зависит от того, какой код выполнился первым и кто ещё изменял ту же функцию. Ошибка проявится далеко от места подмены, а обычный поиск по исходникам не покажет, почему поведение изменилось.

Главная цена monkey patching — скрытая связь между участками программы. Поэтому такую подмену обычно делают узкой, явно ограничивают по времени и восстанавливают исходную реализацию, когда она больше не нужна.