2012-02-15 201 views
2

我想將這三種方法合併爲一種,但此時無法將我的大腦包裹在其中。複雜的事實是1/3需要稍微不同的呼叫。他們都很相似,我知道有更好的方法,但現在超出我的技能水平。通過一個額外的變量傳遞(獲取,檢查或處理),我可以把它變成一個,如何做到這一點避開了我。將三種類似的方法合併爲一種方法

如果你想將這些重構成一種方法,你會怎麼做?

def fetch(subjects = current_subjects, queues = QUEUES) 
    subjects.each do |s| 
    queues.each { |x| fetch_results(x, s) } unless queue.nil? 
    end 
end 

def check(subjects = current_subjects, queues = QUEUES) 
    subjects.each do |s| 
    queues.each { |x| check_results(s["#{x}_recent"]) } unless queue.nil? 
    end 
end 

def process(subjects = current_subjects, queues = QUEUES) 
    subjects.each do |s| 
    queues.each { |x| process_results(s["#{x}_recent"]) } unless queue.nil? 
    end 
end 

編輯:一種解決方案是接近我早先想,但我沒有說清楚,我想在what傳遞作爲一個很小的陣列,這可能是擴張的,並且可以用於指示是否提取,檢查或處理這些信息或其組合。因此,本質上,我試圖用一種方法循環三件事:

  • 一個動作什麼:I.E.,取,檢查或處理。
  • 任何數量的科目。
  • 任何數量的隊列,這是一個常數。

此外,其他的解決方案在這裏:

http://refactormycode.com/codes/2002-three-into-one

+0

側面說明:隊列是一個枚舉,所以相應地將其命名爲:_queues_。 – tokland 2012-02-15 23:00:43

回答

2

@Lucapette提出了一種自頂向下的解決方案(我認爲它在大多數情況下非常有效)。然而,@託尼正確地指出,方法可能會發展,因此它可能太僵化。替代解決方案是自下而上的方法:

def iter_queues(subjects, queues) 
    subjects.each do |subject| 
    (queues || []).each { |queue| yield(queue, subject) } 
    end 
end 

def fetch(subjects = current_subjects, queues = QUEUES) 
    iter_queues(subjects, queues) { |q, s| fetch_results(q, s) } 
end 

同上其他方法。順便說一句,這雙each也可以寫成:

subjects.product(queues).each { ... } 
+0

嗯,偉大的思想思考相似:)但我想我喜歡雙倍每個更好 – pguardiario 2012-02-15 23:29:32

+0

我也是,說實話:-p – tokland 2012-02-15 23:35:46

0

你爲什麼要把它們重構爲一個單一的功能?他們現在很相似,但如果他們稍後發展並變得與衆不同呢?每個功能都有自己的目的,應該作爲單獨的功能。

+0

一個很好的觀點,但沒有必要重複的意義。它可以去任何一個方面。 – blueblank 2012-02-15 22:34:31

+1

現在幹起來,使代碼更簡單。如果一個或多個進程稍後發生變化,則提取該進程。沒有意義,只是在「假設」的情況下保持排列不整齊的代碼。 – Pavling 2012-02-16 00:07:00

1
def execute(what, subjects = current_subjects, queue = QUEUES) 
    subjects.each do |s| 
    queue.each { |x| send("#{what}_results", s["#{x}_recent"]) } unless queue.nil? 
    end 
end 

是一種方法。當然,命名取決於你。

+0

與我之前的想法類似,但沒有得到。第一個'fetch'需要一個稍微不同的調用,所以我需要改變它或者解決它我猜,謝謝。 – blueblank 2012-02-15 22:33:52

1

我可能會做這樣的事情:

def with(subjects,queues) 
    subjects.each do |subject|  
     queues.each do |queue| 
      yield subject, queue 
     end 
    end 
end 

with(my_subjects, my_queues){|s, q| fetch_results(q, s)} 
+0

好吧,我的想法在下面;-)注意''與'也可以寫'subjects.product(隊列)。每個(塊)' – tokland 2012-02-15 23:22:15