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

Posted

技术标签:

【中文标题】我想我需要一个简单的规则引擎? [关闭]【英文标题】:I need a simple rules engine, I think? [closed] 【发布时间】:2011-05-18 19:24:44 【问题描述】:

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

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

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

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

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

例如,

firstName 包含“值”并且 (姓氏等于“输入”或部门 包含“输入”)

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

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

【问题讨论】:

啊,我需要一种表达语言。我要去mvel.codehaus.org/Home 嗨,你试过easyrules.org吗?它可以帮助您实现您正在寻找的东西。希望这可以帮助。亲切的问候 【参考方案1】:

这不是一个是/否的问题,但我可能可以分享我的经验,并希望它有所帮助。 我在一些项目中非常成功地使用了 DROOLS。除了一些案例(另一个团队在重负载下使用 DROOLS 时遇到问题),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 部门似乎 存在的目的是为了防止 软件正在推出。)如果这是 您希望使用规则的原因 引擎,请注意规则引擎 当你能写的时候工作最好 声明性规则。作为备选, 你可以考虑数据驱动的设计 (查找表)或脚本处理 管理脚本的引擎 在数据库中,并且能够 即时更新。

【讨论】:

我读过这个。我们将让“领域专家”构建规则,但他们不会考虑在 Drools 编辑器中编写 Drools 规则。这些人想要一个漂亮的编辑器,它实际上是为他们做的,并且是为问题领域量身定制的。我不喜欢编写自己的代码来编写 drools 规则的想法,我喜欢输入 drools 规则。 :) 您不必让非程序员编写规则。这是拥有规则引擎的理由之一,但让程序员编写规则完全没问题。但是,粗略地看一下您所提供的内容,更多的是指向非基于规则的解决方案。解析器似乎更简单,规则引擎的设置并不简单。 但请注意,为组织带来一些敏捷性比推动规则引擎更有可能带来良好的结果,因为 IT 组织每季度发布一次。建立一个每月发布两次的组织并不难。一旦你允许程序员建立规则,你实际上已经从一个问题中产生了两个问题。【参考方案3】:

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

【讨论】:

我对序列化对象的意思有点困惑。 Web 前端只是基于字段构建规则。我将在后端对数据库中的所有“Person”对象应用规则。 问题显然不在于解析对象,而是在这些对象上应用规则的最佳方法。 当他说“我曾想过,也许我应该编写自己的解析器并评估自己代码中的逻辑。” ,我认为他在询问将规则应用于将在前端使用用户输入构建的对象的最佳方式。没明白他想在前端构建规则。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

@Stephen 不确定我是否同意“规则系统仅适用于受限域上的简单规则,您可以在其中向未受过程序员培训的人解释如何构建它们”的说法它们也适用于复杂的算法不容易定义的规则。我有效地使用了规则引擎来解决没有一个专家能够有效解释的网络配置问题(当然除了他们自己的部分)。 我不同意那里。它们根本不适合复杂的规则。缺乏可见性、重构、模块化、速度、灵活性是我遇到的常见问题。对于那些我更喜欢 Smalltalk 系统的人,您可以在其中简单地创建 DSL 并构建强大的模型。【参考方案6】:

Jython 不会有用吗?

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

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

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

【讨论】:

【参考方案7】:

你试过JBehave吗?

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

【讨论】:

不,我会用谷歌搜索。谢谢 测试框架应该如何帮助实施业务规则?你的意思是他可以拆掉测试定义引擎并重用它来实现规则? 不确定此答案是否适用于上述问题

以上是关于我想我需要一个简单的规则引擎? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Java或Python中基于开源的规则引擎[关闭]

如何快速学习 Drools 或其他规则引擎 [关闭]

推理引擎与决策树 [关闭]

Java规则引擎的优缺点[关闭]

基于 Python 规则的引擎 [关闭]

我应该使用啥规则引擎? [关闭]