лучшая практика для возвращаемых значений из методов ruby - PullRequest
4 голосов
/ 18 ноября 2010

Я часто делаю следующее, чтобы определить возвращаемые значения из методов ruby:

def foo
  val = (some expression)
  val
end

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

Ответы [ 6 ]

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

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

Я бы выбрал:

def foo
  (some expression)
end

или для кеширования:

def foo
  @val ||= (some expression)
end
9 голосов
/ 18 ноября 2010

Обратите внимание, что начиная с Ruby 1.9 вы можете использовать Object#tap для сохранения значения для возврата в конце , если вам нужно сделать что-то еще со значением до его возврата :

def foo
  (some expression).tap do |val|
    # use val here
  end
  # The return value of the tap is _val_
  # and hence the return value of your method
end
1 голос
/ 19 ноября 2010

Я иногда делаю то, что у вас есть в вашем вопросе.

Некоторые случаи, когда я делаю это:

  1. Когда я занимаюсь непереносимым программированием (foo = Foo.new; foo.modify_state; foo)
  2. Если я хочу проверить объект перед возвратом, но, как упоминал Фрогз, Object#tap может помочь здесь (foo = new_foo; raise if foo.empty?; foo)
  3. Когда я хочу прояснить, что я возвращаю переменную, а не делаю больше вещей (do_this; do_that; do_other_thing; result #done!)

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

1 голос
/ 18 ноября 2010

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

Это действительно мало чем отличается от примера, который вы привели в своем первоначальном вопросе.

def foo
  val = (some expression)
  val
end

может выглядеть как

def foo
  return (some expression)
end
1 голос
/ 18 ноября 2010

Временные переменные являются злом, потому что они увеличивают коннасценцию.

http://www.mgroves.com/what-is-connascence

ReplaceTempWithQuery - это рефакторинг, который я часто использую:

def discount_price
  base_price = quantity * item_price
  if (base_price > 1000)
    base_price * 0.95
  else
    base_price * 0.98
  end
end

Код после рефакторинга:

def discount_price
  if (base_price > 1000)
    base_price * 0.98
  else
    base_price * 0.98
  end
end

def base_price
  quantity * item_price
end

http://www.refactoring.com/catalog/replaceTempWithQuery.html

1 голос
/ 18 ноября 2010

Пока ваше последнее выражение соответствует желаемому, которое вы хотите вернуть, вы в безопасности.

def foo
  val = (some expression)
end

идентично тому, что в вопросе, поскольку оно оценивается как (some expression), точно так же, как val.

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