用于对事物进行分类的设计模式

时间:2011-10-25 02:59:39

标签: ruby design-patterns

我有一个网页列表,每个网页都有一个产品。在之前的系统中,我们使用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?()。但是我认为这样做也意味着在逻辑中硬编码。是否有进行此类分类的设计模式?

1 个答案:

答案 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处理其路由表的方式。