写点什么

元模型驱动(一)构建元模型ーGME 入门

用户头像
KaYa
关注
发布于: 2020 年 11 月 03 日

开源地址

https://github.com/chljapan/KayaSmart


稳定的开源产品永远是我们程序员最好的选择!

GME(Vanderbilt 大学开发的一款建模产品,很多大公司都参与了资助该项目比如波音公司等)

全名 Generic Modeling Environment 我用的是 Version 1.7 x64 版本(你可以选用最新版本)。

下载地址:http://repo.isis.vanderbilt.edu/GME/old/

下面是我翻译的部分材料,水平有限,有兴趣的朋友可以查看原文:http://repo.isis.vanderbilt.edu/GME/Tutorial/index.html

下载安装后运行:

GME 其实是基于 Visual C++开发的,所以目前只能在 Windows 环境下利用,有点儿像 EMF+GMF 的综合体(说的不一定准确),它可以直接建模,也可以建立元模型,如果你对这些概念陌生,请到网上搜索相关概念。这里不做详细说明。

补足:据说 GME 考虑在以 GEMS(Generic Eclipse Modeling System)项目为基础移植到 Eclipse/EMF 里。但是 GME 原生对象元素大部分被削减,所以还处在移植阶段。最后的目标是在 Eclipse 的插件里面可以直接引入 GME 的模型文件,不过还没有实现。

生成我们的第一个范例和模型

课程 1:入门

1.1 GME 与建模步骤

1.2 制作一个元模型

1.3 制作第一个模型

1.4 完善元模型并添加图标

课程 1:入门

在第 1 课里,你将配置 GME 并绘制一个来自特殊领域的基本的图形,在接下来的课程里面,将向你展示如何扩展该项目,并提供更高级的功能。

在这个教程里面,我们将完成应用领域的网络系统,包括:路由器,网络以及电脑,和其他设备,以及这些设备之间的链接。应用领域的模型,可能和这个完全不同,但是作为一个特定领域的例子,他可能是帮助你认识建模的主要步骤和学习 GME 定制技术的最好方式。有一些章节描述了网络的细节,并以特定的方式作为在 GME 的理论背景下完成特定的任务。这些部分是以红色斜体出现的。如果你不熟悉网络,你可能会觉得他们难以理解或无关紧要。你可以随意浏览或跳过他们,并专注剩下的更多 GME 实际设计的部分。

本教程提供了足够多的信息给普通用户来理解 GME,而不必依赖于额外的文档。当然,你如果想对 GME 有更深入的了解和想学习他的所有功能,你可以参照 GME 的用户手册。

1.1 GME 与建模步骤

GME 是一个通用的,可配置的建模环境。换句话说,GME 的结构配置不是一个选项,而仅仅是开发之前的第一步而已。配置过程本身也是建模的一种形式,他是一个对建模过程的建模。这就是所谓的元建模。元建模过程的最终输出是对规则集的编译生成范例,用于配置特定应用领域的 GME。

是否每个人在使用 GME 的时候,都需要一个元建模的配置呢?当然是否定的,通常情况下,只有少数人参与元建模过程。与此相反,也有多用户配置的环境。对于这些用户,是不需要知道太多关于元建模的信息。他们看到的是已经定制了自己的图形编辑功能的图形化工具。建模集成的主要优势是用户的工作由建模环境引导。

这个教程是面向那些对定制元建模感兴趣的人群。大多数的教程内容都是专门处理元建模问题的。通常是更详细地解释定制环境的例子。谨记,元建模环境本身也是基于 GME 的。因此,尽管它是作为元模型范例,但同样也是 GME 的定制环境。你只要通过足够的练习,就可以通过元建模环境来构建你自己的模型。

1.1.1 规范

元建模专家首先需要的是一个模型应用的规范(或至少有一个模糊的概念)。对于软件开发者来说,他就是模型的需求分析文档。

它通常是用自然语言来描述。作为例子,提出了网络建模应用程序的描述如下。

