Условная передача параметров при создании экземпляра класса - PullRequest
0 голосов
/ 12 января 2019

Я выполняю рефакторинг своего кода и хочу передать некоторую логику параметру при создании экземпляра класса. Чтобы лучше описать проблему, я поделюсь некоторым кодом.

У меня есть этот метод, который принимает объект в качестве аргумента.

def common_attributes(klass)
  klass.new(id: some_id, name: some_name, role_id: some_role.id)
end

Я хочу использовать это, чтобы сделать что-то вроде:

def common_attributes(klass)
  klass.new(id: some_id,
            name: some_name
            role_id: some_role.id unless Module::class)
end

Это потому, что у меня есть несколько классов внутри моего модуля. Два из этих классов принимают те же три аргумента, т.е. id и name, role_id. Другой класс принимает два аргумента id и name. Обратите внимание, что это примерные значения, и реализация может не иметь смысла для проблемы I, но важно понять проблему, с которой я столкнулся.

Вот как бы я использовал функцию:

common_attributes(MyModule::Myclass)

common_attributes(MyModule::DifferentClass)

common_attributes(MyModule::AnotherDifferentClass)

Как я могу убедиться, что другой класс, который принимает меньше аргументов, получает требуемые параметры и оставляет то, что ему не нужно?

NB Я не могу редактировать классы для включения дополнительных параметров.

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Вы должны проверить класс klass внутри вашего метода. Если, например, класс, который принимает только два атрибута, равен MyModule::Myclass, а все остальное принимает атрибуты дерева, то любое из этих решений должно работать:

def common_attributes(klass)
  case klass
  when MyModule::Myclass
    klass.new(id: some_id, name: some_name)
  else
    klass.new(id: some_id, name: some_name, role_id: some_role.id)
  end
end

или

def common_attributes(klass)
  options = { id: some_id, name: some_name }

  if klass.is_a?(MyModule::Myclass)
    options[:role_id] = some_role.id
  end

  klass.new(**options)
end

Количество проверок может возрасти, чтобы охватить больше особых случаев, в зависимости от ситуации.

0 голосов
/ 12 января 2019

Может быть arity это то, что вы ищете

def common_attributes(klass)
  args = { id: some_id, name: some_name }
  args[:role_id] = some_role.id if klass.instance_method(:initialize).arity == 3
  klass.new args                
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...