如何处理案例陈述中的大量条件? ......我打算用大约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
答案 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