2

我有一个使用规则引擎将“动态逻辑”实现为 Drools 规则的系统。

对于每个客户端实施,使用特定实施的 drl 文件实施自定义定价和税收计算逻辑。

rule 'abc'
when
    name = 'X'
then
    price= '12'
end

并且一个规则的条件依赖于之前规则的设置,所以基本上是规则转换。

这真的很痛苦,因为 drools 规则不是顺序编程并且对开发人员不友好。由于对 drools 评估方式的错误解释,引入了许多错误。

是否有更好的“java/groovy”替代方案可以轻松取代它?

4

1 回答 1

2

我认为答案将取决于您最终想要的最终解决方案是什么。如果您想将业务规则从规则引擎中提取出来并放入 java/groovy,这与将它们从一个规则引擎中提取到另一个规则引擎中是非常不同的。

你的问题似乎倾向于先验,所以我会解决这个问题。使用这种方法要非常小心。以前实现此功能的人似乎在使用 Rete 算法方面以正确的方式做到了这一点,因为听起来一个规则的触发可以执行其他规则,这是很好的业务规则 - 它们不是顺序的,它们是声明性的. 请记住,命令式软件主要是为工程师编写的,它不会 100% 地映射回现实世界 :)

如果你想把它移到 java/groovy 中,你正在进入一种命令式语言,这可能会让你陷入 if/then/else 地狱。我建议如下:

  1. 将此代码与您的代码库的其余部分隔离开来——将来当业务更改其规则时,您将对此代码进行大量维护。良好的界面设计和封装将在未来获得巨大回报。
  2. 与您的业务客户一起开发某种类型的 DSL,这样当他们说“信用政策”之类的内容时,您就可以确切地知道他们指的是什么,并且可以适当地更改相关规则。
  3. 单元测试,单元测试,单元测试。这也适用于您当前的配置。如果您现在发现错误,为什么不进行测试?设置 junit 来创建对象并调用 Drools 引擎并测试响应并不需要很长时间。如果您添加一些循环来测试期望相同响应的变量范围,您可以立即参与数十万次测试。

顺便说一句:如果您不想走这条路,那么我强烈建议您接受一些有关 Drools 的培训,以便您了解引擎和 Rete(如果您还没有的话)。如果您能够将客户的规则快速转化为可实施的软件,那么您可以与客户取得一些巨大的成功。

于 2013-02-28T13:12:53.777 回答