如何重构这段Ruby代码以删除重复?

时间:2008-12-19 08:50:19

标签: ruby optimization

我没有这样的问题,但我对Ruby很新。我在一个方法中有以下3个可重复的代码,我想知道真正的Rubyist如何首先删除重复,然后让它更可重用。

以下是相关代码:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您可以尝试添加一个尽可能通用的方法来避免这种情况,但它们对我来说有很大的不同......您可能会因为能够将这些行包装到单个方法中而面临复杂的代码。

答案 2 :(得分:2)

我没有看到重复。您正在迭代和完全不同的集合以及您在每个元素上执行的操作也非常不同。我同意Olivier的观点,任何删除重复的尝试都只会导致更复杂的代码。

相关问题