您的问题可以从两个层面回答:概念和实施。我不确定您要寻求哪方面的帮助,因此我将尝试涵盖两者。如果其中任何一个是多余的,请道歉(希望两者都不是!)。
首先:对于您给出的示例,将类图称为“模型”并将对象图称为该模型的实例会更正常。严格来说,“元模型”用于描述依次具有实例的模型。我会在下面坚持使用您的术语,但可能值得注意。
概念层面
我所说的“概念”是指回答“根据元模型验证模型意味着什么”这个问题?
答案很简单。元模型是一个模式或一组规则,用于定义构成有效模型的内容。 xml 提供了一个很好的例子。 xml 模式定义了某些主题的结构和规则:允许哪些类型,它们可以具有哪些属性,一个属性是否可以具有多个值,一个属性可以包含的可能值的集合。等等。当且仅当它不违反架构中定义的任何规则时,xml 文档才符合架构。
推广到模型:模型符合其元模型当且仅当它不违反元模型中定义的任何规则。
实施级别
您没有详细说明“API”的用途。可能您最简单的解决方案就是使用 xml:元模型就是 xml 模式,而模型是符合这些模式的 xml 文档。然后,您的“实现”将只涉及选择众多验证 xml 解析器库之一并从您的客户端代码中调用它。
但是你提到了 EMF,所以也许你需要使用它。为简化起见,假设我们要定义一个元模型,如下所示:
Class Dog {
name: String
gender: String
owner: Person
}
Class Person {
name: String
address: Address
dogs: Set<Dog>
}
EMF 提供了一个 API - eCore API - 用于定义这些东西。可以把它想象成 java 的反射 API。您可以通过创建 eCore API 的实例(以编程方式或通过其中一个编辑器)来定义元模型。所以你会创建:
-
EClass 的两个实例(一个用于人,一个用于狗)
-
EAttribute 的六个实例(每个属性一个)
-
EReference 用于 Class.owner,EReferences 用于 Person.dogs 的集合
等等。 eCore API 还提供了使用 API 创建模型实例的能力。 (如果需要,它还会为您自动生成一个编辑器,以便在 Eclipse GUI 中创建实例)。您还可以阅读各种具体语法的模型实例。如果您正在阅读的模型不符合元模型,EMF 将引发异常。
对不起,如果有点长。如果需要,有一篇很好的文章 here 会更详细地介绍示例。
编辑
对修正问题的补充:
主题是根据他的元模型验证一个实例
使用 Magic Draw 创建。
好的。我对 MagicDraw 的导出功能了解不多,但如果它可以导出 ecore,那应该是一个不错的起点:
- 将类图(“元模型”)导出为 ecore 并加载到 EMF 中以创建模型。这应该很简单。
- 同样将对象图导出为 ecore 并加载,让 EMF 在加载时验证。如果您需要添加进一步的验证,@Charles 的帖子提供了指向 EMF 验证框架的良好链接。
如果您有很多工作要做,可能值得投资EMF book。它不是最容易获得的,但它确实提供了对 EMF 的各种元素的良好覆盖。
hth.