2017-07-05 61 views
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]太多

+0

代碼質量的工具應經常採取一粒鹽。當性能不是問題時,可讀性很重要。但用你的判斷來決定哪種方式更好。這些工具只是告訴你在哪裏看。 – ndn

+0

呀完全與它@ndn同意,但我不知道有多少,它會提高性能,這就是爲什麼我問這個位置 –

+1

「我不知道有多少,它會提高性能」 - 你可以隨時_measure_那。 –

回答

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

當然,我並不意味着這是唯一的原因。但是,當可讀性不吃虧,而只是增加了行數,我在想,如果它仍然是值得的 –

+0

@MaximFedotov:好,這是一個主觀判斷。不應該盲目信任這些工具。他們不知道什麼是好的代碼。 :) –

+0

是啊,我明白了,但是這正是爲什麼我張貼的問題,看看有什麼經驗豐富的開發人員會考慮接受。既然它看起來不會影響性能,我可能會忽略數組/散列,除非它經常被調用。將不得不考慮的更新我的配置 –

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