在我的公司,我们计划将Drools和BRE用于几个项目。现在我们尝试定义一些最佳实践。
我的问题是在规则条件/结果内应该和不应该做什么。 鉴于我们可以直接编写Java或调用方法(例如,从工作内存中的Global对象)。
实施例。给定评估通用对象(例如Person)的规则将属性设置为true。现在,只能为进入数据库并获取该信息的Object定义该特定属性。所以我们有两种实现方式:
备选方案A:
备选方案B:
哪一个被认为更好?我真的很喜欢A,但有时B更直接,但是如果出现类似于数据库的异常的话,会发生什么?
我已经看到在Packt Publishing的Drools 5.0 Book中实现了替代B,但他们正在进行模拟,他们根本没有谈到进入数据库的实际含义。
谢谢,
答案 0 :(得分:2)
关于规则的一个原因是它们可以执行很多次。特别是如果您的规则条件出错。这显然会对性能产生影响。
我倾向于选择选项A,在外面准备你的事实,并将它们插入工作记忆中进行评估。
当然,还可以选择将规则划分为数据加载规则,然后进行业务规则评估(例如,使用规则流)。
这将为您提供在代码之外填充数据的声明性控制。
答案 1 :(得分:1)
我还需要从其他系统(数据库,服务调用等)获取外部数据,所以我已经解决了这个问题。就个人而言,我会根据您是否知道您需要预先知道哪些事实做出决定。如果是这样,那么请务必使用Java进行调用。这样可以让您更好地处理错误。如果无法检索某些数据意味着运行规则引擎是不行的,您将避免创建会话,插入事实,设置全局变量等工作。如果你要暂停(),就没有意义。
但是当然也有一些情况是无法检索数据不应该阻止你运行。在某些情况下,备选方案A和方案B的效果会相同。但是假设需要某些数据取决于其他事情。例如,我在一个应用程序上工作,该应用程序评估什么是基本上很大的逻辑树,并使用来自服务调用的数据来评估叶子。如果将两个叶子组合在一起,那么两个叶子必须是真的,因为它们的分支是真的,只要其中一个评估为假,那个分支就变成假,我不再需要评估另一个叶子。这意味着预先加载评估它所需的数据本身就是一种浪费。 “按需”检索数据是除了默认的正向链接之外,像Jess这样的规则引擎也支持backward chaining的原因之一。
直到在Drools中反向链接is complete,我见过的另一种方法是使用"from" keyword。我有幸运气,但有两件事需要考虑:
我希望这会有所帮助。如果有任何我可以澄清或扩展的话,请告诉我。