Внедрение системы правил - PullRequest
       8

Внедрение системы правил

3 голосов
/ 20 сентября 2011

Я создаю приложение для Android, которое позволяет объединять объекты в зависимости от определенных условий.Сейчас я пытаюсь сделать это, используя операторы if (вложенные или нет), и мне просто интересно, есть ли лучший способ сделать это, чтобы он был более гибким и легко расширяемым.

Например,У меня есть 6 объектов, 3 из них красные, 2 синие и 1 зеленый.

Правила, которые могут быть применены к этому:

  • 3 красного можно объединить
  • 2 синего цвета можно объединить
  • 1 красного и 1 синего и 1 зеленого цвета можно объединить
  • 1 красного и 1 синего цвета можно объединить
  • 1 красного цветаи 1 зеленый можно объединить
  • 1 зеленый и 1 синий можно объединить

Это очень простой пример этого.Там будет намного больше.

1 Ответ

2 голосов
/ 20 сентября 2011

Я бы, наверное, сделал что-то в районе:

Создайте Rule-класс, который содержит логику для данного правила (ваши операторы if). Правило должно иметь приоритет, чтобы его можно было сопоставить с другими правилами, чтобы определить, какое правило следует рассматривать в первую очередь. Также необходим метод, которому может быть передано неопределенное количество объектов, который проверяет, соответствуют ли эти объекты правилу.

Создайте RuleEngine, который содержит отсортированный список (по приоритету, по приоритету) всех правил. Затем вы передаете объекты, которым вы хотите соответствовать правилам, в двигатель, и двигатель запускает их, прерывая цикл, если выполняется правило:

for( Rule rule : rules ) {
  if( rule.check( objects ) ) {
    //Do what needs to be done
    break;
  }
}

Я не знаю, имеет ли это смысл для вас - надеюсь, что это так.

Также, если мы говорим о тысячах правил, это решение не является оптимальным. В этом случае вы захотите определить, какие правила объект может выполнить, прежде чем проверять их (например, если у вас есть два красных и один зеленый, нет необходимости проверять правило «одно из каждого»).

...