«если тогда еще» с двигателями правил - PullRequest
3 голосов
/ 03 ноября 2011

Я новичок в drools и, учитывая условие (Condition) и булеву переменную "a", я хотел бы создать следующее правило с drools:

if (Condition)
   { 
    a = true;
   }
else
   {
    a = false;
   }

Какой лучший способ сделать это?

На данный момент у меня есть 2 варианта:

1.Создать 2 правила с условием, а не с условием (если ... то ..., если нет ... тогда ...)

rule "test"
where
  $o: Object( Condition)
then 
  $o.a = true;
end


rule "test2"
where
  $o: Object( not Condition)
then 
  $o.a = false
end

2. По умолчанию для переменной a устанавливается значение false, а затем запускается правило

rule "test"
no loop
salience 100
where 
  $o: Object()
then 
  $o.a = false;
end


rule "test"
where
  $o: Object( not Condition)
then 
  $o.a = true;
end

Ответы [ 2 ]

3 голосов
/ 03 ноября 2011

По своей природе движок Rete ищет положительные совпадения, поэтому да, вам понадобится несколько правил, по одному для каждой проверки условий в вашем блоке if-then-else. Ваш первый пример чище и понятнее, я бы согласился с этим.

В качестве альтернативы, если вы обрабатываете простое логическое отрицание (если-еще), где значение ваших переменных соответствует условному, тогда вы можете использовать только одно правило:

rule "test"
where 
  $o: Object()
then 
  $o.a = (! Condition);
end
1 голос
/ 04 ноября 2011

Помните, что механизм правил - это не только контейнер IF / ELSE. Вы переходите от императивного подхода if (условие) {} еще {} к декларативному подходу, когда вы позволяете движку определять и оценивать правила на основе контекста (фактов), имеющегося в вашей рабочей памяти.

Хорошо иметь два правила, но чего именно ты пытаешься достичь? В зависимости от структуры объекта и бизнес-логики, которую вы хотите реализовать, существует несколько способов решения различных проблем. Можете ли вы дать нам более подробную информацию о том, чего вы хотите достичь? Приветствия

...