В компьютерном программировании исправление обезьян — это метод динамического изменения объектов во время выполнения. Эти сущности почти всегда являются свойствами или методами экземпляра.

Этот метод обычно используется для расширения или изменения поведения стороннего модуля или внутренних компонентов системы.

Следующая иллюстрация может помочь понять общую идею этой техники:

В этой статье давайте рассмотрим, что это такое, на практическом примере и обсудим, почему это может вызвать долгосрочные проблемы с программным обеспечением.

Патч обезьяны? это бананы

Чтобы понять концепцию, давайте рассмотрим упрощенный пример:

Допустим, у нас есть объект с именем arithmetic, предоставляемый вымышленной сторонней библиотекой с именем Monkey со следующими свойствами:

//Monkey.arithmetic
{
  add: (value) => value + 1,
  sub: (value) => value - 1,
}

давайте предположим, что код, который мы поддерживаем, использует этот модуль следующим образом:

import Monkey from './Monkey.js';

function monkeyAdd(input) {
  console.log(`Monkey says ${Monkey.arithmetic.add(input)}`);
}

monkeyAdd(5); // Monkey says 6

Теперь давайте пропатчим метод add из библиотеки во время выполнения:

import Monkey from './Monkey.js';

(() => {
  Monkey.arithmetic.add = () => 'Banana';
})();


function monkeyAdd(input) {
  console.log(`Monkey says ${Monkey.arithmetic.add(input)}`);
}

monkeyAdd(5); // Monkey says Banana

Мы изменили метод добавления, предоставляемый другим модулем, с помощью выражения немедленно вызываемой функции (IIFE) во время выполнения. По сути, мы сделали исправление обезьяны, потому что любой другой модуль, который обращается к этому методу из Monkeylibrary после выполнения IIFE, получит измененное значение.

Расширение до практического примера

На практике метод исправления обезьяны используется для расширения или изменения стороннего кода или незащищенной системы…