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

时间:2015-11-30 08:03:12

标签: java drools mvel

有没有更好的方法来定义关注规则?

遵循规则检查以查看某人是否超重(通过调用Weight类中定义的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) {
       ...
    }
}
  • 我宁愿不使用Globals 作为常数" 200 LBS"。主要是因为我希望规则作者提到权重限制,我不想用它来加重申请。
  • " 200 LBS" **在线实例化。我想将其分隔到不同的行,以便规则更具可读性。我该怎么做?
  • 比较不涉及主数据类型(int,boolean,float,double等)的字段的推荐方法。在这个特定的例子中,它是重量。

谢谢!

2 个答案:

答案 0 :(得分:1)

您无法在DRL代码中为类似静态的变量实例化对象。从技术上讲,你可以在一个规则中初始化一个全局(具有最大显着性),但这对于推理引擎来说太晚了,因为在那时它将会运行,并且不会考虑全局变量。

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

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

并在您使用的规则中

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

这可以有利地与生成的对象的静态缓存组合。

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

答案 1 :(得分:1)

即使@ 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

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

希望它有所帮助,