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) {
...
}
}
- 我宁愿不使用 Globals 作为常量“200 LBS”。主要是因为我希望规则作者提到重量限制,我不想给应用程序增加负担。
- “200 磅”**实例化在线。我想将它分开到不同的行,以便规则更具可读性。我该怎么做?
- 比较不涉及主要数据类型的字段的推荐方法是什么(int、boolean、float、double 等)。在此特定示例中,它是重量。
谢谢!!
您不能在 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
同样,我同意上述规则将被生产规则系统纯粹主义者视为邪恶的怪物!
希望对您有所帮助,
是否有更好的方法来定义跟随规则?
以下规则检查一个人是否超重(通过调用 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) {
...
}
}
- 我宁愿不使用 Globals 作为常量“200 LBS”。主要是因为我希望规则作者提到重量限制,我不想给应用程序增加负担。
- “200 磅”**实例化在线。我想将它分开到不同的行,以便规则更具可读性。我该怎么做?
- 比较不涉及主要数据类型的字段的推荐方法是什么(int、boolean、float、double 等)。在此特定示例中,它是重量。
谢谢!!
您不能在 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
同样,我同意上述规则将被生产规则系统纯粹主义者视为邪恶的怪物!
希望对您有所帮助,