2008-12-19 77 views
1

我沒有問題,因爲這樣的,但我很新的紅寶石。我有以下的代碼3重複位的一種方法,我想知道如何真正Rubyist首先會的刪除重複,其次,使其更具可重用性。我如何可以重構這塊Ruby代碼以消除重複?

這裏是有問題的代碼:

file = File.new(destination) 
doc = REXML::Document.new file 

doc.elements.each("configuration/continuity2/plans") do |element| 
    element.attributes["storebasedir"] = "#{TEST_OUTPUT_DIRECTORY}" 
end 

doc.elements.each("configuration/add").each do |database| 
    database.raw_attributes = database.attributes.merge("connectionstring" => "#{TEST_CONNECTION_STRING}") 
end 

doc.elements.each("configuration/connectionStrings/plans") do |connectionString| 
    connectionString.raw_attributes = connectionString.attributes.merge("connectionString" => "#{TEST_CONNECTION_STRING}") 
end 

任何意見理解。

回答

3

最後兩個塊可以用

["add", "connectionStrings/plans"].each do |elt_name| 
    doc.elements.each("configuration/#{elt_name}").do |elt| 
    elt.raw_attributes = elt.attributes.merge("connectionString" => "#{TEST_CONNECTION_STRING}") 
    end 
end 

代替我承擔「的ConnectionString」和「的connectionString」之間的情況差異是偶然的。如果是這樣,那恰好說明了消除重複的好處。

而且,你也許可以與TEST_CONNECTION_STRING取代"#{TEST_CONNECTION_STRING}"

2

你可以嘗試添加試圖儘可能通用,以避免這種情況的方法,但他們對我顯著不同的...你有風險的複雜的代碼只是爲了能夠將這些行包裝成一個單一的方法。

2

我沒有看到重複。您正在迭代的集合和實質上不同的集合以及您在每個元素上執行的操作也非常不同。我同意Olivier的意見,任何消除重複的嘗試都只會導致更復雜的代碼。