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

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

我有一个商业对象。(为了演示而简化)

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

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

例如,

FirstName包含“值”,(LastName等于“输入”或部门包含“输入”)

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

你会如何解决这个问题?对规则引擎的一个保留意见是,对于一个简单的问题来说,它们可能太复杂了?

有帮助吗?

解决方案

这不是一个是/否的问题,但我可以分享我的经验,希望它有所帮助。我在一些项目中非常成功地使用了 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.1.34858.final/drools-expert/html_single/index.html#d0e181

来自文档...

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

- 对于传统代码而言,问题太过了。

这个问题可能并不复杂,但是您看不到为此构建解决方案的非困境方法。

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

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

- 逻辑更改经常

逻辑本身甚至可能很简单,但是规则经常改变。在许多组织中,软件版本很少且相距甚远,可插入的规则可以帮助以相当安全的方式提供所需和期望的“敏捷性”。

- 域专家(或业务分析师)很容易获得,但无技术。

领域专家通常拥有有关业务规则和流程的丰富知识。它们通常是非技术性的,但可能非常合乎逻辑。规则可以使他们以自己的方式表达逻辑。当然,他们仍然必须进行批判性思考并具有逻辑思维。许多处于非技术职位的人没有正式逻辑的培训,因此请谨慎并与他们合作,就像通过规范规则中的商业知识一样,您通常会以目前了解业务规则和流程的方式来揭露漏洞。

什么时候不使用...

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

我建议您自己的解析器。在这种情况下,为什么您不能序列化对象并使用Ajax在后端进行验证?然后,它将验证逻辑与UI分开。

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

可能不是。您需要一个体面的域模型。不是你的 对象 只是数据占位符。您的用户是否可能能够理解和使用此类复杂的规则系统,并且那些确实不喜欢在Java中编程的人,他们在这里具有适当的封装和重构支持?规则系统仅与受限制域的简单规则合作,您可以在其中解释没有作为程序员培训的人如何构建它们的人。而且,不要忘记制定规则只是编程,因此您仍然需要版本控制,测试并且不需要全球。

Jython不用吗?

每个表达式/复杂规则可以是函数的主体。因此,用户提供主体,您的代码将功能规范围绕它,然后执行。

您还可以将自己的任何Java对象 /变量放入脚本 /功能主体中使用的Jython上下文中。

然后,您的指尖有一种标准化的,可扩展的语言。但是我认为Jython编辑可能是一个挑战。

你有没有尝试过 jbehave?

JBEHAVE是行为驱动发展(BDD)的框架。 BDD是测试驱动开发(TDD)和接受测试驱动的设计的演变,旨在使这些实践更容易访问和直观,以对新移民和专家们来说。它将词汇从基于测试的行为转变为基于行为,并将自己定位为设计理念。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top