【发布时间】:2015-04-04 08:23:46
【问题描述】:
我有一大堆结构相似的方法,每个看起来都像这样:
def my_method_1
if params[:user_id]
#code that stays the same across my_method_1, 2, 3, 4, etc.
#code that varies across my_method_1, 2, 3, 4, etc.
elsif params[:tag_id]
#code that stays the same across my_method_1, 2, 3, 4, etc.
#code that varies across my_method_1, 2, 3, 4, etc.
else
#code that stays the same across my_method_1, 2, 3, 4, etc.
#code that varies across my_method_1, 2, 3, 4, etc.
end
end
我有 my_method_2、3、4 等。我想要做的是避免为我拥有的每个方法都输入所有这些,因为大部分代码都是重复的。我只想输入在方法 1、2、3、4 等中实际变化的代码。
我在这方面的尝试使用了 eval(),它有效,并且肯定会耗尽我所有的个人方法,但让我感到不舒服。基本上,我有一个辅助方法,它接受键值对,键是“上下文”,值是指定为字符串的“语句”:
def helper_method
hash.each do |context, statement|
if params[eval(":#{context}_id")]
#code that stays the same
eval(statement)
return
end
end
eval(hash[:none])
end
现在我的个人方法可以超级干,只需调用辅助方法并传入代码字符串:
def my_method_1
helper_method(
user: '#code that varies',
tag: '#code that varies',
none: '#code that varies'
)
end
再一次,在字符串中输入大量代码让我感到不舒服。非常感谢以另一种方式进行此操作的任何帮助!
【问题讨论】:
-
缺少信息。到目前为止,我不确定您为什么不只调用处理相同代码并接受参数的方法。或者创建一个为您执行此操作的实用程序类,并允许以某种方式(很可能)基于类型进行子类化或方法分派。到目前为止,我认为不需要任何过度动态的东西,这往往会使事情变得相当复杂。
-
是的,如果不提供
#code that stays the same across my_method_1, 2, 3, 4, etc. #code that varies across my_method_1, 2, 3, 4, etc.,不清楚如何清理它。 -
我不会使用
eval或method_missing。我会非常谨慎地使用任何元编程,因为它往往会使代码的可读性大大降低。应该有一些其他的 Ruby 结构可以使用。 -
我不明白这个问题。例如,对于
params[:user_id]是#code that stays the same across my_method_1, 2, 3, 4, etc.可以放入一个方法中,该方法将由每个方法1...4 调用?我建议你提供一个完整的例子,我认为这不会特别冗长。