Monkey patch (Monkey patch)
Monkey patch (обезьяний патч) — в программировании возможность подмены методов и значений атрибутов классов программы во время её выполнения (runtime). Технология может использоваться во многих динамических языках программирования (JavaScript, Perl, PHP, Python, Ruby, Lua).
Происхождение названия метода
[править | править код]Термин «monkey patch» происходит от изначального термина «guerrilla patch» (партизанский патч), который означал незаметную подмену кода во время исполнения программы. Слово guerrilla (партизанский) созвучно слову gorilla (горилла), и таким образом термин из «guerrilla patch» превратился в «gorilla patch», а затем и в «monkey patch».
Точное определение и степень негативности термина зависит от языка программирования, по отношению к которому он употребляется. Так, в Ruby, Python и многих других динамических языках программирования термин «обезьяний патч» употребляется только по отношению к динамическому изменению классов или модулей, например, для исправления ошибки или добавления новой функциональности во внешнем коде. Такой же подход в других языках программирования может называться по-другому, например, «горячими исправлениями» (hot fix).
Применение
[править | править код]- Динамическая подмена кода методов, функций и атрибутов, например, для создания функции-заглушки для тестов;
- Изменение или расширение функциональности внешних библиотек или продуктов в условиях отсутствия исходного кода или при нежелании поддерживать его в дальнейшем;
- Подмена объектов в памяти во время исполнения программы, а не изменение исходного кода программы;
- Распространение исправлений для некоего продукта, которые будут исполняться независимо от основного кода продукта.
Потенциальные проблемы
[править | править код]- При обновлении продукта, к которому применяется «обезьяний патч», могут возникать непредвиденные изменения поведения программы, когда сам патч начинает основываться на неправильных предположениях о коде заменяемых функций. По этой причине чаще всего такие патчи проверяют некоторые специфические условия, например, версию продукта;
- Если одновременно несколько патчей попытаются подменить один и тот же метод, то, как правило, «победит» первый, а второй будет работать исходя из неверного представления о том, что он сам подменил код;
- Наиболее очевидная проблема: исходный код и наблюдаемое поведение исполняемой программы могут разительно отличаться, и неосведомлённому об «обезьяньем патче» человеку будет сложно найти проблему в коде.
К тому же использование такого подхода нарушает принцип инкапсуляции объектно-ориентированного программирования.
Ссылки
[править | править код]- Ruby 2.0 arrives with refined monkey patching, faster Rails startup. Monkeying around isn't such a bad thing. Архивная копия от 15 ноября 2013 на Wayback Machine // Jon Brodkin, Arstechnica, Feb 25, 2013
- Monkeypatching For Humans Архивная копия от 23 ноября 2013 на Wayback Machine // Jeff Atwood, July 12, 2008
- Monkey patching: the good, the bad and the ugly. Run-time software modification can save your day, and kill your project. Архивная копия от 21 января 2014 на Wayback Machine, Cosent, Sep 02, 2013
- Monkeypatching is Destroying Ruby Архивная копия от 31 октября 2013 на Wayback Machine // AVDI GRIMM, FEBRUARY 23, 2008