0

我最近一直在使用Reek来重构我的代码,其中一种气味DuplicateMethodCall正在数组和哈希查找中被调用,例如多次调用时array[1]hash[:key]

所以我想知道多个数组或哈希查找是否如此昂贵,我们应该将它们存储在一个变量中而不是直接调用它们,这是每个人根据我的经验所做的。

我会毫不犹豫地将多个对象方法调用(特别是如果它是一个 DB 调用)存储在一个变量中,但是为数组和哈希查找这样做感觉有点过头了。

例如,我会收到一段代码的警告:

  def sort_params
    return [] if params[:reference_letter_section].nil?

    params[:reference_letter_section].map.with_index(1) do |id, index|
      { id: id, position: index }
    end
  end

但我觉得存储params[:reference_letter_section]在自己的变量中太多了

4

2 回答 2

2

所以我想知道多个数组或哈希查找是否如此昂贵

昂贵的电话并不是不打多次电话的唯一原因。它还会在没有真正需要的情况下使代码混乱。考虑这个不太人为的例子:

Order.new(
  name:       params[:order][:name],
  total:      params[:order][:total],
  line_items: [
    {
      product_name: params[:order][:line_item][:product],
      price:        params[:order][:line_item][:price],
    }
  ]
)

即使这些哈希访问非常便宜,出于可读性的原因,提取它们仍然是有意义的。

order_params     = params[:order]
line_item_params = order_params[:line_item]

Order.new(
  name:       order_params[:name],
  total:      order_params[:total],
  line_items: [
    {
      product_name: line_item_params[:product],
      price:        line_item_params[:price],
    }
  ]
)
于 2017-07-05T12:03:19.023 回答
0

重复哈希查找表示这两行代码之间的耦合。这可能会增加理解代码所需的时间,并且可能是更改代码时的摩擦源。当然,像这样的小方法,成本是比较低的;但是,如果两行代码相距更远——例如,在不同的类中——耦合的影响会更加昂贵。

这是您的方法的一个版本,没有重复:

def sort_params
  reference_letters = params[:reference_letter_section] || []
  reference_letters.map.with_index(1) do |id, index|
    { id: id, position: index }
  end
end
于 2017-07-06T07:46:23.057 回答