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