在DSM:使用MetaEdit+编写Family Tree Modeling Language中介绍了MetaEdit+的一个家族树模型语言应用示例,通过示例的学习掌握了基本的概念,本篇将介绍一下OpenExpressApp的元模型引擎MetaModelEngine的应用思路。
为何借鉴MetaEdit+思想
我在软件产品线工程方法 - 四个主要方法原则提到产品线带来的几个好处:减少成本,快速上市,减少风险和提高质量,这些都是我们在做软件产品时都期望达到的。在我以前blog中也有一个软件工厂的图,该图表明了模型驱动开发是支持软件产品线工程的一种方法,所以我会比较关注模型驱动开发。
在信息系统开发平台OpenExpressApp - 总体架构的由来中我讲到过MetaEdit+是全球DSM领域内著名的产品,它能够带来产品线中期望的几个好处:
- 缩短上市时间,开发生产力能够提高5-10倍
- 开发人员可以集中设计和关注业务功能,而不必用代码去写所有方面的内容
- 由于使用的是经过验证的工具,产品质量显著提高
- 可以完全控制模型和代码生成,而不像MDA方法模型和代码生成固定,不便于特定领域开发
通过以上说明可以看出,我借鉴MetaEdit+的思路是想采用一种模型驱动开发方法来支持产品线工程。
元模型引擎对OpenExpressApp平台的支持
知道MetaEdit+已经好多年了,之前也研究过这个工具,并查看过它的一些资料,也是在OpenExpressApp计划之中的重要组成部分。
- 支持OpenStudio的图形化建模,让业务人员能看、能做,符合OpenExpressApp让业务人员编写软件的价值主张,通过业务人员更早更多的参与,可以更快的构建应用
- 支持OpenTool的工具:快速原型开发工具、图形化自动化测试工具等
Visual Studio的DSL架构
- Microsoft.VisualStudio.Modeling:域模型框架时整个系统的核心,负责管理模型的元素和连接,也就是域类和域关系的实例。
- Modeling.Disgrams:设计界面框架建立在域模型框架之上,它负责处理图形符号的显示,包括处理图表、图形、连接器和装饰等元素在设计界面上的显示
- Modeling.Validation:验证框架负责执行关于模型元素和连接的验证方法,如果验证失败,它还要负责创建错误对象。它与Shell框架交互,把错误信息显示到Visual Studio的错误窗口
- Modeling.TextTemplation:模板引擎负责执行文本模板来生成代码或其他的工件。模板引擎室一个独立的组件,用于执行来自非DSL的模板输入
- Modeling.Shell:建模用的Shell负责管理将涉及器集成到Visual Studio中,例如处理工具窗口和菜单名利,以及文件的打开和关闭等
对MetaEdit+的技术借鉴
- 组件架构图
MetaModel实现步骤:图形编辑器(Diagram Editor)-> 矩阵和列表编辑器(Matrix和Table Editor)-> 代码生成器
- 模型架构图:GOPRR为元元模型层、领域概念为元模型层、产品规格为模型层、实例为系统应用层
- 元模型概念GOPPRR:图、对象、属性、端口、关系、角色
- Graph 图:一个独立模型,通常使用图来表示
- Objects 对象:图的主要元素,例如例子中的Person
- Property 属性:图、对象、端口、角色和关系都可以拥有一些属性描述
- Port 端口:定义角色如何连接对象的可能语义
- Relationship 关系:让对象连接在一起
- Role 角色:连接关系与对象之间
- 属性和非属性
- 图的组成
- 绑定Binding
-
对象引用图 Decomposition
实现DSM步骤
- 设计领域概念(参考示例:DSM:使用MetaEdit+编写Family Tree Modeling Language)
- 找到领域概念
- 把领域概念映射到模型概念GOPPRR:图、对象、属性、端口、关系、角色
- 定义领域规则
- 定义规则
- 规则例子:【开始】状态不能直接连接到【结束】状态
- 画标记
- 实现生成器
主要技术及初步计划
- 元模型引擎
- 图形编辑器
- 代码生成器