4.1 变量
4.1.1 名词解释
4.1.1.1 BOM (Business Object Model - 业务对象模型)
- 定义:BOM是从业务人员视角定义的、用于编写业务规则的词汇表。它是一个高层次的、业务友好的模型,包含了业务规则中会用到的名词和操作。
特点:
业务导向:使用业务术语,易于业务分析师理解。
- 抽象性:不关心底层技术实现,只关注业务概念。
- 可读性:在规则编辑器中看起来像自然语言。
独立性:可以独立于任何Java代码进行设计和讨论。
示例:在BOM中,你可能有一个名为
Customer的业务对象,它有属性age和creditScore,还有一个操作isHighValueCustomer()。
4.1.1.2 XOM (Execution Object Model - 执行对象模型)
- 定义:XOM是BOM在Java层面的具体实现。它是规则引擎在运行时实际操作的Java类、方法和字段。XOM提供了BOM所定义概念的技术实现。
特点:
技术导向:由Java类、接口、方法、字段等构成。
- 具体性:包含实际的代码逻辑和数据结构。
- 可执行性:规则引擎直接调用XOM中的Java方法来执行规则。
依赖性:BOM依赖于XOM来获得其行为和数据。
示例:与BOM中的
Customer对应,XOM中可能有一个Java类com.mycompany.model.Customer,它有int age字段、double creditScore字段,以及一个返回boolean的isHighValueCustomer()方法。
4.1.1.3 BOM和XOM的区别和联系
区别
| 特性 | BOM (业务对象模型) | XOM (执行对象模型) |
|---|---|---|
| 视角 | 业务视角 | 技术/开发视角 |
| 使用者 | 业务分析师、规则作者 | 开发人员 |
| 内容 | 业务术语、概念、逻辑 | Java类、方法、字段、代码 |
| 目的 | 定义规则的“词汇”和“语法” | 提供规则执行的“引擎”和“数据” |
| 可读性 | 高(对业务人员) | 低(对非技术人员) |
| 位置 | .bom文件(在Rule Studio中) |
Java项目中的 .java文件或外部JAR库 |
联系
- 映射关系:BOM必须映射到一个或多个XOM。一个BOM元素(如业务类、属性、方法)需要关联到一个具体的XOM元素(如Java类、字段、方法)。
- 依赖关系:BOM依赖于XOM。没有XOM,BOM只是一个空壳,无法执行。规则引擎通过BOM的映射关系调用XOM中的实际代码。
- 桥梁作用:BOM充当了业务人员和开发人员之间的桥梁。开发人员创建XOM(Java代码),然后业务人员基于此XOM定义BOM,并用BOM编写规则。
- 创建顺序:

- 自底向上 (Bottom-Up):先创建Java类(XOM),然后在Rule Studio中导入这些类自动生成BOM。
- 自顶向下 (Top-Down):先在Rule Studio中设计BOM(业务概念),然后生成对应的XOM(Java骨架代码),再由开发人员填充实现。
- 混合方式:最常见的方式,BOM和XOM协同设计和迭代。
总结
简单来说:
- XOM是“怎么做”(How):它是后台的Java实现,负责实际的数据存储和逻辑运算。
- BOM是“说什么”(What):它是前台的业务语言,让非技术人员能用熟悉的词汇来描述业务决策逻辑。
它们的关系就像是“用户界面”和“后台代码”。BOM是给规则作者看的“界面”,而XOM是支撑这个界面运行的“后台服务”。两者紧密结合,共同构成了UDM中规则定义和执行的基础。
4.1.1.4 系统 BOM
在缺省情况下, BOM 始终包含映射到特定 JDK 类的类以及与基本日期和时间相关的类,这些类称为系统 BOM。 例如,要比较日期的部分,如果您具有类型为 java.util.Date的 BOM 成员,那么可以将该类型更改为其中一种系统 BOM 日期类型, 引擎自动执行映射。

4.1.1.5 BOM组成
业务对象模型包含一个或多个 BOM 条目, BOM 条目定义业务对象模型中的一组业务元素。
(1)BOM 组成文件包含:
- BOM 文件,用于描述 BOM 的结构
- VOC 文件,这是特定于语言环境的文件,用于描述与 BOM 关联的词汇表
- B2X 文件,用于描述 BOM 和 XOM 之间的映射
(2)BOM 条目包含:
- 类:BOM条目名称和所在包路径
- 成员:属性字段,方法
- 术语:类/属性/方法的语言描述,操作短语“设置{this}的当前 ...为{...}”和导航短语"{this} 的{...}"
- 类型:类的超类和接口,属性字段的值类型,方法的返回值类型
- 定制属性:是指为 BOM (Business Object Model) 元素(如类、属性、方法)或规则项目本身添加的元数据 (Metadata)
- 类别: 是一个强大的组织和管理功能,主要用于在规则编排中对规则、规则集、规则流、变量集等资产进行分类、分组和过滤
- 域:它用于约束和定义业务对象模型(BOM)中属性、参数或变量的取值范围


