2

我有一个问题,我想在我现有的技术上寻求替代方案,因为编程的功能会很复杂并且会提供给用户,所以它应该尽可能简单,因为它可以在前端。我需要基于 Java 的技术。

我需要做的: 我有一个包含大量数据的基本结构。这些数据大多写得很好,比如整数、日期、布尔值等,所以可以很容易地比较。

我需要使用可以由许多来源(如内部业务流程和政府法律)定义和更改的批量需求来建模决策。

所以我想给用户一个脚本能力(他们中的大多数都有大学学位,所以有些复杂是可以的)。
让我们看一个简化的例子。
令 A 为具有以下内容的结构。
A.budget - 整数
A.bankRelatedDebt - 整数
A.privateRelatedDebt - 整数
A.deadLine - 日期
A.hasPermissionFromGovernment - 布尔
A.hasProblematicContracts - 布尔

我需要定义规则来决定规则是否成立,所以我需要布尔值。
规则 1:预算超过 100 万欧元
规则 2:没有问题文件或获得政府许可 规则
3:截止日期不在一个月范围内。
规则 4:总债务(本地 + 私人)不超过 100.000 欧元

这些规则可以在其他情况下进行硬编码,但这必须是超级动态的并且基于给定的数据。

我们有流口水antlr的选项,如果你能提到的话,我需要其他选择。或者,如果您可以提及要避免的技术,那也很有帮助并受到欢迎,所以我可以避免它。

4

5 回答 5

1

就像策略模式一样,所有不同的规则都是应用于上下文(A)的不同算法,可以在运行时选择算法。

为其添加过滤器链设计模式,以便您可以同时选择不同的算法(规则)。

Roolie是一个非常简单的 Java 规则引擎,可能会对您有所帮助。正如 Roolie 所说:

Roolie 是一个非常简单的 Java 规则引擎(非 JSR 94),它使用您在 Java 中创建的规则。只需创建您的基本规则,为每个规则实现单一的“通过”方法,然后将它们链接到一个 XML 文件中以创建更复杂的规则。

于 2013-03-20T13:46:56.660 回答
1

我会投票反对流口水,因为我有糟糕的经历,但有些人喜欢它。
我会提出一种已经集成在 java 中的语言:JavaScript。为什么?

  • 足够简单并且可以很好地访问java bean:您可以使用budget.deadLine而不是budget.getDealLine()
  • 你有很多地方可以检查信息
  • 您可以添加简单的功能,使其更易于使用

但如果你选择 JavaScript、Python、Drools、ANTLR,请记住:

  • 用户没有像 SVN/GIT 这样的版本控制系统,所以这取决于你。
  • 给他们一个工具(网页或其他),自动保存他们编写的每个脚本的每个版本。
  • 给他们一种在不损坏任何东西的情况下测试他们所写内容的方法。
  • 为他们提供工具来回滚他们所做的任何更改。
  • 一旦他们在执行代码之前提交代码,就尽可能多地进行静态测试。
  • 语法高亮会让他们更开心。

请记住:他们会以您意想不到的方式使用该工具,而您最终会编写(或重写)大部分脚本。没有大学学位意味着您可以相信他们了解他们在做什么。(甚至没有CS!)

因此,如果您可以使系统的动态性降低,对您有利

于 2013-03-20T13:48:51.213 回答
1

物有所值。我也很想做这样一个专家系统,所以请忍受我的漫无边际。首先,当您问要避免什么时,有一些负面因素。

有很多陷阱。

“编程”是由用户完成的,可能没有用于恢复的版本控制系统,可能没有暂存系统但在生产系统中工作。考虑明智地扩展通用库规则测试。没有单元测试?

然后是用户接受。特别是有一个竞争对手,Excel 编程,你必须取代它。使用人工可选的文本块、图表生成报告。

您的无规则规则仍然缺乏生命力:系统可以帮助提供可供选择的类别: 规则 1 - 对货币资源的限制。很好的建议是“您是否也想限制有限的资源?(a)规则1,(b)......。

还有什么是产品?有什么优势?目标是什么?报告、计算方案(假设条件、计算的公差)。

我当然会首先按照上述思路编写技术文档,然后搜索工具- 正如您似乎正在做的那样。Drools 太基础了。用于 DSL 的 ANTLR 我觉得有风险。

工具

数据挖掘似乎是您正在搜索的关键字。

JVM 编程语言 Scala(不容易获得)对于 DSL 解析非常有效。许多函数式语言更容易一些,并且也提供脚本(Java 脚本 API)。

一个 web 项目怎么样,也许使用 jetty 作为嵌入式 web 服务器。所以你可以应用 HTML 和 JavaScript。HTML5?

富客户端平台(eclipse 或 NetBeans)需要快速开发的经验。对于漂亮的图形,也许是 JavaFX(为时过早)。

于 2013-03-20T13:42:12.187 回答
1

使用GroovyScala开发满足您需求的 DSL 。

我们使用CodeMirror在网页中提供语法高亮。使用 Groovy 非常适合我们。

于 2013-03-20T13:43:41.820 回答
0

如果您在数据库中有记录,则可以使用 SQL 语法选择匹配的记录。

例如:

SELECT * FROM data
    WHERE budget > 100000
      AND privatCredits < 50000
于 2013-03-20T13:26:31.540 回答