Ruby 是否应在一个变量中存储多个数组/哈希查找
我最近一直在用它来重构代码,其中一种气味,DuplicateMethodCall,在数组和散列查找中被调用,例如多次调用时,Ruby 是否应在一个变量中存储多个数组/哈希查找,ruby,refactoring,reek,Ruby,Refactoring,Reek,我最近一直在用它来重构代码,其中一种气味,DuplicateMethodCall,在数组和散列查找中被调用,例如多次调用时,array[1]或hash[:key] 所以我想知道多个数组或散列查找是否非常昂贵,我们应该将它们存储在一个变量中,而不是直接调用它们,根据我的经验,每个人都会这样做 我会毫不犹豫地在一个变量中存储多个对象方法调用(特别是在DB调用的情况下),但对数组和散列查找这样做感觉太过分了 例如,我将得到这段代码的警告: def sort_params return []
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:啊,我看到你贴了一个例子。在你的情况下,我可能仍然会提取它。如果没有其他东西的话,它会使代码更加枯燥。