2

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

为什么会这样?究竟是params什么?params缓存在局部变量中然后使用它们是否有意义?它会有所帮助还是一样?还是工具有问题?帮助!

4

4 回答 4

3

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

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

于 2009-07-23T08:57:52.530 回答
2

params 是一个方法调用,它执行@params ||= @request.params

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

于 2009-07-22T12:02:51.220 回答
0

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

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

于 2009-07-22T11:56:31.730 回答
0

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

于 2009-07-25T07:40:33.537 回答