如果我们将params缓存到一个动作中的局部变量中,它会有所帮助吗?

时间:2009-07-22 10:52:38

标签: ruby-on-rails ruby params reek

因此我们偶尔会运行一个名为reek的代码质量工具作为项目的一部分。该工具基本上寻找代码气味并报告它们。在这里,我们观察到每当我们尝试多次访问params中的密钥时,我们会得到“重复”气味(好像我们使用相同的参数进行两次方法调用,或者我们正在复制if条件等)。但是,params只是Hash,对吗?当他们的密钥被多次访问时,其他哈希不会产生重复的气味。

为什么会这样?什么是params?将params缓存在局部变量中然后使用它们是否有意义?它会有所帮助吗?或者该工具有问题吗?救命啊!

4 个答案:

答案 0 :(得分:3)

对于当前版本,最好只在app / models文件夹上运行Reek,因为它会对视图和控制器产生误报。

params是一种靠近系统边界的DTO(数据传输对象),因此它的特性应该与常规代码不同。但是Reek不知道(还)。我计划在不久的将来改进Reek,以便它与Rails一起发挥更好的作用。但就目前而言,最好的办法是将其限制在app / models(以及app / helpers和lib)上。

答案 1 :(得分:2)

params是一个执行@params ||= @request.params

的方法调用

它可能认为params是一个复杂的方法,所以它希望你尝试将它缓存在一个变量中,但是,不要认为这是值得的,特别是因为它是memoized(基于我的rack_process.rb来自Rails 2.2)

答案 2 :(得分:0)

params[:foo]是对Hash#[]的方法调用,所以reek是正确的。我不熟悉reek,所以我不知道为什么其他Hash访问不会被计算相同。 Hash#[]应该足够快,以至于您不需要将其存储在本地变量中,除非您处于代码中性能非常关键的部分。

参数Hash和常规Hash之间的唯一区别是它使用with_indifferent_access,这意味着您可以使用String或Symbol访问任何键。

答案 3 :(得分:0)

我相信每次调用params时,都会有一个生成方法调用的初始化步骤,我想你可以尝试创建一个params并检查调用次数。 这可能是盲目的猜测。 : - )