DMN –规则的力量–第1部分

DMN –规则的力量–第1部分

让我们谈谈DMN。它是在由OMG(对象管理小组)发布的决策模型和表示法。他们还发布了其他令人兴奋的符号,例如业务流程模型符号(BPMN)和案例管理模型和符号(CMMN)。

但是OMG是谁,为什么我们要听他们的话?他们是“成立于1989年的国际性,开放成员,非营利技术标准联盟”。该标准由供应商,最终用户,学术机构和政府机构推动。但是足够的理论。如果您想了解更多有关它们的信息,可以在Object Management Group上找到所有内容。

您为什么要关心DMN?还记得您必须对流程进行建模并最终看起来像下面那样的时候吗?首先,DMN有助于在需求收集和建模期间将重点放在问题的某个方面。可以讨论和更改决策标准,而不必考虑完整的过程逻辑,反之亦然。

“由于该模型符合定义的结构和规则,因此与业务需求文档相比,它可以更精确,完全和一致地定义决策需求。” (DMN方法和样式第二)

让我们看一个例子:

 

 

现在,假设您可以执行以下操作:

不仅过程变得更简单,而且您还将过程逻辑与业务逻辑分开。这意味着您可以更改DMN,而无需更改流程本身。否则,每个决定都会有很多网关(BPMN)或条目哨兵(CMMN)。“最好用单个决策任务替换流程模型中的网关链,该决策任务调用DMN中建模的路由决策。从网关流出的每个序列都称为门。” (DMN标准2018)

让我们看一下DMN表:“ DMN决定不采取任何行动。它仅指定一个输出值,然后可以将其用于(例如,由BPMN流程使用)指示特定的动作。” (DMN标准2018)

当然,这看起来并没有太大变化,但是让我们更多地了解DMN的可能性。假设您有不同类别的餐厅,可以按照价格和辣味程度将其分类。

您无需在过程中进行任何更改。唯一必要的更改是在DMN表中:

而且过程本身仍然看起来完全相同:

但是DMN表如何正常工作?根据DMN规范,有多种类型:按行规则,按列规则和交叉表。对于此博客文章,我们将看一看默认的规则-行规则,这意味着每一行代表一个规则。左边的列代表输入条件,右边的列代表输出结论。每列都有一个运算符(例如,== 、、 <= 、、> = 、、 <、、>)和一个值。将依次评估每个输入列,并且所有输入列都需要评估为true(逻辑AND)以得出要执行的规则的结论,因此,如果查看一个规则(行),则没有OR逻辑。输入单元格条件的一个示例是“ taste == italian”,需要将其评估为“ true”,规则才能继续。如果单元格仅包含连字符“-”,

让我们看一下DMN表中的第一条规则。如果变量“ taste”的值是“ italian”,并且我们想少吃点辣菜(“ <3”),又不想花很多钱(“ $”),则第一个规则是如果为true,则DMN的输出会将变量“ restaurant”设置为值“ Mario's Pizza”。

输入:`taste =='italian'&& spiciness <3 && price == 3`

输出:`restaurant =='Mario's Pizza'

但是,如何在DMN表中表示OR规则?

DMN规范仅允许在规则中的列上使用AND逻辑,这意味着如果我们具有OR规则,则需要将规则分为多个AND规则。起初听起来可能很抽象,但是一旦您知道它的工作原理就很容易。特别是在查看其他DMN表时,此规则也不例外。

也许我们有一家餐厅提供意大利和泰国美食。为了在DMN表中表示这一点,我们添加了两个规则。第一条规则为“ taste =='italian'”,第二条规则为“ taste =='thai'”。当我们仔细研究命中策略时,我们将对此进行研究。现在,我们可以说命中策略改变了DMN规则的触发方式,因此,当多个输入条件为真时,表将采用哪个输出。

资料类型

查看输入变量时,有五种不同的数据类型:字符串,数字,日期,布尔值和集合。这些数据类型会更改变量的求值方式,还会更改可用的运算符。所有数据类型的通用运算是`==`和`!=`。

数据类型的操作概述矩阵:

采集

让我们更详细地看一下Collection操作,因为其他数据类型或多或少是不言自明的。假设我们有一个变量“ selectedTastes”,其中包含口味列表。用户可以从该列表中选择他们喜欢的一种或多种口味。在我们的示例中,用户选择了口味“意大利语”和“泰式”。

对于我们的DMN表规则,第1、4、5、6行将得出true。

让我们看一下每个操作:

序号

规则

结果

说明

1

任何“意大利语”

T

如果列表包含“意大利语”,则成功

2

没有“意大利语”

F

如果列表包含“意大利语”,则失败

3

并非全部是“意大利语”

F

如果列表包含“意大利语”,则失败

4

全部“意大利语”

T

如果列表包含“意大利语”,则成功

5

任何“意大利语”, “瑞士”

T

如果列表包含“意大利语”或“瑞士”,则成功

6

没有“意大利语”, “瑞士”

T

如果列表包含“意大利语”或“瑞士”,则失败

7

并非所有的“意大利语”, “瑞士”

F

如果列表包含“意大利语”和“瑞士”,则失败

8

全部为“意大利语”,“瑞士”

F

如果列表包含“意大利语”和“瑞士”,则成功


试试看!

现在尝试一下,从Flowable下载Flowable Modeler,并通过Tomcat安装或通过Docker启动它。打开Flowable Modeler时,您可以尝试自己对其建模,或者在此处下载示例并将其导入。

 

相关教程