Я кодировщик Ruby. Для меня monkeypatching - это изменение во время выполнения методов классов или модулей во внешнем проекте. Меня интересует, какой у вас есть механизм, который защитит вас от некоторых злоупотреблений этой замечательной функцией. Далее следуют некоторые сценарии, с которыми мне приходилось сталкиваться, когда меня укусила мартышка.
Хотя я и не знаю Smalltalk, этот язык был там задолго до Ruby. Я провел небольшое исследование, чтобы выяснить, как и каким образом Smalltalk решил некоторые из этих проблем, но мало что нашел в Google. Итак, я спрашиваю Smalltalker'ов, могут ли они поделиться своей мудростью.
Сценарий A: конфликт исправления ошибок
Проект A и B зависят от проекта C. В проекте C есть ошибка. Релизы проектов A и B содержат исправление для проекта C.
Если ваш код использует проекты A и B, как вы узнаете, что исправления не будут конфликтовать?
Сценарий B: устаревшее исправление ошибки
Project C выпускает исправленную минорную версию своего проекта.
Если вы загрузите проект A, будет ли патч все еще применяться с потенциальной поломкой? Мне интересно знать, есть ли какой-нибудь механизм, например, чтобы не загружать патч, если код исправлен.
Сценарий C: конфликтующие расширения
Проекты A и B используют проект C класса Foo. Оба добавляют служебный метод в Foo, скажем, #toDate.
Версия A toDate возвращает строку даты, а версия B - объект Date.
Если вы загружаете оба проекта (с помощью C dep), существует ли механизм, который будет предупреждать / предотвращать конфликт? Или вам придется ждать, пока среда выполнения выдаст ошибку из-за неверного ожидания в методе?
Об обновлении вопроса
Читая ответы, я понимаю, что мой вопрос был слишком широким и расплывчатым. Итак, вот его переписанная версия.