我需要一个简单的规则引擎,我想?[已关闭]

2022-09-02 11:02:41

我需要一些关于解决这个问题的最佳方法的建议。

我研究了DROOLS,Java Rule Engine和其他一些。所有这些都很强大,并且都有好处。我不知道哪个(如果有的话)对我来说是最好的选择。

我有一个业务对象。(简化为演示)

Person
     firstName:String
     lastName:String
     departMent:String
     hireDate:Date

我需要在Web应用程序中编写一个编辑器,该编辑器将允许围绕这些字段构建复杂的规则。我需要支持复杂的嵌套 AND/OR 逻辑。我只需要基本的运算符,规则应该简单地计算为真或假。如果规则的计算结果为 true 或 false,则将分别发生一个操作。

例如

firstName 包含 “value” AND (lastName 等于 “input” 或 Department CONTAIN “input”)

我曾经想过,也许我应该编写自己的解析器,并在自己的代码中评估逻辑。我不知道该怎么办,任何建议或链接到阅读的东西将不胜感激。有没有一个特定的设计模式我可以研究?

您将如何解决这个问题?关于规则引擎的一个保留意见是,也许它们太复杂了,不适合一个简单的问题?


答案 1

这不是一个是/否的问题,但我可能会分享我的经验,并希望它有所帮助。我在一些项目中非常成功地使用了DROOLS。除了一些情况(另一个团队在重负载下有DLOOLS问题),DROOLS是一个非常有用的库。

我构建了一个应用程序:
1.从源
读取输入 2.根据一组可用操作的输入选择下一个操作

尽管看起来微不足道,但它需要非常灵活:
1.输入是一组可变的名称 - 值对,名称不是预先确定的。
2.值,某些名称/值的存在/不存在(基于事件的发生/不存在),触发不同的操作。
3. 在应用程序运行时,业务规则可能会更改。

也许有更好的解决方案,但无论好坏,我最终都使用了DROOLS。我开发了一个BPEL,其中决策由DROOLS组件做出。DROOLS组件在内部从Microsoft Excel电子表格中读取决策规则。如果文件中存在更改,它将重新生成规则。现在,领域专家会在需要时更改此电子表格,并且我们不会经历痛苦的部署!

如果你想要一个复杂的UI,DROOLS Guvnor是一个现成的Web应用程序(具有丰富的UI),它将帮助你的领域/主题专家构建规则并将其存储在数据库中。


答案 2

Drools文档讨论了何时使用规则引擎。http://downloads.jboss.com/drools/docs/5.1.1.34858.FINAL/drools-expert/html_single/index.html#d0e181

从文档...

对此的最短答案是“当没有令人满意的传统编程方法来解决问题时”。鉴于这个简短的答案,需要更多的解释。没有“传统”方法的原因可能是以下原因之一:

- 这个问题对于传统代码来说太过挑剔。

问题可能并不复杂,但你看不到一种非脆弱的方式来为它构建解决方案。

- 这个问题超出了任何明显的算法解决方案。

这是一个需要解决的复杂问题,没有明显的传统解决方案,或者基本上问题还没有完全理解。

-- 逻辑经常变化

逻辑本身甚至可能很简单,但规则经常变化。在许多组织中,软件版本很少,可插拔规则可以帮助以合理安全的方式提供所需和预期的“敏捷性”。

- 领域专家(或业务分析师)随时可用,但不是技术性的。

领域专家通常拥有丰富的业务规则和流程知识。它们通常是非技术性的,但可以非常合乎逻辑。规则可以允许他们用自己的方式表达逻辑。当然,他们仍然必须批判性地思考,并能够进行逻辑思维。许多从事非技术职位的人没有接受过形式逻辑方面的培训,因此请小心并与他们合作,因为通过在规则中编纂业务知识,您经常会暴露当前理解业务规则和流程的方式中的漏洞。

何时不使用...

由于规则引擎是动态的(从规则可以存储、管理和更新为数据的角度来看是动态的),因此它们通常被视为部署软件问题的解决方案。(大多数IT部门的存在似乎都是为了防止软件推出。如果这是您希望使用规则引擎的原因,请注意,当您能够编写声明性规则时,规则引擎的效果最好。作为替代方法,您可以考虑数据驱动的设计(查找表)或脚本处理引擎,其中脚本在数据库中进行管理并能够动态更新。


推荐