包合并

PackageMerge(包合并)是两个包之间的一个直接关系,它指示了目标mergedPackage的内容按照下面定义的规则被合并到源receivingPackage(接收包)中。这与泛化有些类似,其中从概念上源元素增加目标元素的特点到它自身的特点导致一个元素拥有这两者的特点。如同子类通常并不用它的继承特征来描绘一样,一个接收包通常也不同来自mergedPackage的被合并元素来描绘。根据模型语义,拥有显式包合并的模型和执行完所有合并后的包没有区别。类似的包含包合并的XMI文件与包合并被延展(expanded)的XMI文件在语义上是等价的。

而且,与泛化一样,包不能(直接或间接地)合并自身。

这种能力被期望用于不同包定义的元素具有相同的名称并且代表相同的概念的时候。一个给定的基础概念可以以不同的目的被合并,每个目的都定义在一个单独的接收包中。通过选择不同的接收包,可以获得一个用于特定目的的自定义概念。

因此,对接收包中所含模型元素的任意引用都意味着引用的是合并后的结果而不是接收包中包含的递进(注:接收包中的原有元素)。这可以通过图12.2中的示例说明,其中包P2定义了P1包中定义的类A的一个递进。包P2合并了包P1的内容,这意味着P1::A被合并到P2::A。包P3定义了P2::A的一个子类SubA。此种情况下,包P2中的A(P2::A)代表的是P1::A合并到P2::A红的结果而不只是P2::A递进。

注意. 如果另一个包要引入P1,那么在引入包中队A的引用只代表P1::A而不是合并的结果A

图12.2 Illustration of the Meaning of Package Merge

包合并可以被视为一个操作(自身是一个转换集合),其中要被合并的包的内容被合并到接收包的内容上。当这两个包的某些元素匹配(根据所定义的规则)时,它们的内容(从概念上)按照下面规定的包合并的正式规则被合并到一个单一的结果元素中。这个操作类似于超类中的特征“向下拷贝”到子类:完全延展的子类等价于结果包。

为了理解包合并的规则,需要区分三个不同的实体:mergedPackage(被合并包,例如图12.2中的P1)、receivingPackage(接收包,例如P2),以及合并转换的结果(也是P2)。接收包也扮演resultingPackage(结果包)的角色。这种相同模型元素的双重解释可能会使人迷惑,因此引入如下的术语以辅助理解:

  • 被合并包:要被合并到接收包的包(模型图中合并箭头所指的目的包)。
  • 接收包:这个包在概念上包含合并的结果(模型图中合并箭头的源)。然而,这个词用于指示合并转换之前的包。
  • 结果包:该包在概念上包含合并的结果。当然在模型中,它与接收包是相同的包,但这个词用于指示合并执行之后的包。
  • 被合并元素:指的是被合并包中存在的一个模型元素。
  • 接收元素:接收包中的一个模型元素。如果该元素有一个匹配(按照下面的定义)的被合并元素,这两个元素会合并产生一个结果元素(见下)。这个词用于指示合并执行之前的元素。
  • 结果元素:合并执行后的结果包中的一个模型元素。对于有匹配的被合并元素的接收元素,这是合并执行后的联合元素。对于没有匹配的接收元素的被合并元素,它与被合并元素是相同的。对于没有匹配的被合并元素的接收元素,它与接收元素是相同的。
  • 元素类型:指的是任意种类的TypedElement的类型,例如参数或结构化特征的类型。
  • 元素源类型:模型元素的MOF类型(例如分类符、关联、特征)。

本术语集基于图12.3(注意:这不是一个UML图)中模式图所表示的包合并的一个概念视图。包AB的(直接和间接)packagedElements都被合并到包B'的命名空间中。然而,需要强调的是这只是一个用于描述包合并语义的便捷视图而并不反映存储模型,也就是说,物理模型自身不会由于包合并的出现而有任何方式上的转换。

图12.3 Conceptual View of the Package Merge Semantics

包合并的语义由一组约束和转换所定义。约束规定了一个有效的包合并的前置条件,转换描述了它的语义效果(即后置条件)。如何违反了任意约束,包合并就是错误的,包含它的模型也是无效的。不同的元素元类型有不同的语义,但是一般性的原则总是相同的:结果元素不能比合并前功能减少:意思是,例如,一个接收模型元素的结果的导航性、multiplicity、可见性等等不能因包合并而减少。这带来的一个关键后果是结果包中的模型元素是接收包中相应元素的兼容扩展。

本规范只为那些在元模型中广泛应用的元素元类型(包、类、关联、属性等)显式地合并转换进行了定义,其它种类的元素元类型(例如状态机、交互)的合并语义是复杂而又领域特定的。所有其它类型的元类型元素的转换依照缺省规则:它们只是被简单地深度拷贝到结果包中。(该规则可以通过profiles或其它种类的语言扩展被特定的元类型所取代。)

results matching ""

    No results matching ""