我们想创建一个网络图。图将包含路由器,每个路由器有多个路由器端口,我们也有主机(如服务器)。我们想要链接路由器端口和主机形成网络。

路由器是有名称标识和家族成员组成。名字是一个字符串,家族成员是下列成员之一:”C16xx“,”C25xx”,”C36xx”或“Linux“(即我们有思科和 Linux 路由器)。端口通过端口名,IP地址,速度(以kbps为单位)和类型(HDLC,PPP或以太网)来标识。主机有名称和地址(他们都具有一个以太网端口)来标识。网络则由一个网络地址和网络掩码来确定。

1.1.2 建模方法

我们现在必须使用 GME 元建模环境中的建模概念来描述。我们使用的建模技术是众所周知的和被广泛接受的统一建模技术。特别它是 UML 类图技术的特定子集。就是说它完全符合 UML 建模语言标准。

在元建模过程中最基本的步骤包括两件事情:所有模型元素的实体,以及这些实体之间的关系。用于识别和限定某些实体和关系的信息将被作为属性分配给它们。元建模,概括地说就是将规范的概念映射到实体,关系和属性。

我们已经给出了规范。现在让我们来描述建模范例:

a. 路由器,网络,和主机可以很容易地被建模为实体。路由器端口也是一个实体,始终与路由器相关联(即端口被路由器所包含)

b. 模型将包含两种不同类型的关系:一个代表网络和路由器的端口或主机(关联)之间的连接,和一个连接路由器到其他路由器端口(容器)。容器和关联的主要区别是,容器的实体是”私有”的,而包含实体必须有容器存在。也就是包含的实体不能脱离容器而存在。

 这些实体具有特定的属性。说明中提到的所有属性,诸如名称,成员,是路由器的实体。

现实中通常需要提取客户更多想法和本质。幸运的是,在本例中的网络规范是简短而精确的。

1.1.3 GME 中的一般模型概念

GME 支持一组变化的 UMT 实体,关系,属性的通用建模概念。差异部分在名称和部分附加功能、 语义及预计将指导并简化建模过程的约束。

  • Atom(原子)是基本的有限的实体类型。名称”原子”表示他没有内部机构(即包含的对象)。模型中的每一个原子特性都包含名字,属性和他参与的关系。

  • Model(模型)是第二个泛型实体类型。他和 Atom 非常类似。主要区别在于他可以包含 Atom 以及其他模型和其他类型的对象。因此,他具有内部结构。当这些类型实体在一起的时候,他们形成树状层次结构的实体。模型可以打开,显示其内部结构图(图 1.2)。

*请注意—由于历史原因,这个词在 GME 中有双重含义:它表示完整的描述(这个建模项目)或一个模型实体位于实体层次结构的某个地方。

  • Connection(连接)是表示关系的主要概念,连接通常描述两个对象之间的关系,并且这种关系被表示为在一个特定的颜色和样式连接两个物体的线。连接也可以有自己的属性。

另外两个重要的泛型概念:引用和集合。引用是一个具有一个内置的关联为单个对象的实体。这种关联使它表现得像一个对象的指针或者别名。集合在几个类似的对象之间形成关联。集合通常被认为是集合或类别。引用和集合在后面的第 4 课中介绍。

上面列出的概念形式,用于表示实体和关系的 GME 概念的核心。他们通常被称为第一类对象,或 FCOs.在任何建模项目中他们都起到核心作用。下面列出了其他重要的 GME 概念:

  • Attributes(属性)是对应 UMT 属性的概念。属性是绑定 FCOs 和用于存储信息到 FCO 里。在 GME 中,属性可以包含文本,整数,实数或者布尔值。

  • Folders(文件夹)是一个建模项目中容器的不同部分,就像在一个文件系统里面的目录结构。文件夹是一个辅助对象(与模型相比,这个被认为是真正的建模概念),仅仅用于组织。每一个建模项目至少包含一个文件夹,称为根文件夹,位于层次结构的最顶端。对于本教程,我们只使用唯一的根文件夹。在第 5 课,我们会提供对文件夹的详细介绍。

  • Aspects(面)代表不同视图的模型结构。他并不总是有利于一下子呈现模型里包含的所有目标。包含在模型中的每个面允许我们选择我们想看到的。模型与几个面将显示其包含的实体,具体取决于所选的面的不同子集。细节详见第 5 课。

  • Constraints(约束)是应用于模型的有效性规则。他们表示 OCL 语言的谓语。约束条件不同于声明式的构成规则,导致它必须从范式定义。但是必须满足一定的模型(尽管模型还在建立过程中)。可以在线检查约束,或者在需求模式下验证。关于约束的更多信息参照第 6 课。

