20

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

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

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

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

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

例如,

firstName CONTAINS "value" AND (lastName EQUALS "input" OR department CONTAINS "input")

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

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

4

7 回答 7

5

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

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

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

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

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

于 2010-12-03T18:37:57.157 回答
1

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

从文档...

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

——对于传统代码来说,这个问题实在是太小题大做了。

问题可能并不复杂,但您看不到为它构建解决方案的可靠方法。

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

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

-- 逻辑经常变化

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

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

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

什么时候不用...

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

于 2010-12-01T23:16:41.447 回答
0

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

于 2010-12-01T22:51:40.590 回答
0

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

于 2010-12-01T22:54:00.890 回答
0

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

于 2010-12-01T23:16:41.340 回答
0

Jython 不是很有用吗?

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

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

然后,您便拥有了一种标准化的、可扩展的、广泛使用的语言。但我认为 Jython 编辑器可能是一个挑战。

于 2010-12-02T08:35:41.157 回答
-3

你试过JBehave吗?

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

于 2010-12-01T23:46:47.340 回答