Ruby 是否应在一个变量中存储多个数组/哈希查找

Ruby 是否应在一个变量中存储多个数组/哈希查找,ruby,refactoring,reek,Ruby,Refactoring,Reek,我最近一直在用它来重构代码,其中一种气味,DuplicateMethodCall,在数组和散列查找中被调用,例如多次调用时,array[1]或hash[:key] 所以我想知道多个数组或散列查找是否非常昂贵,我们应该将它们存储在一个变量中,而不是直接调用它们,根据我的经验,每个人都会这样做 我会毫不犹豫地在一个变量中存储多个对象方法调用(特别是在DB调用的情况下),但对数组和散列查找这样做感觉太过分了 例如,我将得到这段代码的警告: def sort_params return []

我最近一直在用它来重构代码,其中一种气味,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\u letter\u section]
存储在它自己的变量中太多了

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

昂贵的电话不是不打多次电话的唯一原因。它还使代码杂乱无章,没有真正的需要。认为这不是一个虚构的例子:

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],
    }
  ]
)
所以我想知道多个数组或散列查找是否如此昂贵

昂贵的电话不是不打多次电话的唯一原因。它还使代码杂乱无章,没有真正的需要。认为这不是一个虚构的例子:

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],
    }
  ]
)

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

以下是您的方法的一个版本,它没有重复:

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

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

以下是您的方法的一个版本,它没有重复:

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

代码质量工具应该始终保持谨慎。当性能不是问题时,可读性很重要。但是用你的判断来决定哪种方式更好。这些工具只是告诉你在哪里可以看。是的,我完全同意@ndn,但我不知道它能提高多少性能,这就是为什么我在这里问这个“我不知道它能提高多少性能”-你可以随时衡量。代码质量工具应该始终保持谨慎。当性能不是问题时,可读性很重要。但是用你的判断来决定哪种方式更好。这些工具只是告诉你在哪里可以看。是的,我完全同意@ndn,但我不知道它能提高性能多少,这就是为什么我在这里问这个“我不知道它能提高性能多少”-你可以随时衡量。当然,我并不是暗示这是唯一的原因。但是当可读性不受影响,而只是增加了行数时,我想知道它是否仍然值得it@MaximFedotov字体好吧,这是一个判断。人们不应该盲目相信工具。他们不知道什么是好代码。:)是的,我明白,但这正是我发布问题的原因,看看有经验的开发者会如何接受。现在它看起来对性能没有太大影响,我可能会忽略数组/哈希,除非它经常被调用。必须想一个最好的方法来更新我的config@MaximFedotov:啊,我看到你贴了一个例子。在你的情况下,我可能仍然会提取它。如果没有其他原因的话,它会使代码更加枯燥。当然,我并没有暗示这是唯一的原因。但是当可读性不受影响,而只是增加了行数时,我想知道它是否仍然值得it@MaximFedotov字体好吧,这是一个判断。人们不应该盲目相信工具。他们不知道什么是好代码。:)是的,我明白,但这正是我发布问题的原因,看看有经验的开发者会如何接受。现在它看起来对性能没有太大影响,我可能会忽略数组/哈希,除非它经常被调用。必须想一个最好的方法来更新我的config@MaximFedotov:啊,我看到你贴了一个例子。在你的情况下,我可能仍然会提取它。如果没有其他东西的话,它会使代码更加枯燥。