在元建模过程中,选择一个合适的 GME 概念(FCO),代表每个现实世界的概念出现在规范里。再确立属于 GME 的元数据类型或种类的集合。GME 每定义一组属性,构成规则,关联选项,以及约束等,这些 GME 泛型 FCO(模型,引用等等)所选实体或关联的种类(如路由器或网络连接),被称为原型(固定概念)。

1.2 制作元模型

现在元建模的理论过程被描述,让我们看看这个过程是如何实现的。你可以遵循下面的说明来创建一个网络应用程序的元模型的示例,或者你可以适应一个单独的建模课题,来开始执行自定义 GME 环境。

1.2.1 建立一个新的元模型项目


启动 GME,然后选择 “File/New Project…” 。

弹出一个对话框,择新基于范例的新项目。由于我们将要创建一个元模型,选择”MetaGME”范式。并按”Create New…”按钮。


在下一个对话框要求你指定文件存储。最简单的方式是存储在项目文件中。

单击"Next"后,一个文件对话框将询问你项目文件的名字。标准扩展名为".mga"。指定名称(如"networking.mga")然后按下 OK.看起来应该像下面这样。

弹出一个对话框,择新基于范例的新项目。由于我们将要创建一个元模型,选择”MetaGME”范式。并按”Create New…”按钮。

在下一个对话框要求你指定文件存储。最简单的方式是存储在项目文件中。

单击"Next"后,一个文件对话框将询问你项目文件的名字。标准扩展名为".mga"。指定名称(如"networking.mga")然后按下 OK.看起来应该像下面这样。

GME 现在已经创建并打开一个空项目。项目命名为”networking”的 MetaGME 范例。这个 GME 内置元建模范式将作为元建模工具使用。注意,项目并非是完全为空,他包含一个根文件夹,也叫"networking"(在高亮位置更改根文件夹名字 RootFolder  networking)。

1.2.2 生成一个范例表

右键单击浏览器窗口中的根文件夹(通常停靠在右边),并选择”Insert New Mode”中的”NewParadigmSheet”。在根目录下创建名为”NewParadigmSheet”的一个新对象。

看起来应该像下面的图。

双击打开它。在用户区会出现一个白色的窗口(图 1.1)。该窗口显示空的 ParadigmSheet 模型的内容,作为你的类(即实体)图的封闭的绘图区。窗口的标题包含以下内容:

为模型的名称提供可编辑字段,kindname 作为默认内容显示。

  • Kindname(在这里是 ParadigmSheet)

  • 为该模型提供所有有效面的选择列表,显示为当前面。

  • 该模型的基本类型,如果有的话(见第 5 课)

在接下来的时间里,这将是模型的唯一范式作业区,所以双击图标最大化或者点击 FullScreen 图标。

图 1.1 GME 元模型的空范例表

1.2.3 定义实体

确保当前的面是”ClassDiagram”模式。该”Part Browser”浏览器的左侧靠下部所显示的对象,可以插入到模型的当前面里面,将浏览器里面的”Model”拖拽到主编辑窗口里面。这就是我们的第一个实体,代表一个路由器。通过选择它,并在右侧中部的 Attributes/Preferences/Properties 上面的文本框里面输入名字”Router”,通用 GME 概念”Model”表明<<Model>>所定义的类是固定形式的路由器。因为路由器是一个模型,所以他可以包含其他对象(即路由器端口)。

