Как создать безопасный, обратно совместимый «reverse-monkeypatch» на Ruby?
-
22-08-2019 - |
Вопрос
Если ваш коллега «открывает» («monkeypatches») класс в Ruby и переопределяет некоторые важные функции, которые вам нужно использовать, как вы можете получить доступ к этой исходной функциональности, предварительно исправленной Monkeypatches, не нарушая систему, которая уже зависит от его определений, исправленных обезьяной? ?
Решение
Учитывая пример переопределения метода, если вы можете загрузить некоторый код до загрузки его обезьяньего патча, вы можете использовать псевдоним для метода.
class Fixnum
alias_method :original_plus, :+
end
class Fixnum
def +(x)
self - x
end
end
>> 5 + 3
=> 2
>> 5.original_plus(3)
=> 8
Другие советы
Недавно я видел это в канале Rubyflow — это простая библиотека, которая позволяет вам использовать константы верхнего уровня пространства имен, называемые айкидока.Без каких-либо подробностей о том, как/что исправляет обезьяна, помочь сложно.Теоретически вы могли бы использовать подобный подход для создания пространства имен версии класса, исправленной обезьяной, чтобы вы могли независимо обращаться как к ней, так и к оригиналу.
Зависит, какая именно функциональность была изменена и каким образом, но что-то вроде реализации Джима Винриха Чистый лист класс может помочь: