Как переопределить метод в ruby ​​для одноразовой задачи rake? - PullRequest
1 голос
/ 03 октября 2019

Я хочу запустить сервисный объект в грабли, но мне нужно изменить метод в другом сервисе, который вызывает мой основной сервисный объект. Например, если у меня есть:

main_service.rb

class MainService
  def perform
    SecondaryService.new.perform
  end
end

second_service.rb

class SecondaryService
  def perform
    some_method
  end

  def some_method
    puts 'something'
  end
end

И яхотите изменить some_method на puts 'anything' для одноразового исправления данных в задаче rake, могу ли я переопределить его, просто переопределив метод, и есть ли способ включить его в задачу rake? Я не хочу, чтобы эта служба случайно вызывалась, когда я запускаю задачу rake на всякий случай. Я думал примерно так:

one_time.rake

class SecondaryService
  def some_method
    puts 'anything'
  end
end

def one_time_change
  MainService.new.perform
end

1 Ответ

4 голосов
/ 03 октября 2019

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

Однако, в зависимости от контекста, существует риск того, что эта стратегия может иметь непредвиденные последствия - то есть, что произойдет, если вы случайно выполните класс monkey-patching, но ожидаете, что исходное поведение будетpreserved?

Более надежный подход - использовать внедрение зависимостей . Делая это, вы можете переопределить поведение с классическим наследованием (или даже передав совершенно новый объект!). Например, что-то вроде:

class MainService
  def perform(secondary_service: SecondaryService.new)
    secondary_service.perform
  end
end

class ModifiedSecondaryService < SecondaryService
  def some_method
    puts 'anything'
  end
end

Теперь, для вашего одноразового рейка, вы можете запустить:

PrimaryService.new.perform(secondary_service: ModifiedSecondaryService.new)
...