Drools学习笔记(三)---方法与规则

人们常常混淆方法和规则,而新接触规则的用户经常会问:“我如何称呼规则?” 在最后一节之后,你现在感觉自己像一个规则专家,答案很明显,但我们总结一下这些差异。

public void helloWorld(Person person) {
    if ( person.getName().equals( "Chuck" ) ) {
        System.out.println( "Hello Chuck" );
    }
}
  • 方法直接调用。

  • 通过特定实例。

  • 一次调用导致单次执行。

rule "Hello World" when
    Person( name == "Chuck" )
then
    System.out.println( "Hello Chuck" );
end
  • 只要将规则插入引擎,规则就可以通过匹配任何数据来执行。

  • 永远不能直接调用规则。

  • 无法将特定实例传递给规则。

  • 根据匹配,规则可能会触发一次或多次,或者根本不会触发。

交叉产品

想象一下,火灾报警示例中的数据与以下规则结合使用,其中没有字段约束:

rule "Show Sprinklers" when
    $room : Room()
    $sprinkler : Sprinkler()
then
    System.out.println( "room:" + $room.getName() +
                        " sprinkler:" + $sprinkler.getRoom().getName() );
end

在SQL术语中,这就像在做,select * from Room, Sprinkler并且Room表中的每一行都将与Sprinkler表中的每一行连接,从而产生以下输出:

room:office sprinkler:office
room:office sprinkler:kitchen
room:office sprinkler:livingroom
room:office sprinkler:bedroom
room:kitchen sprinkler:office
room:kitchen sprinkler:kitchen
room:kitchen sprinkler:livingroom
room:kitchen sprinkler:bedroom
room:livingroom sprinkler:office
room:livingroom sprinkler:kitchen
room:livingroom sprinkler:livingroom
room:livingroom sprinkler:bedroom
room:bedroom sprinkler:office
room:bedroom sprinkler:kitchen
room:bedroom sprinkler:livingroom
room:bedroom sprinkler:bedroom

这些交叉产品显然会变得庞大,并且很可能包含虚假数据。交叉产品的大小通常是新规则作者的性能问题的根源。由此可以看出,总是希望约束交叉乘积,这是用变量约束完成的。

rule
when
    $room : Room()
    $sprinkler : Sprinkler( room == $room )
then
    System.out.println( "room:" + $room.getName() +
                        " sprinkler:" + $sprinkler.getRoom().getName() );
end

这导致只有四行数据,每个房间都有正确的洒水喷头。在SQL(实际上是HQL)中,相应的查询将是select * from Room, Sprinkler where Room == Sprinkler.room

room:office sprinkler:office
room:kitchen sprinkler:kitchen
room:livingroom sprinkler:livingroom
room:bedroom sprinkler:bedroom
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值