接下来我们创建三个<<Atom>>类,并命名为”Port(端口)”,”Host(主机)”和”Network(网络)”。该关系将由连接实体来标识。因此我们来创建一个<<Connection>>(连接)对象,并保持默认名称"Connection"。(这是一个名字重载的例子:一个连接实体表示一种关系,在网络范式中被称为”连接”。)

到现在,我们已经有了 5 个实体,但是我们需要更多。首先,我们必须增加一些作为路由器,网络,主机和他们之间关系的基础容器。我们添加一个<<Model>>,命名为"NetDiagram"添加到元模型中。

现在我们只需要一个类:一个通用的实体,来表示”任意接连接到一个网络”(即路由器端口和主机)。但是在建模环境里不允许直接创建这个对象。因此必须给路由器端口和主机创建一个抽象的类。我们来创建一个<<FCO>>并将它命名为"NetInterface",它则代表任意的网络接口。

我们现在的范例包含所有必要的元素 7 个实体:两个模型(model),三个原子(atom),一个连接(connection)和一个接口(FCO)。

1.2.4 泛化封装和关联

下一步我们来表示实体之间的关系。关系由线来体现出来。所以我们把编辑模式切换到”添加连接”(+ )。

让我们先从网络接口开始。我们想表现端口和主机的网络接口。换句话说,他们实现网络接口。在 GME 里面表示继承接口是通过一条线穿过一个小三角形来实现的。在左侧的实体浏览器里面找到小三角形符号,将它拖到编辑区域。因为我们不会直接引用这个对象,所以它不需要特定的名字。我们点击 NetIngerface,确保光标变成(箭头+),单击三角形。你可以看到,我们的第一个连接已经建立。现在已经将三角形连接到子类。仅仅通过点击三角形就做到了这一点。这告诉 GME 哪个对象是基类,哪个是继承的派生类。我们现在已经有了一个 UML 泛型关系,就像图 1.2 所示。

路由器包含端口,这将是我们要实现的第二种类型关系。UML 符号是一条连接对象到其容器的连线。用小黑点作为容器的终点。容器比继承更容易,它不涉及三角形。先单击对象(注意,仍需要在添加连接的模式下),和第二个容器。每当你的光标是可以连接的候选对象的时候,该对象的边缘会变成红色,而且,当光标靠近对象边框的一个侧面的时候,一个小红点将会出现在边线的中心位置。这表明用户能够执行连接操作到该边框的连接线的位置。如果你选择了侧面创建连接,GME 就会从该侧面画线连接,即使对象在其他方向。如果你点击对象的中心位置,那么 GME 总会找出最佳路径完成连接。在靠近所包含的类的连线一端,显示”0..*”。现在让我们离开这里。

不要忘记,我们还有很多的约束关系要定义:路由器,主机和网络封装在 NetDiagrams 中。GME 必须把这些关系(或连接)包含于某个地方,所以添加一个连接和 NetDiagrams 之间的包含关系。这段话可能有些难于理解,我找不到更好的解释。

如果我们在元模型里封装的连线看起来像图 1.2 里面那样,那么我们已经可以准备接下来的第三个和最后一个类型的关系:关联。

我们已经定义好了关联类,”Connection”,但是我们仍然需要指明这个关系可以关联的对象。这是关联类和关联的两个端点,我们需要一个对象来帮助我们,一个黑色的小圆点(●),必须使用它。我们把它从左侧的组件浏览器中拖到作业区域。连接源是路由器端口和主机。但是,我们只能为每个连接指定一个源,我们可以通过他们共同的基类 NetInterface 来避免两个源的这种情况。连接 NetInterface 到连接点。我们可以看到在 NetInterface 结束的位置显示角色”src”,和多重性”0..*”。

