为了使大家能够更,更加
对模型驱动方法呢有一个更加直观的了解,
下面呢给大家展示一下利用模型驱动方法做的一个
小的一个 逆向,或者说是双向工程的这么一个系统。
这呢,图中所示的这是一段 Java
代码,这段代码呢是表示 用来进行做一个
简单的一个空战游戏,这个游戏本身呢也是我们课程中的一个案例。
这个案例呢,我们将在后面几节中呢给大家介绍一下,使大家呢对
我们这个课程最后达到一个什么效果有一个大概的了解。
这一个游戏呢,我们先运行一下这个游戏我们看一下 这个大概的一个情况。
这个游戏是一个空战游戏,这个,这是一个
飞机在战斗,可以,可以
进行这个开火,
然后可以躲避,然后呢如果当生命值发生一个
变化的时候,这个到达最小的时候呢,它就会
出现一个就牺牲了这个飞机。
然后呢在这个过程中呢,飞机和飞机相撞,也会出现一些
这个同归于尽的现象,并且呢这时候呢会不断的掉下一些 油箱啊,子弹箱啊,这个生命箱之类的东西,
然后帮助这个游戏者呢可以 延长自己飞机的生命。
下面这段代码是完全用 Java
来写的, 下面呢我们就变一个相当于一个代码魔术,我们把这个代码呢
给它变成模型,之后呢我们再把模型又变回代码, 变回代码之后呢,我们看是不是能够运行。
首先呢第一步我们 将这个进行一个,我们用的这些呢都是
eclipse modeling framework
中的一些插件,我们首先呢将这个模型呢 将这个代码呢转换成一个
Java 的一个模型。
[声音]
转换完之后呢,我们会发现, Java
的模型呢,这是就是它转换这样的,这个 Java 的模型呢,是实际上与
这个刚才的 Java 源代码实际上呢是完全一样的,它只不过源代码转换
成为一种抽象语法树,这个抽象语法树呢内容非常复杂,
我们呢不可能通过这个,这种方式来直观的 看到这个模型是什么样子,那么接下来呢我们使用自己开发的一个
JMF ,这个一个转换,模型转换,把它转换成一种更加简单的一个模型,这个
模型就是我们所说的模型的模型,那么它在这个,当前的这个 模型呢,是
Java 的模型,然后我们比这个模型又抽象了一层,那就是模型的模型
的概念,但绝对不是元模型的概念。
这是我们这个 产生的这个
Java 第一个模型。
我们为了确保没有,以前没有产生,我们再重新产生一次,
discovery,
我们发现呢,确实是 新产生的,然后我们在新产生的这个模型呢,我们
把它转换成为我们能够自己开发的一个
建模工具,相当于一种私人定制的一种建模工具,这种建模工具呢是适用于
这个元模型啊,模型啊,都是适用于我们这个,非常适合于我们进行代码
逆向以及这个正向的过程。
[声音]
转换的这个过程呢,我们使用的是 模型,一种模型转换语言,是
OMG 组织提供的模型 转换语言 QVT,而 QVT 这个程序呢,
是写了大概有这么长,这个它目前这 一千多行 QVT
程序基本上呢是可以把 这个一般的这个 Java 代码,所有的这个代码都可以
这种 Java 模型转换成我们的自己定义的模型。
下面我们运行一下这个 QVT 下面我们运行模型转换,将这个
Java 模型呢转换为 我们自己定制的一种
逆向工程模型。
设置一下输入模型,输入模型我们现在已经把它复制到了当前的这个目录下,
编程,
好,这样的话呢,我们点击运行,我们发现
产生了一个 这么一个模型,这个模型怎么看呢,我们可以用我们自己
配置的一个建模工具来打开它,这个建模工具用到的技术呢是 JMF
,也是 eclipse 中的一种模型驱动的元建模技术,
可以用它来进行
配置自己定制的,根据一个
元模型,自己定制的元模型,依靠元模型来配置
支持这种元模型的建模工具。
下面呢我们运行 一下这个 case,这个建模工具。
[声音]
直接以,我们可以直接以这个 eclipse
RCP 的方式来进行运行。
[声音]
好,然后我们可以将
刚才的那个类图,我们实例化刚才
的转换的模型,然后在 game
through [声音]
art,
[声音] sample
files,out game 3,好,找到,
这时候我们就可以把它变成一种可视化的模型。
这是它的,我们发现这个 模型呢,尽管是经过了一层抽象,仍然还是比较复杂,
但是呢这是基本上涵盖了所有的我们这个刚才的 那个简单的
Java 游戏中的所有的类,以及它们相应的一些,既包括
静态结构,也包含了一些动态 的行为,全部都逆向出来了。
这是 大概的这个模型的样子,这是一些,里面的行为,也都逆向出来了。
下面呢,就我们做的这个模型, 这个
Java 3,能不能再回到代码并且能够执行呢?
下面我们试一下,在这个过程中呢,我们用到的技术呢就是 也是
eclipse 中的模型驱动的一种代码生成技术,叫
Acceleo 这个插件,我们试一下用这个方式是不是可以。
我们先把以前的删掉
我们打开这个,这个程序呢
是一种叫,也是基于,呃,基于这个一种 M2T
的一种标准,也被 OMG
组织采纳为一种标准的一种 QVT,M2T
这种标准用来将模型转化为代码,我们执行一下它看一下效果
执行的过程呢
我们把这个最后产生代码放到当前的这个目录下,
然后呢我们选择我们刚才转化出来的这个源模型, 它应该是在
transformed 中的
three [空白_录音]
trans
[空白_录音]
[声音]
[声音]
[声音] 好。
这时候呢,我们就可以
进行运行当前的这个代码生成
生成出代码基本上通过编译了
通过编译之后呢,会不会运行呢?下面也是最关键的一步
我们呢把这个,由于当前没有一些环境,就是因为它没有一些
图形库这种,我们把它放在原有的位置,把原来的这些代码删掉
然后呢我们把这个新产生的代码复制出,新产生的代码呢我们发现实际上 是非常复杂。
既有一些非常复杂的逻辑判断,也有一些 在类中嵌套的一些内部的一些类
以及静态变量,其中最复杂的这个 battlefield 这个类呢
里边的逻辑也是非常复杂,所有的这些都可以通过代码生成方式进行产生。
下面我们看 验证一下它是不是能够运行?下面我们执行一下看一下
[声音]
好,情况是非常好的,是完全
运行起来了,并且呢功能和恢复前,恢复之前的代码是一样的
它也可以具有了发射子弹 啊,然后呢来回躲避,等等一些功能
因此呢这就是通过这个小的实验,我们
可以看出模型驱动很多的一些技术 都已经成熟,并且呢已经可以应用到一些
工程上,在逆向工程或者双向工程呢,如果我们开发一些很小的一些 程序可能用不到。
但是如果我们开发几千万行代码的这种程序,逆向工程往往是 双向工程往往是是非常有用。
甚至是呢我们可以用模型驱动的方式进行 一些代码的重构