NRules SimpleRule的代码定义了以下规则:
public class PreferredCustomerDiscountRule : Rule
{
public override void Define()
{
Customer customer = null;
IEnumerable<Order> orders = null;
When()
.Match<Customer>(() => customer, c => c.IsPreferred)
.Collect<Order>(() => orders,
o => o.Customer == customer,
o => o.IsOpen,
o => !o.IsDiscounted);
Then()
.Do(ctx => ApplyDiscount(orders, 10.0))
.Do(ctx => LogOrders(orders))
.Do(ctx => orders.ToList().ForEach(ctx.Update));
}
...
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么条件是单独的pareameters而不是仅使用&&运算符,即以下将具有相同的效果?
public class PreferredCustomerDiscountRule : Rule
{
public override void Define()
{
Customer customer = null;
IEnumerable<Order> orders = null;
When()
.Match<Customer>(() => customer, c => c.IsPreferred)
.Collect<Order>(() => orders,
o => o.Customer == customer && o.IsOpen && !o.IsDiscounted);
Then()
.Do(ctx => ApplyDiscount(orders, 10.0))
.Do(ctx => LogOrders(orders))
.Do(ctx => orders.ToList().ForEach(ctx.Update));
}
...
}
Run Code Online (Sandbox Code Playgroud)
Ser*_*yev 11
提供单个条件表达式与由"&&"分隔的组件并提供多个条件表达式之间存在差异.
在幕后,规则被编译成网络(rete网络),并且每个条件由网络中的节点表示.当多个规则共享相同的条件子集时,这些节点在网络中共享,从而产生效率(因为评估条件较少).由于节点共享,提供多个条件表达式为引擎提供了更多优化机会.
另一个区别是条件短路.使用'&&'运算符提供单个条件表达式时,适用标准C#条件短路.如果第一个条件为假,则不评估第二个条件.当提供多个条件时(由于引擎在不同级别进行优化),这不一定正确.
最佳实践是使用多个条件表达式而不是使用"&&"的单个条件表达式.