现在指定目标:先点击连接点,然后点击”Network”类。连接类"Connection"是第三种关联关系。当这个类连接到连接点(以任意顺序),GME 会显示一个窗口,询问并让你确认这种关系的作用。在这里我们选择"Association Class"(关联类)。

现在我们已经定义了所有三种基本的 UML 关系:泛型,容器和关联。(图 1.2)

图 1.2 类图中的实体与关系

1.2.5 访问属性窗口

这个 UML 类图看起来已经准备的差不多了,但是还有一件事要做。

属性/偏好 窗口位于右下方,并显示用户当前选择对象的首选项和属性。这个窗口有三个窗体。选择"Attributes"选项卡以显示属性。这里显示的是源范例的实体属性列表:

  • 抽象(布尔型):抽象实体只是用作归纳其他(非抽象)实体。他们不能被建模对象实例化,目的只能用于元建模。我们已经创建了一个抽象的实体,NetInterface。实体与<<FCO>>原型必须总是设置成抽象的,因为 FCO(第一类对象)本身就是模型,原子,连接和集合的抽象概括。

  • 根文件夹(布尔型):根文件夹可以包含模型(和其他文件夹,我们将在后面看到)。通常情况下,不是所有的元模型都包含在一个文件夹中。在当前情况下,我们只希望把 NetDiagrams 放在根文件夹中。路由器不应该被放置在那里,因为他们必须始终被分配给一个 NetDiagram。

  • 一般参数(文本):这是一个包罗万象的地方,在这里我们可以指定各种附加选项。在以后课程的实例中我们将会提到。

  • 图标名和端口图标名(字符串):原子和模型可以在建模环境中显示自定义图标。此外,端口(可以连接到实体意外的容器,包含对象)可以在观察父类图标时显示为小图标。这些都是作为端口图标的一个单独的指定属性。

  • 名称位置(选项列表):默认对象的物理位置名称以及图标。

 注意:连接有几个额外的属性有关的线条式样和标签。有关详细信息,请参阅用户手册。


属性的默认值在模型的范式里定义(元建模范式就是这种情况)。如果没有其他明确规定,将启动默认值。属性的名称和其值显示灰色。直到用户改变这些属性的默认值。幸运的是,大多数的默认值都是不需要修改的。在我们的例子中我们只改变一个属性值” In root folder?”(即询问是否将 NetDiagram 实体放在根文件夹下)。我们想表明的是网络图可以在根文件夹中直接创建。参照以下步骤(图 1.3):

1.单击"NetDiagram"实体,在属性窗口中显示其属性。

2.找到"In root folder?"属性,选择它,然后单击右侧的方框箭头。在出现的列表中选择"True" 或 "False".

3.选择"True"后,该属性将显示黑色,表明属性现在用我们自己设定的值来代替默认设置。

4.离开属性窗口,保存模型的变化。

图 1.3 属性对话框

如上所述,关系实体还可以拥有属性。虽然这个功能很少使用。但这个例子里,这个操作是一个关键步骤,如果遗漏你将没有办法显示路由器的端口。我们需要元模型是包含关系的属性。打开连接的属性窗口,通过选择"Attributes"从它的上下文菜单(确保你点在连接线上)打开。打开路由器和端口之间的连线属性。改变属性"Object is a port?"的值为"True".这告诉 GME 路由器的端口对象从他的父模型是可见可访问的。关系属性窗口也控制关联的端点名称和多样性或者基数。(后者将在第 6 课解释说明)

元模型的 UML 类图部分已经完成,但模型的其余部分还需要进一步调整。其余的信息可以使用 newParadigmsheet 对其他三个方面进行配置:可视化,约束和属性。(在本教程中,将不会定义约束,所以这方面将被跳过)


1.2.6 创建一个面

模型必须包含至少一个面。切换元模型到"Visualization"模式(这里是区别元模型和模型之间最好的地方:在元模型的可视化模式允许为我们的应用程序定义面)。将一个"Aspect"拖到范例中。命名为"Connectivity"来区别于其他面。在后面我们将创建其他的面。