4.1.1.6 变量的作用范围
| 变量 | 范围 | 定义和使用 |
|---|---|---|
| 临时变量(definitions) | 只能在定义了该变量的操作规则中去引用,只作用于当前规则文件中。 | 在规则的定义部分中定义规则变量。规则变量是定义它们的规则的本地变量, 它们在其他规则中不可用, 变量名称在规则中必须唯一。 |
| 变量(BOM) | 作为全局变量仅作用于当前规则项目 | 通过在BOM编辑器中定义类名和成员,在任一规则文件中引用目标变量,作为业务数据结构和类型的约束。 |
| 变量集(Variable Sets) | 可以由规则项目中的所有业务规则引用的变量参数,作为全局参数仅作用于当前规则项目。 | 通过规则集变量的名称,类型和语言描述来定义该变量。 变量集中的变量条目可以是对一个已存在BOM条目的引用,也可以是一个 简单的Java类型,并能为其指定初始值。使用时,在任一规则文件或者是规则流中的任务之间传递数据。 |
4.1.2 创建 BOM
用户在规则设计器中,任选一目录名右键:New UDM File -->New BOM File,在输入文件名称后自动打开了一个如下编辑初始化窗口:

创建包和类

添加类成员与述语

名称输入限制
变量名称、字段名称、术语中不得包含任何特殊字符,例如【制表符、换行符、单引号、双引号、左括号和右括号、斜杠、逗号、分号】等。
术语
定义:术语是来自 BOM (Business Object Model) 的预定义元素。它们是规则中使用的基本词汇单元,代表了业务领域的实体、属性、方法和值。
操作术语模板
在规则中,对术语可以执行的主要操作。
导航术语模板
导航是指如何在复杂的、相互关联的业务对象之间访问数据。这是通过点号 (.) 和 **'s** 结构实现的。
the <顶层对象>'s <关联对象>'s <属性>
**the**和**'s**是 BAL 的固定语法。- 路径中的每一级都必须是 BOM 中定义的有效术语(类、属性或方法)。
方法术语模板
将底层的 Java 方法调用(如 {this}.isMale({0}))转换成业务人员可以理解的、自然语言风格的规则表达式。它使用 {this} 和 {0}, {1}, ... 来表示占位符。
{this}: 指代当前正在操作的对象实例(例如Employee实例)。{0}: 指代第一个参数。{1}: 指代第二个参数,依此类推。
4.1.3 域
在UDM中“域 (Domain)” 是用于约束属性、参数或变量取值范围的核心机制,它确保了数据的业务有效性和一致性。
| 域类型 | 用途 | 数据类型 | 示例值 | 优势 |
|---|---|---|---|---|
| 枚举域 | 固定选项 | String, int |
LOW, MEDIUM, HIGH |
语法安全,IDE 提示,业务友好 |
| 值域 | 数值范围 | int, double, date |
[300, 850] |
数据验证,防止越界 |
| 字符串域 | 字符串集合 | String |
"PENDING", "SHIPPED" |
约束合法字符串 |
| 布尔域 | 布尔标签 | boolean |
true="ACTIVE" |
业务语义化布尔值 |
| 类型域 | 基础类型 | 任意 | 所有该类型的值 | 最基本的数据约束 |
枚举域 (Enumeration Domain)
定义:定义一组固定的、命名的、互斥的值。这是最常用和最重要的域类型。
特点:
- 值是预定义的,不能有域外的值。
- 在规则编辑器和 规则设计器中显示为下拉列表。
- 避免了拼写错误和“魔法字符串”。
示例: 假设我们要管理客户的风险等级。
- 域名称:
CustomerRiskLevel - 类型:
String(或int,但String更业务友好) 值 (Values):
LOWMEDIUMHIGHCRITICAL
值域 (Value Domain / Range Domain)
定义:为数值型(int, double)或日期型属性定义一个取值范围。
特点:
- 定义最小值 (min) 和/或最大值 (max)。
- 可以包含边界(包含或不包含)。
- 用于确保数值在业务允许的范围内。
示例 1:信用分范围
- 域名称:
CreditScoreRange - 类型:
int - 最小值:
300 - 最大值:
850 - 是否包含边界:是 (inclusive)
应用:约束 Customer.creditScore 属性。
示例 2:贷款金额范围
- 域名称:
LoanAmountRange - 类型:
double - 最小值:
1000.0 - 无最大值:(或设置一个合理的上限)
应用:约束 LoanApplication.amount 属性。
在规则中的体现: 虽然值域不直接出现在规则语法中,但它在数据验证时起作用。如果传入的 creditScore 是 200 或 900,规则引擎或 规则设计器会标记为无效。
字符串域 (String Domain / List Domain)
定义:定义一组允许的字符串值。与枚举域类似,但更灵活,通常用于字符串类型。
特点:
- 值是字符串集合。
- 适合国家代码、状态码等。
示例:订单状态
- 域名称:
OrderStatusDomain - 类型:
String 允许的值:
"PENDING""CONFIRMED""SHIPPED""DELIVERED""CANCELLED"
应用:约束 Order.status 属性。
布尔域 (Boolean Domain) - 带标签
定义:为布尔值 (true/false) 定义更具业务含义的标签。
特点:
- 本质是布尔值,但可以赋予业务语义。
- 在 规则设计器中可显示为“是/否”、“开启/关闭”等。
示例:客户激活状态
- 域名称:
ActiveStatus - 类型:
boolean **true**的标签:"ACTIVE"**false**的标签:"INACTIVE"
应用:约束 Customer.isActive 属性。
类型域 (Type Domain) - 隐式
定义:虽然不常被称为“域”,但 BOM 中的数据类型本身也是一种域约束。
特点:
String类型的域是所有可能的字符串。int类型的域是整数范围。- 这是最基础的约束。
示例:
Customer.age的类型是int,其隐式域是Integer.MIN_VALUE到Integer.MAX_VALUE。- 我们通常会在此基础上再应用一个值域(如
AgeRange: min=0, max=150)来进一步约束。
4.1.4 定制属性
在UDM 中,“定制属性 (Custom Properties)” 是指为 BOM (Business Object Model) 元素(如类、属性、方法)或规则项目本身添加的元数据 (Metadata)。这些属性不是业务数据的一部分,而是用于存储额外的信息,以支持工具功能、代码生成、决策中心展示或特定的执行逻辑。它们是扩展 UDM 功能、实现自动化和增强管理能力的重要手段。
用途
- 控制代码生成:引用系统内置属性去控制规则引擎如何生成底层 Java 代码。
- 增强展示:控制规则在业务用户界面中的显示方式。
- 标记和分类:为规则或模型元素打上标签,便于搜索、过滤和管理。
- 集成与自动化:为外部系统或脚本提供配置信息。
- 性能优化:提示引擎进行特定的优化。
最佳实践
- 命名规范:使用反向域名约定(如
com.mycompany.rules.priority)避免命名冲突。 - 文档化:记录你定义的每个定制属性的用途,供团队参考。
- 谨慎使用:特别是影响引擎行为的属性(如禁用验证),需充分理解其后果。
- 利用于自动化:将定制属性作为 DevOps 脚本或 CI/CD 流程的输入,实现自动化部署和测试。
- 与团队共享:确保所有开发人员了解并遵循相同的定制属性约定。
总结
- 定制属性只是模型的一部分,只用于配置工具和流程,也不作为业务逻辑的输入,不作用于规则运行时,因为在规则执行上下文 (Working Memory) 中,只有 BOM 定义的属性和方法是可访问的。定制属性存储在
.bom文件的元数据部分,不会被加载到运行时对象中。 - 定制属性功能对规则编排和流程影响范围,直接取决于UDM产品本身内置的属性,而不是规则开发者随意定制一个新属性能改变的。
- 如果你有一个值既想在设计时作为标记,又想在运行时被规则使用,你应该在 BOM 中定义一个正常的属性或变量集 (Variable Set),将这个属性/变量设置为所需的值,在规则中正常引用它。
4.1.5 类别
在UDM 中,“类别 (Category)” 是一个强大的组织和管理功能,主要用于在规则编排中对规则、规则集、规则流、变量集等资产进行分类、分组和过滤。它不直接影响规则的逻辑或执行,而是极大地提升了大型项目中规则的可管理性、可发现性和治理能力。
在规则项目中定义类别

在BOM中引用类别

在规则管理中心查看类别
待补充。
4.1.6 BOM到XOM映射
说明:在BOM的方法中定义一段java代码,在编译时会写入到.b2x文件中,在运行时会自动解析这段代码。

4.1.7 XOM到BOM映射
1)在IDEA中编写java类作为XOM

2)在BOM编辑器上,将XOM同步到BOM

4.1.8 变量集(Variable Sets)
变量集 (Variable Set)是规则项目内部的共享变量容器,用于在规则之间传递和共享业务数据或可配置参数,适合业务用户管理。
变量集如何创建

关于初始值问题遵循java的语法即可,基本类型直接输入值,其它的如BigDecimal应这样去初始化new java.math.BigDecimal(0)
变量集如何使用
1)在业务规则集中使用变量库

2) 对应的业务规则

3) 快速测试和验证
