Вставка кода из реализации метода дочернего класса между кодами из реализации метода родительского класса - PullRequest
0 голосов
/ 23 апреля 2019

Я использую наследование для извлечения общего поведения в родительский класс.Вот мой родительский класс BaseService:

class BaseService
  def initialize(data, failure_strategy)
    @data = data
    @failure_strategy = failure_strategy
  end

  def create
    return if associated_model.find_by(id: @data['id'])
    # insert specific code from child class CREATE method implementation here
  rescue => exception
    @failure_strategy.rescue(exception)
  end

  private

  def associated_model
    self.class.to_s.delete("EventsService").constantize
  end
end

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

return if associated_model.find_by(id: @data['id'])
        # insert specific code from child class CREATE method implementation here
      rescue => exception
        @failure_strategy.rescue(exception)

Каков правильный способреализовать такое поведение в ruby?

1 Ответ

2 голосов
/ 23 апреля 2019

Как правильно реализовать этот тип поведения в ruby?

То же, что и в любом языке ООП с классическим наследованием: используйте шаблон Template Method .

class BaseService

  def create
    return if associated_model.find_by(id: @data['id'])

    specific_create
  rescue => exception
    @failure_strategy.rescue(exception)
  end

  private

  def specific_create
    # default behaviour, possibly empty.
  end
end

class SpecificService < BaseService
  def specific_create
    # overridden behaviour
  end
end

Я вижу, но моя проблема в том, что я хочу, чтобы мой метод в дочернем классе был назван create.То, что я ищу, это какой-то обратный super, я думаю.

Это похоже на то, что вы можете сделать с блоками.

class Parent
  def create
    puts "prep work"
    yield
  rescue => ex
    puts "error: #{ex}"
  end
end

class Child < Parent
  def create
    super do
      puts "specific work"
    end
  end
end

Child.new.create
# >> prep work
# >> specific work
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...