Drools - 比较不涉及主要数据类型的字段的最佳实践

Drools - Best practices for comparing fields not involving primary datatypes

是否有更好的方法来定义跟随规则?

以下规则检查一个人是否超重(通过调用 Weight class 中定义的 greaterThan 方法)。

规则:

rule "OverWeightTest"
 dialect "mvel"
 when
    $person : Person(weight.greaterThan(new Weight(200, Weight.Unit.LBS)) )
 then
    System.out.println($person + " is overweight!");
end

Java 类:

public class Person
{
    private final String name;
    private final Weight weight;
}

public class Weight
{
    private final int value;
    private final Unit unit;

    public boolean greaterThan(final Weight otherWeight) {
       ...
    }
}

谢谢!!

您不能在 DRL 代码中为类静态变量实例化对象。从技术上讲,您可以在规则中初始化一个全局变量(具有最大显着性),但这对于推理引擎来说为时已晚,此时推理引擎可能是 运行,并且不考虑全局变量的更新。

所以最好的选择是在 Weight class 中使用静态工厂方法。 最好不要在LHS代码中调用构造函数

class Weight {
    public static lbs(int amt ){
        return new Weight(amt, Weight.Unit.LBS);
    }
}

并且在您使用的规则中

Person( weight.greaterThan(Weight.lbs(200)) )

与生成对象的静态缓存相结合可能会更有利。

实施 Comparable 并没有使它更具可读性(尽管它可能对您的 Java 代码有用)。

即使@Laune 的回答是最干净的并且遵循了所有最佳实践,我也会保留这种替代方法,您必须在规则的 LHS 中实例化对象(可能是因为构造函数中的一些必要参数来自绑定到事实的变量)。

rule "OverWeightTest"
dialect "mvel"
when
    $w: Weight() from new Weight(200, Weight.Unit.LBS)
    $person : Person( weight.greaterThan($w) )
then
    System.out.println($person + " is overweight!");
end

同样,我同意上述规则将被生产规则系统纯粹主义者视为邪恶的怪物!

希望对您有所帮助,