面是一种类型的集合:面所包含的对象被称为其成员。切换到"Set Edit"编辑模式()。右键点击之前创建的面,然后在范式的其他实体上单击左键。结果如图 1.4 所示(你也可以包含 NetInterface 抽象基类,而不需要包含类)。

图 1.4 在元模型中定义面

我们加入面的设置,表明每一个给定变化实例的实体在这个面是可见的。我们还必须表明这个面包含两个模型。包含关系将做到这一点:切换到"Add Connection"(添加连接)模式,并创建封装面的路由器和 NetDiagram 模型连接。

我们已经成功地创建了一个面,由于模型仅包含一个面,所以可能很难理解为什么这一步是必须的。我们将在第 5 课里面详细介绍面的作用。

1.2.7 属性的详细说明—注意这里说的是属性实体

这将是最后一个重要的步骤,切换到"Attributes"面。(前面已经讲过)

属性实体的数据字段。规范中提到的数据字段,例如名称,类型,IP 地址和速度。在配置网络建模环境中,将像图 1.3 中一样访问对象的属性。它显示了元模型类的一个 UML 属性。(确保你理解元模型实体属性和元建模定义属性实体之间的差异。)

在标准 UML 类图中,属性是定义在矩形的下半部分。GME 还需要显示类图上的属性,他们在一个单独的面里面定义,关联关系(有点像 UML 容器)分配属性到类。也正因为如此,你会在后面的建模过程中体会他给我们带来的好处。

让我们开始为路由器实体创建属性。

1.根据前面红色字体定义的规范,我们知道路由器有两个属性,名称和成员。在 GME 中,所有对象都具有一个自动生成的名为”Name”的字符串属性。这是一个内置属性,作为实体的标识符(有时明确唯一性)。在这种情况下,路由器的名称满足这些标准。因此,只有一个属性”Family”,需要明确定义。该规范提供了一系列枚举型成员选择,所以这个属性是<<EnumAttribute>>。我们把这个对象拖到范式中,并将其命名为”Family”。

2.通过上下文菜单,打开属性对话框(即一个 EnumAttribute 元实体属性)。在对话框中显示的所有选项都会在下面列出简要说明,对于”Family”属性的正确值为:

 可视(boolean 布尔型):指定属性是否在属性对话框中可见。通常他作为缺省值”true”(真)。

 全局范围(Boolean 布尔型):大多数的属性都是在全局范围内定义。但是有些时候(例如:一个大型的元模型)实体特定的属性是偏好设置。现在我们不是这种情况,所以默认选项”true”是合适的。

 提示(string 字符串):规定属性对话框中显示提示。默认情况下是没有任何指定时,它将提示实体的名称。这里的最佳选择就是”Family”。

帮助(string 字符串):当用户选择或编辑该属性时,使指定的字符串显示在属性窗口的状态栏中。

  • 菜单项(多行字符串):该选项只适用<<EnumAttribute>>属性实体。属性的有效选项是列。在文本区域输入选项规范(”C16xx”,”C25xx”,”C36xx”和”Linux”)。确保每一个选项占一行。对于未知类型,你可以添加一个额外选项”Other” 。

  • 默认菜单项(string 字符串):这里<<EnumAttribute>>的默认值是列,将其设置为”Other”。

另外两种类型属性是, <<FieldAttribute>> 和 <<BooleanAttribute>>,有以下选项

o 数据类型(枚举):字符串,整型或双精度型

o 默认(字符串):为属性默认值

o 行号(整数):输入间隔的高度(总是 1 或 1 的整数倍)

o 默认设置为”True”(布尔):<<BooleanAttribute>>默认值设定

Family 属性已经全部定义,它还需要应用于元实体,给它们建立关联。切换到” "Add Connection”模式(✙),连接新的属性到路由器实体。一个属性可以通过绘制多个连接到不同的实体(一对多的关系)。我们的例子里只用于路由器。

