Rules 替换口水规则的最佳方法

Rules 替换口水规则的最佳方法,rules,drools-flow,Rules,Drools Flow,我有一个系统,其中“动态逻辑”被实现为Drools规则,使用规则引擎 对于每个客户端实现,使用特定实现的drl文件实现自定义定价和税务计算逻辑 rule 'abc' when name = 'X' then price= '12' end 一个规则的条件取决于之前规则中设置的内容,因此基本上存在规则转换 这真的很痛苦,因为drools规则不是顺序编程,也不利于开发人员。由于对drools如何计算的错误解释,引入了很多bug 是否有更好的“java/groovy”替代方案可以轻松

我有一个系统,其中“动态逻辑”被实现为Drools规则,使用规则引擎

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

rule 'abc'
when
    name = 'X'
then
    price= '12'
end
一个规则的条件取决于之前规则中设置的内容,因此基本上存在规则转换

这真的很痛苦,因为drools规则不是顺序编程,也不利于开发人员。由于对drools如何计算的错误解释,引入了很多bug


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

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

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

如果你想把它移植到java/groovy中,你就是在移植到命令式语言中,这可能会让你陷入If/then/else的地狱。我建议如下:

  • 将此代码与代码库的其余部分隔离开来-将来当业务部门更改其规则时,您将对此代码进行大量维护。良好的接口设计和封装将在今后的道路上获得巨大的回报
  • 与您的业务客户开发某种类型的DSL,这样当他们说“信贷政策”之类的话时,您就可以确切地知道他们指的是什么,并可以适当地更改相关规则
  • 单元测试,单元测试,单元测试。这也适用于您当前的配置。如果你现在发现了bug,为什么你的测试没有发现呢?设置junit创建一个对象并调用Drools引擎并测试响应并不需要很长时间。如果您向期望相同响应的变量的测试范围中添加一些循环,那么您可以很快参与数十万个测试
  • 顺便说一句:如果你不想走这条路,那么我强烈建议你接受一些关于口水的训练,这样你就可以了解引擎,如果你还不了解的话,可以重新训练。如果您能够将客户的规则快速转化为可实施的软件,那么您可以与客户取得一些巨大的成功