Interested Article - 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 ).

Применение

  • Динамическая подмена кода методов, функций и атрибутов, например, для создания функции-заглушки для тестов ;
  • Изменение или расширение функциональности внешних библиотек или продуктов в условиях отсутствия исходного кода или при нежелании поддерживать его в дальнейшем;
  • Подмена объектов в памяти во время исполнения программы, а не изменение исходного кода программы;
  • Распространение исправлений для некоего продукта, которые будут исполняться независимо от основного кода продукта.

Потенциальные проблемы

  • При обновлении продукта, к которому применяется «обезьяний патч», могут возникать непредвиденные изменения поведения программы, когда сам патч начинает основываться на неправильных предположениях о коде заменяемых функций. По этой причине чаще всего такие патчи проверяют некоторые специфические условия, например, версию продукта;
  • Если одновременно несколько патчей попытаются подменить один и тот же метод, то, как правило, «победит» первый, а второй будет работать исходя из неверного представления о том, что он сам подменил код;
  • Наиболее очевидная проблема: исходный код и наблюдаемое поведение исполняемой программы могут разительно отличаться, и неосведомлённому об «обезьяньем патче» человеку будет сложно найти проблему в коде.

К тому же использование такого подхода нарушает принцип инкапсуляции объектно-ориентированного программирования .

Ссылки

Источник —

Same as Monkey patch