现在,我们可以以类似的方式定义其他属性。一般来说,大多数设置都可以选择默认值,除了<<FieldAttribute>>,将<<EnumAttribute>>的属性菜单项里面所有数据类型设置为默认值。

创建步骤:

  • 一个名为"IPAddress"的<<FieldAttribute>>属性

o 数据类型: 字符串

o 默认值: 0.0.0.0

o 连接到端口和主机元实体(或者我们利用泛型关系连接 IP 地址到 NetInterface 元实体,将属性添加到两个端口和主机。)

  • 一个名为"IFSpeed" 的<<FieldAttribute>>属性

o 提示: "Speed (kbps)" (这将指示正确的单位给用户)

o 数据类型:双精度型

o 默认值: 0.0

o 连接到端口元实体

  • 一个名为" IFType " 的<<EnumAttribute>>属性

o 菜单项:"Ethernet", "HDLC", 和 "PPP"

o 默认值:上面菜单项里的任意值

o 连接到端口元实体

  • 两个名字分别为"NetworkAddress" 和 "NetMask"的<<FieldAttribute>>属性

o 数据类型: 字符串

o 连接到 Network 元实体

o 人们通常会把网络信息表记为"192.168.2.80/255.255.255.240" 或 "192.168.22.80/28"类提供网络名称。现在忽略其他属性选项。稍后,我们将自动生成网络名称插件。(参见第 10 课)注:原文提示第 10 课,貌似没有。

这个属性面的元模型看起来应该像图 1.5

图 1.5 属于元模型的面

1.2.8 编译元模型并安装范例

现在让我们把元模型转化为 GME 的范式。点击图标工具栏里面的齿轮图标()。点击 OK 配置面映射对话框,在下一个对话框中选择模式的 XML 文件位置。

如果元模型没有错误,在最后一个对话框显示模式已经生成,并询问时候要注册。在使用范例之前,必须进行注册(名称和属性必须注册到 Windows 的注册表中),所以选择 OK。

虽然理论上没有你要,但是一个好的主意是在保存文件之前,测试你的范例。如果你正在使用数据库,则没有必要进行这一步。因为所有的编辑都是立即执行的。如果你的工作是基于文件模型,GME 提供了在你退出之前自动保存你的工作内容。然后,系统崩溃和其他不可预见的问题,仍然可能会导致数据丢失。

1.3 创建第一个模型

从菜单里面选择"File/New Project..."来启动一个新的 GME 项目。这是会出现熟悉的对话框(这是 GME 的一个重要特征,用户只要学习一种方法就可以建元模型和模型)。安装范例,”networking”应该出现在模式列表中。选择这个模式,并起一个适当的文件名如”mynetwork”。

新模型的屏幕看起来像图 1.1,除了跟对象是现在的”mynetwork”,或是你使用的其他文件名。右键单击根对象,插入模型 NetDiagram,打开。浏览器现在显示主机,网络和路由器。创建一个主机(Host)和一个网络(Network)。分别起名为”mailhost”和”localnet”。接下来在连接模式下测试连接:连接 mailhost 到本地网络。现在测试这个属性:mailhost 有一个 IP 地址,localnet 有一个网络地址和子网掩码.,配置的建模环境真的可以知道该做什么。

现在让我们看看路由器的行为模型。创建一个路由器并命名为”inetgw”。其 Family 成员属性设置为四个选项里面的一个:以”C23xx”为例。路由器需要端口,所以双击它,可以访问其内部结构。我们现在可以从左侧的浏览器为其添加端口。为这个路由器添加三个端口。名称分别为:E0,E1 和 S0。E0,E1 位于窗口左侧,S0 位于右侧。关闭 inetgw 窗口,路由器现在有三个端口。连接 E1 到”localnet”。

让我们尝试欺骗一下 GME,连接 E0 到”mailhost”。结果它无法正常工作,这种类型的连接在范例中是不允许的。我们甚至都无法连接到网络的主机。因为默认连接未指定反方向(从网络到 Netinterface)连接。

