我需要一些关于解决这个问题的最佳方法的建议。
我研究了DROOLS,Java Rule Engine和其他一些。所有这些都是强大的,并且对它们有好处。我不知道哪个(如果有的话)对我来说是最好的选择。
我有一个业务对象。 (简化演示)
Person
firstName:String
lastName:String
departMent:String
hireDate:Date
我需要在Web应用程序中编写一个编辑器,以便围绕这些字段构建复杂的规则。我需要支持复杂的嵌套AND / OR逻辑。我只需要基本的运算符,规则应该简单地评估为真或假。如果规则评估为true或false,则将分别执行一个操作。
例如,
firstName包含“value”AND (lastName EQUALS“输入”OR部门 包含“输入”)
我曾经想过,也许我应该编写自己的解析器并在我自己的代码中评估逻辑。我不知道该怎么做,任何建议或链接到阅读的东西将不胜感激。我可以研究一种特定的设计模式吗?
你会如何解决这个问题?关于规则引擎的一个保留意见是,它们可能过于复杂而不仅仅是一个简单的问题吗?
答案 0 :(得分:5)
这不是一个是/否的问题,但我可以分享我的经验,并希望它有所帮助。 我在一些项目中非常成功地使用了DROOLS。除了一些情况(另一个团队在重载下遇到DROOLS问题),DROOLS是一个非常有用的库。
我建立了一个应用程序:
1.从源读取输入
2.根据一组可用操作的输入选择下一个操作
尽管看起来微不足道,但它需要非常灵活:
1.输入是一组可变的名称 - 值对,名称未预先确定
2.值,某些名称/值的存在/不存在(基于事件的发生/不存在),触发不同的动作
3.应用程序运行时业务规则可能会发生变化。
也许有更好的解决方案,但无论好坏,我最终都使用了DROOLS。我开发了一个BPEL,由DROOLS组件做出决策。 DROOLS组件在内部从Microsoft Excel电子表格中读取决策制定规则。如果文件发生更改,它会重建规则。 现在领域专家会在需要时更改此电子表格,我们不会经历痛苦的部署!
如果您需要复杂的用户界面,DROOLS Guvnor是一个随时可用的网络应用程序(具有丰富的用户界面),可帮助您的域/主题专家构建规则并将其存储在数据库中。
答案 1 :(得分:1)
Drools文档讨论了何时使用规则引擎。 http://downloads.jboss.com/drools/docs/5.1.1.34858.FINAL/drools-expert/html_single/index.html#d0e181
来自文档...
最简单的回答是“什么时候 没有令人满意的传统 编程方法来解决 问题。“。鉴于答案简短, 需要更多解释。该 之所以没有“传统” 方法可能是其中之一 以下内容:
- 这个问题太过分了 传统代码。
问题可能并不复杂,但是 你看不到一种非脆弱的方式 为它建立一个解决方案。
- 问题显而易见 算法解决方案。
这是一个需要解决的复杂问题, 没有明显的传统 解决方案,或基本上是问题 尚未完全理解。
- 逻辑经常改变
逻辑本身甚至可能很简单 但规则经常变化。在 许多组织软件发布 很少,很远,可插拔 规则可以帮助提供“敏捷性” 这是需要和预期的 合理安全的方式。
- 域专家(或业务分析师) 很容易获得,但是 非技术。
领域专家通常拥有财富 关于业务规则和知识的知识 流程。他们通常是 非技术,但可以是非常合乎逻辑的。 规则可以让他们表达 逻辑以他们自己的方式。当然, 他们仍然需要批判性地思考 并且能够进行逻辑思维。 许多非技术职位的人 没有正式逻辑的训练, 所以要小心并与他们一起工作 通过编纂商业知识 规则,你经常会暴露出洞 业务规则和方式 目前理解这些过程。
何时不使用......
由于规则引擎是动态的(动态的) 在规则可以的意义上 存储,管理和更新为 数据),他们经常被视为一个 解决部署问题 软件。 (大多数IT部门似乎都是 存在是为了预防 软件正在推出。)如果是这样的话 你希望使用规则的原因 引擎,请注意规则引擎 当你能够写作时,你的工作效果最佳 声明性规则。作为备选, 你可以考虑数据驱动的设计 (查找表)或脚本处理 管理脚本的引擎 在数据库中,并且能够 即时更新。
答案 2 :(得分:0)
我会建议你自己的解析器。在这种情况下,为什么不能序列化对象并使用AJAX在后端验证它?然后它从UI中分离验证逻辑。
答案 3 :(得分:0)
我会看看一些示例规则引擎接口,看看我喜欢哪些。您可以查看基于Web的电子邮件规则界面以获得一些想法。如果你真的需要一个简单的规则引擎,你只需要创建一个好的界面,然后你可以用javascript将规则发送到服务器。
答案 4 :(得分:0)
可能不是。你需要一个体面的领域模型。不是对象只是数据占位符的地方。您的用户是否可能能够理解和使用这样一个复杂的规则系统,那些不喜欢只在java中编程的人,他们有适当的封装和重构支持吗?规则系统仅适用于受限域上的简单规则,您可以在其中解释未经过培训的程序员如何构建它们。并且不要忘记构建规则只是编程,因此您仍然需要版本控制,测试,并且不需要全局变量。
答案 5 :(得分:0)
Jython不会有用吗?
每个表达式/复杂规则都可以是函数体。 因此,用户提供正文,代码将函数规范放在其周围,然后执行它。
您还可以将自己的任何Java对象/变量放入jython上下文中,以便在脚本/函数体中使用。
然后,您可以轻松获得标准化,可扩展的广泛使用的语言。 但我认为Jython编辑可能是一个挑战。
答案 6 :(得分:-2)
您是否尝试过JBehave?
JBehave是行为驱动开发(BDD)的框架。 BDD是 测试驱动开发(TDD)和验收测试的演变 驱动设计,旨在使这些实践更容易获取 对新手和专家都很直观。它改变了词汇量 从基于测试到基于行为,并将自己定位为 设计理念。