研究了AndroMDA、Acceleo等等若干种MDA的实现,发现他们对MDA的实现,都不是我理解中的MDA,都是一种残缺不全的实现。那么我想象中的MDA应该是什么样的呢?它肯定不是那种“不用写一句代码就能实现整个系统”的空中楼阁。
因为MDA已经采用了UML2做为建模的基础(原因MDA官方网站上已经有很多论述),那么我们就得想想UML2作为进行MDA开发的第一步,它都为后序的工作带来了什么。UML2定义了十三种图,分别描述一个系统的不同的侧面,也成为了描述一个系统的需求及系统设计的基础概念。这些概念包括用例、活动、状态、类、对象、包、交互、<交互>序列、<交互>通讯、<交互>时序、组件、集成、部署。
另一方面,作为PSM,我们要实现一个系统,经常面对的概念是类、方法、属性、设计模式、架构模式、分层、扩展点,在JEE中具体一些就是Struts、Spring、Hibernate、OSGi、Geronimo等等。
那么首先作为UML2,是不是应该有充分的能力来表达这些PSM中的概念?类图可以表示出Java类的结构以及类之间的依赖关系,活动图以及交互图等等可以表达出方法的执行过程,还应该再有一些系统的方法能表达出系统架构、设计模式、分层、扩展点等等这些概念。如何表达?在“开发过程最佳实践”中应该有一些方面的方法,但是好像也不全面。
其次,如果我们能用UML2能表达出所有最终映射到PSM的概念,那下一个问题就是实现全面的PIM到PSM转换。AndroMDA只提供了根据类图、用例图、活动图生成相映Struts、Spring、Hibernate代码的功能。那么,组件图能用来干什么呢?交互图能用来干什么呢?如果不能根据这些图生成代码,那MDA定义这些图的目的是什么?如果仅仅是为了图形化展示模型,那有UML1.4就够了,UML2在语义精确性的加强又有什么意义呢。或者根据这些图生成的代码不能充分反映系统架构设计的思想,那么实施MDA的效果就要大打折扣。
因此,我理想中的MDA(及MDA实现工具),应该是能够实现系统业务模型(PIM)与我们在手工开发一个系统时所常用的概念进行很好的映射的一种技术。应该能够充分的分解需求分析、架构设计、概要设计、详细设计、实现等系统开发的各个阶段。而不是简单的从模型到代码两步操作。