我们还没有连接到 E0,S0 的任何对象,所以现在还不能连接他们。我们的第一个元模型建立的第一个范例,看起来像图 1.6 那样

图 1.6 初版网络模型

1.4 完善元模型添加模型图标

到目前为止,我们对于定制模型环境的能力和我们投在制作元模型的工作量并没有达到预期效果。这是因为,一开始的部分总是最难的,元建模和实例项目通常遵循增量改建的原则。这种完善工作被重复多次,形成一个循环,它包括以下步骤:

1.编辑元模型 2.重新编译并进行注册 3.升级完善范例版本并应用到新示例 4.测试/使用模式的增强功能改善示例应用程序。

这个过程被证明可以显著提高元模型,在新用户环境下最容易出现抱怨的恐怕是乏味的可视效果。我们可以通过指定丰富的图标来为我们的组件解决这个问题。

首先我们必须建立位图(每个对象和两个用于端口的一大一小图标)。位图必须是 BMP 格式。如果你像我一样不是一个好的电脑艺术者,你可以使用下面的位图。


图标文件可以存放在任何地方,但最好的办法是在你的范例文件夹下建立一个名为”Icons”的子目录。在"Edit/Project Properties..."对话框里(注:原文的标注是错误的可能是旧版本的遗留原因),你可以找到范例文件的位置。如果图标被设置成不同的路径,你需要分别设置图标路径,过程如下:

当创建你自己的文图的时候,这里需要考虑几点:

  • 由于路由器模型将显示店口,最好设置路由器图标的大小不小于默认模型大小--110 x 70 像素,这样才能给端口留下足够的空间。

  • 两一方面小端口图标的像素必须不能大于 10 x 10 像素。

我们现在必须指定图标的归属。关闭模型并打开元模型。从类图的面里面打开属性对话框为每个实体自定义图标。对主机,网络和路由器,输入图标的名称。端口作为路由器的端口是可见的。所以为标准图标名称"Icon name"和更小的图标名称"Port icon name"的设置我们自己的图标名称。如果所有的图标都在相同的目录中,那么这里只需要文件名(包括扩展名)就可以,否则你需要输入包含路径的文件名。因为可以在图标路径中指定完整的图标路径(在下面描述)。

重新编译并注册,注册一个新版本的模型不会删除以前注册过的版本,所以现在的模型将继续使用先前注册的版本。然而新模型会利用新的注册范例来创建。

可以用不同的方法将现有的模型升级到新范例:

  • 打开一个模型时,如果之前使用的模式有变化,GME 会尝试提供升级低版本的模式。这个操作可能会发现两者的模型数据结构不一致。当然这要看变化的具体类型和规模。还好,这个问题并不算严重,我们只要回到原始的范式版本就可以。对于属性,命名或者偏好的微调,这种快速升级技术通常可以很好的工作。

  • GME 提供了更为强大的 XML 格式的升级功能。所有这些都通过单一的命令,在菜单选项"File/Update through XML..."里面进行导入,导出和升级模型。(XML 的升级包含一些局限性,在第 7 课里面会介绍)

现在的升级模型马上就可以显示出我们的自定义图标。如果没有,系统可能没有找到图标目录。为了纠正这个问题,打开"Tools/Options..."对话框,在图标目录"User Icon Path"的字段里面添加图标目录(如果图标保存在旁边的子文件夹"Icons"里面,我们不需要做任何事,这要归功于一个特殊的目录"$PARADIGMDIR\Icons",它通常位于系统图标路径)。

上述的模型升级过程,可能会重复多次以完成对范例的修改以及修正错误。一旦完成满意的模型范例,我们就可以创建真正的图,想吐 1.7 里面的小型局域网络。

图 1.7 一个小公司的典型网络图


我们完成了模型的初次构建!!休息一下吧。

发布于: 2020 年 11 月 03 日阅读数: 162
用户头像

KaYa

关注

MDA元模型驱动 2019.04.14 加入

模型驱动布道

评论

发布
暂无评论
元模型驱动(一)构建元模型ーGME入门