Ruby on rails 如果我们在一个操作中将参数缓存到一个本地变量中,它会有帮助吗?

Ruby on rails 如果我们在一个操作中将参数缓存到一个本地变量中,它会有帮助吗?,ruby-on-rails,ruby,params,reek,Ruby On Rails,Ruby,Params,Reek,因此,作为项目的一部分,我们运行一个偶尔调用的代码质量工具。该工具基本上查找代码气味并报告它们。在这里,我们观察到,每当我们多次尝试访问params中的一个键时,我们都会闻到“重复”的味道(好像我们使用相同的参数进行了两次方法调用,或者复制了一个if条件等)。然而,params只是一个Hash,对吗?其他哈希在其密钥被多次访问时不会有重复的味道 为什么会这样?什么是params?在局部变量中缓存params然后使用它们有意义吗?它会有帮助还是一样?还是工具有问题?救命啊 params[:foo]

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


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

params[:foo]
是对
Hash#[]
的方法调用,因此reek是正确的。我不熟悉reek,所以我不知道为什么其他哈希访问的计数不一样<代码>散列#[]应该足够快,不需要将其存储在局部变量中,除非您的代码处于非常关键的性能部分


params散列与常规散列的唯一区别在于,它使用
和_interference_access
,这意味着您可以使用字符串或符号访问任何键。

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


可能是因为它认为params是一个复杂的方法,所以它希望您尝试将其缓存在变量中,但是,不认为这样做值得,特别是因为它是记忆的(基于Rails 2.2中的my rack_process.rb)

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


params是一种接近系统边界的DTO(数据传输对象),因此其特性应该不同于常规代码。但里克(还)不知道这一点。我计划在不久的将来改进Reek,以便它更好地与Rails配合使用。不过现在,最好的办法是将其限制在查看应用程序/模型(可能还有应用程序/助手和lib)。

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

谢谢你,奥马尔。正如凯文所指出的,params是一种DTO,它不同于任何其他对象,Reek还不知道这一点。