当前位置: 首页 > 知识库问答 >
问题:

如何覆盖Drools 6中的规则和决策表?

祁奇略
2023-03-14

在一个场景中,我们有一组主规则。其中一条规则类似于以下规则:

rule "Check Eligibility"
when 
    $response(type=="rest",age== 25)
then 
   $response.setSendLetter("Y");
   $response.setUpdateStatus("eligible");
end

这些规则将向客户提供。我们希望我们的客户能够定制规则。若决定不定制,则应适用规则。自定义可以在“何时”中添加其他条件,也可以覆盖现有条件,还可以添加或修改“何时”部分。他们还可以添加到规则的“then”部分。

像这样的东西:

rule "Check Eligibility"
when 
   $response(type=="rest",age== 27, state="IL")
then 
   $response.setSendLetter("N");
   $response.setUpdateStatus("eligible");
   $response.setSendEmail("Y");
end

我们还有一些需要类似定制的决策表。

根据规则,最初建议使用“extends”,但据我所知,“extends”的作用是“AND”,它将检查父项和子项的条件,如果两者都是真的,它将执行“then”部分。

我可能想到的解决方案是为每个客户克隆主存储库,然后每当主存储库规则发生变化时,我们都会拉到客户存储库上。可能的问题可能是偶尔发生的合并冲突,可能需要手动解决。

克隆解决方案尚未被团队接受,因此想知道有哪些可能的解决方案可以实现规则和决策表的“覆盖”?

共有1个答案

谢正初
2023-03-14

这是一个技术问题和一个管理问题。

如果你的管理层决定让客户乱摆弄规则,他们必须意识到后果。显然,不能让客户独自遵守他们的规则,但您的组织将继续对整个应用程序的完美功能负责。你不可能免费做到这一点,客户的回旋余地越大,成本就越高。

这方面没有舒适的技术解决方案。扩展不适合您描述的那种修改:必须替换规则。

  1. 您可以(如您所写)复制DRL文件(在CM系统中创建分支),并让客户进行编辑。这是一种干净的方法;您可以使用其他测试(另一个要分支的CM项目)测试客户的基线,并使用众所周知的CM技术进行部署
  2. 另一种方法是让客户编写另一个包含需要更改的规则的DRL文件。但您不能将此DRL文件与原始文件一起编译;不允许复制规则。有一些解决方法,例如,通过替换已编译的Kiepacks中的规则,或禁用KieBase中被覆盖的规则,但它们具有要求使用非稳定内部API的不利含义
  3. 您可以尝试定义允许客户使用的DRL语言的子集,并允许使用基于该子集的DSL(可能是XML或类似语言)编写和覆盖规则。然后,生成器可以检查数据并创建DRL文本。使用这种方法,重写是一个简单的特性,由生成器处理。但还需要大量的开发工作

就Excel文件中以电子表格形式编写的决策表而言,您无论如何都需要克隆。我想不出任何其他方法来修改这些规则集。

 类似资料:
  • 决策覆盖技术属于白盒测试,它为布尔值提供决策覆盖。此技术报告布尔表达式的真/假结果。每当语句中有两个或多个结果的可能性时,如while语句,if语句和case语句(控制流语句),它被视为决策点,因为有两个结果为或。 决策覆盖率通过使用控制流图或图表涵盖代码的每个布尔条件的所有可能结果。 通常,决策点有两个决策值,一个是,另一个是,这就是为什么大多数时候结果总数是2的原因。决策覆盖率的百分比可以通过

  • 问题内容: 我是否可以从决策树中经过训练的树中提取出基本的决策规则(或“决策路径”)作为文本列表? 就像是: 谢谢你的帮助。 问题答案: 我相信这个答案比这里的其他答案更正确: 这会打印出有效的Python函数。这是一个试图返回其输入的树的示例输出,该数字介于0和10之间。 这是我在其他答案中看到的一些绊脚石: 使用来决定一个节点是否为叶是不是一个好主意。如果它是阈值为-2的真实决策节点怎么办?相

  • 问题内容: 我经常对CSS覆盖规则感到困惑:总的来说,我意识到更具体的样式表会覆盖不太具体的样式表,而具体性取决于指定了多少个选择器。还有一个关键字,它也起作用。 因此,这是一个简单的示例:我有一个带有两个表单元格的表。表格本身具有CSS规则,适用于表格中的所有单元格。但是,第二个表单元格具有自己的规则,该规则应覆盖常规表规则: 但是…当我在浏览器中打开它时,我看到它没有被覆盖。好的- 我想我需要

  • 问题内容: 所以,这就是我正在做的: 我有一张桌子,上面放着所有的桌子。 但是在一个特殊的场合,我希望一个特定的对象在各个方向都有,我将其设置为。 显然,我将CSS样式依次放在一个外部文件中。 但是渲染的CSS仅具有,并且似乎已被覆盖! 请说明: 这是怎么发生的以及为什么发生? 我应该如何安排这些规则来解决我的问题(除了内联样式)? 编辑:我在表中删除之前。我从来没有使用过它,我只是在这里提到它以

  • 问题内容: 我可以从决策树中经过训练的树中提取出基本的决策规则(或“决策路径”)作为文本列表吗? 就像是: 谢谢你的帮助。 问题答案: 我相信这个答案比这里的其他答案更正确: 这会打印出有效的Python函数。这是尝试返回其输入的树的示例输出,该数字介于0到10之间。 这是我在其他答案中看到的一些绊脚石: 使用tree_.threshold == -2来决定一个节点是否为叶是不是一个好主意。如果它

  • 我想使用决策表实现基于流口水中较少和较大值的简单规则。 在drl中实现规则非常简单,例如: 但是我怎样才能把它翻译成流口水的决策表呢?到目前为止,我看到的所有例子都是在条件单元格中进行比较。甚至可以在值单元格中进行比较吗? 我看到的所有示例的格式如下: 但这只适用于1条规则,执行以下操作完全有不同的含义: 甚至可以执行以下操作吗? 实施这些规则的正确方式是什么?