摘要
本文介绍了特征更新机制的主要概念。
基本概念
规格-结果 模型
在 “Spec-Result” 规格-结果范式(spec是specification 的缩写)中,一个特征完全由其规格定义,并且能够在任何时刻计算其结果。
例如,一个圆可以以圆心和半径值作为其规格,而其结果是其轮廓,如下图所示:
图1 规格/结果
规格也可以称为输入,结果也可以称为输出。
特征的规格可以是:
- 原始属性(布尔值、整数…)
- 其他特征
- 其他特征的属性
- 其他特征的"结果"
特征的结果是一个宽泛的概念:
- 对于机械特征,它是其生成的几何数据。
- 对于知识公式,它是其输出参数。
- 对于知识规则,它是脚本运行期间执行的操作
- 对于许多"结构"特征:无结果
由于特征的结果是定义该特征的应用程序的内在概念,它并未被特征建模器形式化或管理。这种分离允许将规格-结果模型视为一个其结果可以异步计算的参数化系统。
构建
构建是特征根据其规格计算相应结果的过程。此过程只能由拥有该特征的应用程序实现,并且不能直接调用。更多信息请阅读文章 “构建一个特征”1
特征在其构建过程中使用的规格,也可以是其他特征构建过程计算出的结果。例如,一个圆可以由一个长度和一个点组成,而这个点本身又是一个以坐标作为输入的特征。首先必须构建点,然后才能使用一个有效的点作为输入来更新圆。这种递归性由更新引擎管理。
更新
更新过程的目的是确保在构建过程中使用特征的规格之前,这些规格是有效的。因此更新引擎可以被看作是一个构建调度器,能够以正确的顺序启动特征网络的构建过程。
下图通过一个圆柱体说明了这个顺序。圆柱体(一个特征)由高度(实数值)和一个圆组成。而圆(一个特征)又由半径(实数值)和一个点(一个特征)组成。
图2 构建顺序
当您请求更新圆柱体时,首先更新点,然后更新圆,最后更新圆柱体。
与构建过程相反,更新不能被定制,但可以被应用程序直接调用。
更新状态
一个被更新引擎称为"最新"的特征,其结果是与其规格是匹配的。相反的状态是"过时"。
更新机制
能力与限制
更新引擎构建在特征建模器之上,因此所有特征,即使是那些从头创建的特征,都能受益于此引擎。
更新引擎在所有通过其特征建模器链接连接的特征之间创建了一个依赖关系图。因此依赖关系图的内省是完全集中化、健壮的,并且能够抵抗应用程序软件/模型的修改。
更新过程不是上下文相关的,只要应用程序的构建过程不变,它在命令中或在批处理过程中将以相同的方式工作。
更新算法
更新引擎可以概括为以下一句话:“一个特征是最新的,当且仅当其所有输入都是最新的,并且其构建过程成功”。这引出了以下三种算法:
- IsUpToDate
- Update
- Impact Propagation
IsUpToDate
IsUpToDate 算法用于检索特征的更新状态。"最新"意味着特征的结果与其规格一致。因此构建一个"最新"的特征是徒劳的,因为其构建过程将产生完全相同的结果。
一个特征处于最新状态,当且仅当:
- 它的规格是最新的
- 它已被成功构建
- 自上次构建以来,其规格未被更改
"最新"状态可以通过以下方法检索:
CATFmFeatureFacade::IsUpToDate(框架 FeatureModelerExt)DataCommonProtocolServices::IsUpToDate(框架 DataCommonProtocolUse)
Update
Update 算法用于计算特征的结果。如果特征已经是最新的,则不执行任何操作。它是将特征的更新状态从"过时"更改为"最新"的唯一方法。 Update 算法是:- 步骤1:递归更新所有规格
- 步骤2:调用构建过程
- 步骤3:将特征状态更改为最新
显然,如果任何一个步骤失败,特征将保持"过时"状态。
Update 可以通过以下方法调用:
CATFmFeatureFacade::Update(框架 FeatureModelerExt)DataCommonProtocolServices::Update(框架 DataCommonProtocolUse)
Impact Propagation
当一个特征的规格被修改时,该特征变为过时。递归地,所有以该第一个特征作为规格的特征也应该变为过时。
影响传播算法是:
- 步骤1:将特征的更新状态更改为过时
- 步骤2:递归地将影响链上特征的更新状态更改为过时
这项工作由影响传播机制同步执行,并避免了每次检索更新状态时对图的深度遍历。
在[图.2]的例子中,假设您修改了点的一个坐标。圆立即变为"过时",并且递归地圆柱体也变为"过时"。
请注意,即使规格的修改对特征的结果没有影响,整个影响关系图也将变为过时。例如[图.2],您将点的一个坐标替换为相同的值。但是尽管它们各自的结果仍然有效,圆和圆柱体还是变为"过时"。特征建模器不知道应用程序的语义。
没有办法显式调用影响传播。当修改对更新引擎可见的属性时,它将由特征建模器自动启动。
与其它特征建模器机制的集成
持久性
更新状态是持久化的,这意味着您可以保存过时的数据(并在另一个会话中更新它们)。
撤销/重做
更新是可撤销的。
如果特征结果不由特征建模器属性(这些属性也是可撤销的)持有,则由应用程序负责管理可撤销性。
实例化
创建(实例化)后,特征不是最新的,因为它从未被构建/更新过。
数据交换 (CCP/协作)
原生的特征建模器 CCP/协作实现会创建(如同实例化)过时的特征。
简而言之
本文介绍了特征更新机制的基础知识。
历史记录
版本:1 [2010年6月] 文档创建
构件示例 ↩︎