как избежать передачи одного и того же параметра через несколько методов - PullRequest
0 голосов
/ 13 июня 2018
def foo(a)
  # some computation
  bar(a, b)
end

def bar(a,b)
  # some computation
  baz(a, b, c)
end

def baz(a, b ,c)
  print a
end

Как избежать передачи одного и того же параметра (a) всем методам?Один из способов - сделать параметр a переменной экземпляра.Как правильно это сделать?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

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

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

Один из подходов, который я часто вижу в проектах, - это хэш с одним параметром, в который добавляются новые параметры:

def foo(a)
  ....
  bar({a:a, b:b})
end

def bar(par)
  ....
  par[:c] = c
end

def baz(par)
   par[:a]+par[:b]+par[:c]
end

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

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

0 голосов
/ 13 июня 2018

Отвечая на заданный вопрос: да, ruby ​​- это язык ОО с состоянием, имеющий изменяемое все.Таким образом, в ruby ​​можно ввести переменные экземпляра :

class MyClass
  def foo(a)
    @a = a
    # some computation
    bar(b)
  end

  def bar(b)
    @b = b
    # some computation
    baz(c)
  end

  def baz(c)
    print [@a, @b, c].inspect
  end
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...