我有一个网页列表,每个网页都有一个产品。在之前的系统中,我们使用if / else语句对每个页面进行分类,如下所示:
if title =~ /pet/
13
elsif title =~ /therapy|SPA|massaging|salon|hotspring/
5
elsif title =~ /present|gift/
4
# and so on...
end
因此,分类是通过字符串关键字匹配完成的。从现在开始我们正在建立一个新系统,我想确保有可扩展性的空间。我以为每个分类都有一个单独的课程太重了。
我认为可能有一种方法可以更好,例如gift?()
和pet?()
。但是我认为这样做也意味着在逻辑中硬编码。是否有进行此类分类的设计模式?
答案 0 :(得分:1)
有各种各样的方法来做这种事情。这里有几个想法。
您可以使用case
:
case title
when /pet/
13
when /therapy|SPA|massaging|salon|hotspring/
5
when /present|gift/
4
#...
但这与你的if
一堆没什么不同。
您可以将规则放入哈希:
patterns = {
/pet/ => 13,
/therapy|SPA|massaging|salon|hotspring/ => 5,
/present|gift/ => 4,
# ...
}
match = patterns.find { |re, v| title.match(re) }
match = match.last if(match)
或数组:
patterns = [
[ /pet/, 13 ],
[ /therapy|SPA|massaging|salon|hotspring/, 5 ],
[ /present|gift/, 4 ],
# ...
}
match = patterns.find { |p| title.match(p.first) }
match = match.last if(match)
patterns
中的值可以是任何值:数字,字符串,某些其他类的实例,甚至是Procs;我经常使用lambdas作为值的这种模式,它提供了相当大的灵活性。使用像patterns
这样的查找表也具有在运行时易于编辑的优点;您甚至可以从数据库或配置文件加载查找表。 Array表单几乎就是Rails处理其路由表的方式。