因此我们偶尔会运行一个名为reek的代码质量工具作为项目的一部分。该工具基本上寻找代码气味并报告它们。在这里,我们观察到每当我们尝试多次访问params
中的密钥时,我们会得到“重复”气味(好像我们使用相同的参数进行两次方法调用,或者我们正在复制if条件等)。但是,params
只是Hash
,对吗?当他们的密钥被多次访问时,其他哈希不会产生重复的气味。
为什么会这样?什么是params
?将params
缓存在局部变量中然后使用它们是否有意义?它会有所帮助吗?或者该工具有问题吗?救命啊!
答案 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并检查调用次数。 这可能是盲目的猜测。 : - )