12.3.3.2 为非UML元模型定义Profiles

理论上,Profiles功能可以被用来定义非UML元模型的扩展,尽管该用法在实践中很少被采用。它需要实现了该元模型的工具也支持某种profile应用机制——这超出本规范的范围。如下描述了这种用法的Profile定义机制如何使用。

除了UML,Profile可以被关联到另一个遵循MOF的参考元模型。通常一个参考元模型包括引入的或自身拥有的元类。所有被profile扩展的元类必须是同一参考元模型的(直接或间接)成员。metaclassReference ElementImports 和 metamodelReference PackageImports提供两个目的:1)鉴别由profile引入的参考元模型元素和2)规定Profile的过滤规则。过滤规则决定元模型的哪些元素在Profile被应用时是可用的,哪些是被隐藏的。

注意:应用一个Profile不会改变底层模型;它是指为底层模型定义了一个视图。

通常,当应用profile时,只有引入的参考元类的实例模型元素才可见。所有其他元类的实例将被隐藏不能创建实例。缺省的,元类由参考元模型拥有的模型元素是可见的。按照包引入的缺省规则,这可以递归地适用于该参考元模型的任意子包。如果有使用metaclassReference ElementImport引入的元类,那么对应该元类的模型元素是可用的。然而,当被引用的元模型到的一个元素或包也是一个元类引用的话,那metaclassReference将阻塞metamodelReference。此时,只有那些显式的由metaclassReference引用的元素才可见,而其它的元模型包的元素将被隐藏。

如下规则用来决定当一个Profile被应用后模型元素是否可见。模型元素只有在对应的元类满足如下条件时才是可用的:

  1. 由一个显式的metaclassReference所引用,或者
  2. 被一个显式的metamodelReference所引用的包(直接或间接地)包含;除非该包的子包的其它元素显式的引用为metaclassReference,或者
  3. 被应用的profile所拥有的一个Stereotype所扩展(即使被扩展的元类自身不可见)

当Profile被应用时,所有其它的模型元素是被隐藏的。

最普遍的情形是Profile使用一个metamodelReference只引入了一个完整的元模型。此时,该元模型中的所有元素都可见。

在图12.14的示例中,MyMetamodel是一个包含2个元类的元模型:Metaclass1 和 Metaclass2。MyProfile是一个引用了MyMetamodel和Metaclass2的profile。然而,显式的Metaclass2引用的存在覆盖了该元模型引用。基于MyMetamodel将MyProfile应用到任何模型将展示Metaclass2的示例。同时,被MyStereotype实例所扩展的Metaclass1的实例也可见,但没有被MyStereotype扩展的Metaclass1的实例被隐藏。

Specification of an Available Metaclass 图12.14 可用元类规约

如果Profile P1引入了另一个Profile P2,那么所有的metaclassReference和metamodelReference关联都将在P2层次上被合并,过滤规则适用于这个联合体。

本质上,在Profile层定义的过滤规则只是在profile应用到某个模型时建议工具如何去做。

ProfileApplication的isStrict属性规定了要被严格应用的过滤规则。如果isStrict为真,那么除了profile定义的可访问的元类之外的其它元类在该Profile被应用到模型时都是不可以访问的。这禁止了规定了不同可访问元类的profiles的组合使用。

results matching ""

    No results matching ""