我想,我需要一个简单的规则引擎?

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

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

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

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

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

例如,

firstName CONTAINS“value”AND(lastName EQUALS“input”OR department CONTAINS“input”)

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

你怎么解决这个问题? 关于规则引擎的一个保留意见是,它们可能过于复杂而不仅仅是一个简单的问题?

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

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

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

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

如果您需要复杂的UI,DROOLS Guvnor是一个随时可用的Web应用程序(具有丰富的UI),可以帮助您的域/主题专家构建规则并将其存储在数据库中。

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

来自文档……

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

– 这个问题对传统代码来说太过分了。

问题可能并不复杂,但您无法看到为其构建解决方案的非脆弱方式。

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

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

– 逻辑经常变化

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

– 领域专家(或业务分析师)随时可用,但非技术人员。

领域专家通常拥有丰富的业务规则和流程知识。 它们通常是非技术性的,但可能非常符合逻辑。 规则可以允许他们用自己的术语表达逻辑。 当然,他们仍然需要批判性思考并具备逻辑思维能力。 许多非技术职位的人没有正式逻辑方面的培训,所以要小心并与他们合作,因为通过在规则中编纂业务知识,您将经常暴露出当前理解业务规则和流程的方式。

什么时候不用……

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

我会建议你自己的解析器。 在这种情况下,为什么不能序列化对象并使用AJAX在后端validation它? 然后它从UI中分离validation逻辑。

我会看看一些示例规则引擎接口,看看我喜欢哪些。 您可以查看基于Web的电子邮件规则界面以获得一些想法。 如果你真的需要一个简单的规则引擎,你只需要创建一个好的界面,然后你可以用javascript将规则发送到服务器。

可能不是。 你需要一个体面的领域模型。 不是您的对象只是数据占位符的地方。 您的用户是否可能能够理解和使用这样一个复杂的规则系统,那些不喜欢只在java中编程的人,他们有适当的封装和重构支持吗? 规则系统仅适用于受限域上的简单规则,您可以在其中解释未经过培训的程序员如何构建它们。 并且不要忘记构建规则只是编程,所以你仍然需要版本控制,测试,并且不需要全局变量。

Jython不会有用吗?

每个表达式/复杂规则都可以是函数体。 因此,用户提供正文,代码将函数规范放在其周围,然后执行它。

您还可以将自己的任何Java对象/变量放入jython上下文中,以便在脚本/函数体中使用。

然后,您可以轻松获得标准化,可扩展的广泛使用的语言。 但我认为Jython编辑器可能是一个挑战。

你试过JBehave吗?

JBehave是行为驱动开发(BDD)的框架。 BDD是测试驱动开发(TDD)和验收测试驱动设计的演变,旨在使新手和专家对这些实践更易于访问和直观。 它将词汇从基于测试的转变为基于行为的,并将自身定位为设计哲学。