Javascript中的轻量级规则引擎[关闭]

Posted

技术标签:

【中文标题】Javascript中的轻量级规则引擎[关闭]【英文标题】:Lightweight Rules Engine in Javascript [closed] 【发布时间】:2011-03-26 17:52:01 【问题描述】:

我正在寻找用 javascript 实现的轻量级规则引擎的建议。

这种实现的原因是使用一小组规则(少于 20 条)构建一个非常轻量但快速的基于浏览器的模拟。模拟将采用六个参数并运行规则并在浏览器中显示结果,而无需返回服务器。想象一个带有几个单选按钮、复选框、文本框和滑块来控制参数的 UI。模拟将根据任何参数变化快速重新运行。

【问题讨论】:

@Philippe - 你说的是验证规则吗? 你已经掌握了一门全能的编程语言,它缺少什么功能? 听起来写一个比找到、学习和适应现有的规则引擎要快。 或许更好地定义“规则引擎”。 “规则引擎”是指传统定义 - ***en.wikipedia.org/wiki/Rules_engine#Types_of_rule_engines 【参考方案1】:

我已经实现了一个(更复杂的)你在 c# 中描述的版本,回想一下代码,所有这些都可以用 JavaScript 实现。我同意发布的 cmets 的观点,即自己编写是一个可行的选择。它可以像您想要的那样简单或复杂。

对此类规则引擎的一般观察(排名不分先后):

    非线性查找是您的朋友。在 JavaScript 中,这很容易使用 obj[key] = val 语法。一旦确定了给定参数集的规则输出,缓存其结果,以便您可以再次使用它而无需再次执行该规则。

    确定您是否需要处理输入的唯一组合。例如,假设您允许用户输入多个名称并在 XYZ 上询问建议。实际上,您现在需要针对每个输入值运行所有规则。这可能是无关紧要的、简单的或极其复杂的(想象一个酒店预订系统,它采用多个日期、时间、地点和标准并提出建议)。

    setTimeout() 可以用来平滑 UI 行为,但是你描述的规则应该在几毫秒或更短的时间内执行,所以最后担心性能。使用基本规则引擎时,性能问题并不像您想象的那么重要。

    如果规则定义是对象(甚至是简单的对象树),则它们将最容易操作。

    不要将 UI 元素绑定到输出结果;也就是说,将规则执行的结果放入一个灵活的对象列表中,以便您可以从中创建任何您想要的视觉输出。

    自定义输出消息对用户非常有用。这意味着,与其在满足条件时触发通用消息,不如尝试在输出消息中插入一个实际值,例如“您的信用评分只有 550。您需要至少 600 才能继续。”

    李>

这就是我的想法。祝你好运。

【讨论】:

这并不是我真正想到的,但既然你在这个话题上,我发现了一个很好的框架来建模依赖链:KnockoutJS knockoutjs.com。事实上,我目前正在将它与 Brain (harthur.github.com/brain) 神经网络库结合使用来创建动态模拟。但是对于我试图解决的原始问题,我不能使用神经网络,因为我需要对一组规则(条件/动作对)进行建模,我可以根据目标(证明目标 X 即反向链接)进行评估或基于一系列事实(即前向链接)。 @Phillipe - 同意,神经网络不能解决您描述的问题。我的回答可能措辞不佳;简而言之,我不知道现有的框架可以满足您的要求,但根据我的经验,您可以在几天内轻松搞定一个基本但灵活的规则引擎,即使在 JS 中也是如此。钟声/口哨/警告是浪费时间的地方(这就是为什么我指出我学到的东西是陷阱的原因)。我不知道自己写是不是一种选择。【参考方案2】:

查看以纯 JavaScript 为 node.js 实现的 nools 规则引擎。它有一个非常简单的规则定义语法。

【讨论】:

如何使这项工作适用于 IE 8-9? nools 不再由 C2FO 维护,来自其 github 存储库的专家:C2FO is no longer maintaining this project. Please use accordingly. If you would like to help maintain or take over the project please let us know.【参考方案3】:

Rule Reactor (https://github.com/anywhichway/rule-reactor) 是一个轻量级、快速、富有表现力的正向链接业务规则引擎,它利用 JavaScript 内部结构、惰性交叉产品和作为对象而不是 Rete 的函数。可以在浏览器中使用,也可以在服务器端使用。

【讨论】:

现在也已弃用 npmjs.com/package/rule-reactor【参考方案4】:

这是一个非常简单的规则引擎,它使用服务器端 javascript(Mozilla 的 Rhino 引擎)(也许对你有帮助) http://jubyrajan.blogspot.com/2010/04/implementing-simple-deterministic-rule.html

【讨论】:

【参考方案5】:

我为产品配置器制作了一个示例 html / javascript 规则引擎。规则引擎基于 if then 语句。 if then 语句将使用数组进行检查。每次更改选项时,此数组都会填充所有可能的选项。 查看我的博客以获取示例。 Link to my blog "Forward chaining javascript rule engine"

我认为“obj[key] = val”是 javascript 规则引擎的关键。 Jquery 有助于处理 javascript。

【讨论】:

【参考方案6】:

请查看(JSL)https://www.npmjs.com/package/lib-jsl。

从概述文档中可以看出,JSL 是一个基于 JSON 的逻辑编程库,旨在嵌入到 JS 程序中。它使用 JSON 作为其语法以及 I/O 方法,并为主机环境提供回调以优化性能。

【讨论】:

以上是关于Javascript中的轻量级规则引擎[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Groovy脚本实现轻量级规则引擎

常用规则引擎

规则引擎EasyRules介绍,应用及示例

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

关于规则引擎的神话是啥? [关闭]

规则表达式引擎框架