Обезьяны в Rails - PullRequest
       3

Обезьяны в Rails

2 голосов
/ 10 ноября 2010

Является ли monkeypatching хорошей практикой разработки?Когда я должен сделать monkeypatch, а не, скажем, разветвлять гем и сделать патч для разветвленного проекта?

Ответы [ 2 ]

3 голосов
/ 11 ноября 2010

В общем, исправление обезьян никогда не бывает хорошей практикой.Тем не менее, я часто использую его для очень особых случаев, отличных от приложения.Во всех других случаях я бы предпочел разветвить гем или плагин и установить разветвленный драгоценный камень прямо в папку с драгоценными камнями моего приложения.

У меня также есть несколько модулей инструментов, которые обезьяна исправляет некоторые классы для добавления специальныхцелевое поведение в некоторых стандартных классах для повторного использования в различных приложениях - но они все еще достаточно особенные, чтобы не быть полезными для публики, или просто невозможно создавать вилки.

Так что, в конце концов, это решение о специализациии совместимость.Всегда имейте в виду, что исправление обезьян с большей вероятностью нарушит ожидаемое поведение других плагинов или драгоценных камней, которые вы можете использовать в своем проекте.Это может стать еще более неизбежным после обновления компонентов в вашей рабочей экосистеме приложений (или внешней поддерживающей экосистеме, такой как Rails и ее зависимости).

2 голосов
/ 11 ноября 2010

Если вы практикуете ответственное перфорирование, его может быть так же легко поддерживать, как и локальную копию драгоценного камня для конкретного проекта. Это полностью зависит от вашего усердия документирования проблем обновления с любым из решений. Легко сказать, что ни вы, ни разработчик службы поддержки не будут безрассудно заменять этот драгоценный камень вендором / драгоценными камнями через год, но это происходит. Формирование проекта, его исправление локально, а затем отправка запроса на извлечение и возвращение его в основную жемчужину - идеальная ситуация.

Вы должны придерживаться нескольких правил при пробивании утки, если вы выбираете этот маршрут:

  • Патч должен сидеть в явно очевидном месте. В lib / [gem_name] _extensions.rb я бы сначала посмотрел, как разработчик службы поддержки проверяет дефект.
  • Патч должен содержать большое количество документации. Это должно очертить потенциальные кошмары апгрейда.
  • Патч должен быть сделан на другом модуле, который затем включается в оригинальный стиль модуля / класса ActiveSupport. Это позволяет разработчику поддержки вызывать problem_method.ancestors и видеть, что выполняется обезьяна.

Это был бы способ сделать это таким образом, чтобы сохранить старый метод (для развлечения и игр) и позволить вам легче отслеживать его с помощью problem_method.ancestors ().

#lib/mongomapper_extensions.rb
module MongomapperExensions
  module ProblemClassExensions
    alias :old_problem_method :problem method
    def problem_method
      #guerilla code goes here!
    end
  end
end
class ProblemClass
  include MongoMapperExtensions::ProblemClassExtensions
end
...