ruby方法返回值的最佳实践

ruby方法返回值的最佳实践,ruby,Ruby,我发现自己在从ruby方法定义返回值方面做了很多工作: def foo val = (some expression) val end 这似乎总是有点做作。这里的最佳做法是什么?只要最后一个表达式的计算结果是您想要返回的表达式,您就安全了 def foo val = (some expression) end 与问题中的相同,因为它的计算结果为(某个表达式),就像val一样。除非(某个表达式)很重并且将被多次调用,否则无需将其保存到变量中。在这种情况下,您可能需要缓存它 我会选择

我发现自己在从ruby方法定义返回值方面做了很多工作:

def foo
  val = (some expression)
  val
end

这似乎总是有点做作。这里的最佳做法是什么?

只要最后一个表达式的计算结果是您想要返回的表达式,您就安全了

def foo
  val = (some expression)
end

与问题中的相同,因为它的计算结果为
(某个表达式)
,就像
val
一样。

除非(某个表达式)很重并且将被多次调用,否则无需将其保存到变量中。在这种情况下,您可能需要缓存它

我会选择其中一种:

def foo
  (some expression)
end
或用于缓存:

def foo
  @val ||= (some expression)
end

请注意,从Ruby 1.9开始,如果在返回值之前需要对该值执行其他操作,则可以使用
Object#tap
保存一个值,以便在最后返回:


临时变量是邪恶的,因为它们增加了提升

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

我个人喜欢使用return来明确地调用返回的内容。这是Ruby不需要您使用的额外代码,但它有助于提高可读性。它还允许在方法中有多个退出点,因为一旦调用return,方法的执行就会停止

这与您在原始问题中给出的示例没有太大区别

def foo
  val = (some expression)
  val
end
可能看起来像

def foo
  return (some expression)
end

我有时会照你的问题做

def foo
  val = (some expression)
  val
end
我这样做的一些情况是:

  • 当我在进行基本编程时(
    foo=foo.new;foo.modify\u state;foo
  • 如果我想在返回之前验证一个对象,但正如Phrogz所提到的,
    object#点击
    可能会在这里有所帮助(
    foo=new\u foo;如果foo.empty?;foo
  • 当我想清楚地表明我正在返回一个变量,而不是做更多的事情时(
    做这个;做那个;做其他事情;结果#完成!

  • 但它可能表示代码气味,例如在案例1中。

    def foo;(一些表达)以最短的形式结束Nakilon,是的。只有凯文知道他想在自己的职能范围内做什么。:)谢谢你们两位。我知道这是一个简单的问题,但我感谢你花时间澄清。谢谢这太主观了。Ruby允许您将返回值放在方法的最后一行,您可以使用它。有时你不能使用它。有时候你不想用它。你想做什么就做什么。。。这不是最佳实践。这样做的缺点是交换一个临时变量,该变量将超出范围并被垃圾收集,需要两个调用来重新计算该值:第一个调用进行初始测试,第二个调用返回调整后的值。这是一种简化的尝试,但最终会增加复杂性,并且可能需要更长的时间。顺便说一句,您可能希望尝试运行您的示例。第一个有一个语法错误,因为它缺少一个结束
    end
    ,第二个没有为
    if
    返回正确的值。如果
    base\u price
    真的是调用
    discount\u price
    的一个瓶颈,您以后可以一直优化它(比如缓存
    折扣价格
    ,而不是内联
    基本价格
    ,如果多次调用
    折扣价格
    ,这会更有帮助)。否则这只是过早的优化。给出的示例(我从Fowler复制)可能不是最有说服力的例子,因为原始方法仍然非常简单。如果查询方法(在本例中为
    base\u price
    )是域模型的一部分,我仍然会对其进行重构,根据我的经验,大多数情况下都是这样。mgroves链接是(现在)很有趣。谢谢你的留言。是的,确实很有趣,但我从来没有把它看作是真正的实现