Шаблон дизайна для классификации вещей - PullRequest
0 голосов
/ 25 октября 2011

У меня есть список веб-страниц, каждая о продукте. В предыдущей системе мы использовали оператор 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 Ответ

1 голос
/ 25 октября 2011

Есть много способов сделать это.Вот пара идей.

Вы могли бы использовать case:

case title
when /pet/
    13
when /therapy|SPA|massaging|salon|hotspring/
    5
when /present|gift/
    4
#...

Это не сильно отличается от вашей стопки if с.

Вы могли быпоместите ваши правила в Hash:

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)

или Array:

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 могут быть любыми: числа, строки, экземпляры какого-либо другого класса илидаже процы;Я использую этот шаблон с лямбдами в качестве значений довольно часто, он предлагает немного гибкости.Использование справочной таблицы, такой как patterns, также имеет то преимущество, что ее легко редактировать во время выполнения;Вы даже можете загрузить таблицу поиска из базы данных или файла конфигурации.Форма Array очень похожа на то, как Rails обрабатывает свои таблицы маршрутизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...