我最近一直在使用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]
存储在自己的变量中太多了
答案 0 :(得分: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],
}
]
)
答案 1 :(得分: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