在Ruby中处理100多个条件的最佳方法是什么?

时间:2013-05-16 01:41:58

标签: ruby

如何处理案例陈述中的大量条件? ......我打算用大约125的时候写一个案例陈述。

这与我现在正在做的一致,基于每个我在Nokogiri XML文档中添加节点时,每个节点都有两个值在节点中设置,然后才设置命名空间:

case var
when :string
 property_uom_node = Nokogiri::XML::Node.new "test_value", @ixml.doc
    property_uom_node['att'] = "val"
    property_uom_node.namespace = @ixml.doc.root.namespace_definitions.find{|ns| ns.prefix=="dt"}
    property_uom_node
when :integer
 #do something else
when :blue
...
#100 more when statements
...
end

我不是在寻找特定领域的建议,只要有一个干净的方法来做到这一点,而不用300行方法。

这就是我最终做的事情:

lookup = {:lup => ["1","2"], :wup => ["1","2"]}

case param
when lookup.has_key?(param)
  property_uom_node = Nokogiri::XML::Node.new "#{lookup[param][0]}", @ixml.doc
        property_uom_node['att'] = #{lookup[param][1]}
        property_uom_node.namespace = @ixml.doc.root.namespace_definitions.find{|ns| ns.prefix=="dt"}
        property_uom_node
end

2 个答案:

答案 0 :(得分:3)

许多案例陈述可以,而许多 应该被其他结构取代。基本上,我们的想法是将策略 - 您希望代码执行的操作 - 与实现分开 - 代码如何实现。

假设你的case语句是在一个符号上键入的(也就是说,当子句是一个常量符号时,每个):

case foo
when :one
  puts 1  
when :two
  puts 2
when :three
  puts 3
else
  puts 'more'
end

这主要可以用数据结构替换:

INTS = {:one => 1, :two => 2}
key = :one
puts INTS[key]    # => 1

如果有两个不同的值,而不只是一个,该怎么办?然后使每个值成为自己的哈希值:

DOGS = {
  :dog1 => {:name => 'Fido', :color => 'white},
  :dog2 => {:name => 'Spot', :color => 'black spots'},
}
key = :dog2
dog = DOGS[key]
puts "#{dog[:name]}'s color is #{dog[:color]}"
# => "Spot's color is black spots"

答案 1 :(得分:3)

看起来第二个案例陈述只有一个案例。散列是进行查找的好方法(很多情况)。你可以这样试试:

if val = lookup[param]
  property_uom_node = Nokogiri::XML::Node.new(val[0], @ixml.doc)
  property_uom_node['att'] = val[1]
  property_uom_node.namespace = @ixml.doc.root.namespace_definitions.find{ |ns| ns.prefix == "dt" }
  property_uom_node # return the node
else
  # not one of our cases
end