1
面向对象软件工程实践指南
1.2.8.2 8.2 正向工程与逆向工程
8.2 正向工程与逆向工程

8.2.1 正向工程与模型驱动的体系架构

正向工程(forward engineering)是通过到实现语言的映射而把模型转换为代码的过程。通过正向工程可以实现从建模到代码的连接和过渡。许多工具提供了正向工程的支持。

长久以来,在软件工程领域有一个梦想,那就是仅仅通过构造模型而不用编写代码就能完成软件开发。随着许多技术包括中间件、UML、XML、软件框架、设计模式、正向工程等的发展,我们向这一目标不断前进。

模型驱动体系架构(model driven architecture,MDA)是由对象管理联盟(Object Management Group,OMG)提出的一个构想,目的是将目前的开发行为提升到更高的抽象层级——分析模型级,把针对特定计算平台的编码工作交由机器自动完成,这样的情况下,业务逻辑与实现技术实现了解耦,两者相对独立变化,因此模型的价值被最大化(见图8-1)。

MDA在目前技术的基础上,分离出了两个抽象级别的模型:平台无关模型(platform independent model,PIM)和平台相关模型(platform specialize model,PSM)。PIM是一个纯粹的不考虑实现技术的分析模型,而PSM可以视为一个基于特定实现技术,比如J2EE的设计模型。工程师们只需要建立表达业务逻辑的PIM,从PIM到PSM以及至代码实现都是由第三方的自动化工具来完成的(见图8-1)。

图8-1 模型驱动体系架构

为了实现MDA,OMG制定了一系列的标准:

(1)UML:UML被MDA用来描述各种模型。它是MDA的基础。

(2)MOF:无对象工具(meta object facility,MOF)是比UML更高层次的抽象,它的目的是为了描述UML的扩展或者其他未来可能出现的类UML的建模语言。

(3)XMI:XMI(XML-based metadata interchange)是基于XML的元数据交换。它通过标准化的XML文档格式和DTDs(document type definitions)为各种模型定义了一种基于XML的数据交换格式。这使得作为最终产品的模型可以在各种不同的工具中传递。

(4)CWM:公共仓库无模型(common warehouse metamodel,CWM)提供了一种数据格式变换的手段,在任意级别的模型上都可以使用CWM来描述两种数据模型之间的映射规则。

UML、MOF、XMI、CWM等一系列标准分别解决了MDA的模型建立、模型扩展、模型交换、模型变换这几个方面的问题。OMG试图通过标准化的定义,扩大MDA的应用范围。同时通过这样一个可扩展的建模语言环境,IT厂商可以自由实现自己的建模语言,以及语言到可执行代码的映射。

针对MDA的思想,目前不少厂商已经推出了一些工具。然而,目前离OMG的最终构想还存在一定的差距。

8.2.2 逆向工程

“逆向工程”的起源是对硬件产品的分析。人们通过分析竞争对手的硬件产品以便改进自己的产品,或者仿照对手的产品。这个概念应用到软件系统时,指的是人们利用方法获得对软件系统及软件系统结构的理解。对一个硬件系统实施逆向工程,一般是为了得到这个系统的复制品;而对一个软件系统实施逆向工程,通常是为了获得对这个系统在设计层次上的理解,以便于系统的维护、巩固、移植。

在基于模型进行软件开发的过程中,需要通过正向工程生成代码框架,在编写代码的过程中可能会对原来的代码框架进行修改,这些修改会导致模型与代码的不一致,因此,需要通过逆向工程再次生成模型,从而保证模型与代码的一致性。

近几年来,开放源代码逐渐成为一种趋势,为了达到软件架构和设计模式的复用,从源代码中获取软件设计模式和架构模式也将成为广泛的需求,逆向工程就是一种有用的方法。