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

什么';在Ruby中处理100多个条件的最佳方法是什么?,ruby,Ruby,如何处理案例陈述中的大量条件? …我准备写一份关于125个when's的案例陈述 这与我现在所做的是一样的,基于我在Nokogiri XML文档中添加一个节点时的每一次操作,在设置名称空间之前,每个操作都有两个在节点中设置的值: 案例变量 时间:字符串 property_uom_node=Nokogiri::XML::node.new“test_value”,@ixml.doc 属性计量单位节点['att']=“val” property_uom_node.namespace=@ixml.doc

如何处理案例陈述中的大量条件?
…我准备写一份关于125个when's的案例陈述

这与我现在所做的是一样的,基于我在Nokogiri XML文档中添加一个节点时的每一次操作,在设置名称空间之前,每个操作都有两个在节点中设置的值:

案例变量
时间:字符串
property_uom_node=Nokogiri::XML::node.new“test_value”,@ixml.doc
属性计量单位节点['att']=“val”
property_uom_node.namespace=@ixml.doc.root.namespace_definitions.find{ns | ns.prefix==“dt”}
属性计量单位节点
时间:整数
#做点别的
时间:蓝色
...
#还有100多条
...
结束
我不是在寻找特定领域的建议,只是如果有一种干净的方法可以做到这一点,而不会以300行的方法结束

这就是我最后做的:

lookup={:lup=>[“1”,“2”],:wup=>[“1”,“2”]}
案例参数
查找时。是否有_键?(参数)
property_uom_node=Nokogiri::XML::node.new“#{lookup[param][0]}”,@ixml.doc
属性_uom_node['att']={lookup[param][1]}
property_uom_node.namespace=@ixml.doc.root.namespace_definitions.find{ns | ns.prefix==“dt”}
属性计量单位节点
结束

许多case语句可以也应该用其他结构替换。基本上,这个想法是将策略(您希望代码做什么)与实现(代码如何做)分开

假设您的case语句键入了一个符号(即,每个when子句都是常量符号):

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

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"

许多案例陈述可以,也应该被其他结构所取代。基本上,这个想法是将策略(您希望代码做什么)与实现(代码如何做)分开

假设您的case语句键入了一个符号(即,每个when子句都是常量符号):

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

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"

看起来第二个case语句只有一个case。散列是进行查找的好方法(在许多情况下)。您可以这样尝试:

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

看起来第二个case语句只有一个case。散列是进行查找的好方法(在许多情况下)。您可以这样尝试:

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

没有上下文就无法回答。命令模式?什么样的上下文?有没有更好的方法来处理案例陈述中的100个或更多条件,简单的问题。是的:不要这样做。如果你真的不在乎一个好的答案,这只是一个“简单的问题”。我愿意接受任何答案来开始。我只是不知道还能问什么。不过谢谢你看一看。我希望有人能以更具咨询性的方式来帮助我。我添加了每次执行的代码。你为什么不接受Wayne的答案?没有上下文不可能回答。命令模式?什么样的上下文?有没有更好的方法来处理案例陈述中的100个或更多条件,简单的问题。是的:不要这样做。如果你真的不在乎一个好的答案,这只是一个“简单的问题”。我愿意接受任何答案来开始。我只是不知道还能问什么。不过谢谢你看一看。我希望有人能以更具咨询性的方式来帮助我。我添加了每次执行的代码。你为什么不接受Wayne的答案?