【问题标题】:How can I refactor this piece of Ruby code to remove duplication?如何重构这段 Ruby 代码以消除重复?
【发布时间】:2012-05-22 22:32:47
【问题描述】:

我没有这样的问题,但我对 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   

任何建议表示赞赏。

【问题讨论】:

    标签: ruby optimization


    【解决方案1】:

    最后两个块可以替换为

    ["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】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多