每一个DSL的核心都是一个域模型,它定义了这一语言所代表的各种概念,以及这些概念的属性和它们之间的关系,在创建DSL每一个元素时都是使用域模型来描述。域模型还为语言的其他方面的建立提供了基础:图形符号、工具箱、资源管理器、属性窗口、验证、序列化和部署、代码生成等的定义。在MetaModelEngine:元模型引擎开发思路中介绍总体思路,本篇着重考虑一下域模型定义相关内容。
模型架构图
GOPRR为元元模型层、领域概念为元模型层、产品规格为模型层、实例为系统应用层。对于域模型定义,我们主要关注GOPRR这一层。
域模型概念:GOPPRR
- Graph 图:一个独立模型,通常使用图来表示,我们还支持列表和矩阵两张表格方式的展现
- Objects 对象:域类
- Property 属性:图、对象、端口、角色和关系都可以拥有一些属性描述
- Port 端口:定义角色如何连接对象的可能语义
- Relationship 关系:域关系
- Role 角色:连接关系与对象之间
属性和非属性对象
元模型对象分为属性和非属性对象,非属性对象都可以定义多个属性对象。Graph、Object、Port、Role和Relationship都是非属性对象。它们的属性定义如下:
对象 | 属性 | 附加信息 | 说明 |
Property | Name | 名称 | |
Ancestor | 父属性 | ||
Project | 域模型基于存储库管理,这里指定所属项目 | ||
Datatype | String | 字符串 | |
Text | 文本备注 | ||
Number | 数字 | ||
Boolean | 布尔 | ||
Createion Timestamp | 生成日期 | ||
Collection:Item type | 集合类型,指定集合项类型,可以为String、Graph...、Object...、Port...、Role...、Relationship… | ||
Graph… | 弹出选择【图形】对象对话框,选择项目中的一个图形对象 | ||
Object… | |||
Port… | |||
Role… | |||
Relationship… | |||
Widget | Input Field | 输入框 | |
Editable List:Values | 列表编辑 | ||
Fixed List:Values | 枚举值 | ||
Default Value | 默认值 | ||
Value Regex | 正则检查串 | ||
Description | 描述 | ||
Object Relation Role Port Graph 的基本信息 | Name | 名称 | |
Ancestor | 父对象 | ||
Project | 所属项目 | ||
Properties[] | Local name | 属性作为公共对象存储,在对象本身中引用后可以设定属性在本对象中显示的名称 | |
Unique? | 是否唯一 | ||
Description | 描述 |
图形对象
在MetaEdit+中式通过如下窗口进行定义的:
它们之间是通过一个叫做绑定Bindings的虚拟对象关联起来的。在绑定中可以包含多个关系,每个关系可以包含两个或更多的角色,每个角色可以包含多个对象,关系如下图所示:
注:图中还可以定于约束,这个在现阶段不考虑。
域关系
图形对象由Relationship、Roles、Objects三种对象组成,关系链接多个对象,关系与关系之间不进行连接:
- 关系是有方向的
在图中绑定设置中定义关系时,每个关系都是有先后顺序的,定义是第一个Role为关系的源,也就是我们画关系时连接的第一个对象代表的Role,其他顺序依次类推。
- 重数(Cardinality)
对于关系绑定中对于Roles,我们可以指定重数(1,0..1,0..N,1..N),如下图所示:
欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ]