在面向对象的软件开发中,如果软件
由近百个或更多对象构成,单凭简单的分析是很难理清的。同时为了利于大中型软件的维护和再使用,在具体写代码之前进行软件结构分析也是很有必要的。这就需要有一个CASE(Computer Aided Software Engineering)工具来辅助分析。而当今国际CASE工具集成了新的面向对象的设计分析方法—UML。所谓UML即统一模型语言(Unified Modeling Language)的缩写。它是运用统一的、标准化了的标记和定义来实现面向对象的软件分析和设计的一种方法。它综合了Rambaugh所提出的“对象模型技术”(Object Modeling Technique,OMT),Booch和Jacobson提出的“面向对象软件工程”(Object Oriented Software Engineering,OOSE)等设计分析方法,并由Object Management Group(OMG)于1997年底标准化了的一种新的面向对象的软件设计方法。它主要由不同定义的图表(Diagram)和关系(Relationship)构成,适用于软件分析、设计的各个方面;同时也对商务过程的管理与分析提供帮助。
这里首先得给出UML不同的标记(图表和关系)的定义。
UML的图表和关系
UML的图表可以从动态、静态和实现(Implementation)三个角度来观察、分析和表达一个模型。
1. 动态的角度是由应用图(UseCase Diagram)、顺序图(Sequence Diagram)、协作图(Collaboration Diagram)、状态图(State Diagram)和行为图(Activity Diagram)构成。应用图反映客户与系统之间的关系,比如说客户的要求,系统的响应等,它是从客户的层次来反映模型;顺序图和协作图描绘了对象执行的过程。顺序图是以时间为坐标来描绘这个过程。协作图则是按对象之间的关系来联接,并标注出这一个过程;状态图表现的着重点是对象的状态变化,比如说状态变化时需要什么条件;行为图是一种特殊的状态图,它的状态、状态变化都是发生于一个过程的内部,对于一般的状态图,更常用于表现外部(异步)触发的的状态变化。
2.类图(ClassDiagramm)是属于静态的角度。它是由类、类的属性(Attribute)、类的方法(Method)、及类与类之间的关系来反映一个模型。
3.组件图(Component Diagram)和开发图(Deployment Diagram)属于实现的角度。组件图表达了如何把类、对象集成在实际软件模块中。例如一个类,特定的数据是在执行文件中还是在动态库里。开发图从物理层次指出了系统模块之间的联系。
4.UML里的四个常用的关系(Relationship)是:
实现(Realization):代表一个类是一个新类型(stereo type)类的实现这种关系。所谓新类型即是不同于一般的UML元素,它是有自己特殊的属性和结构的元素,用于UML模型的扩展。例如Java中的Interface类是UML中未定义的,则可用stereo type来扩充。
集合(Aggregation):代表一个类是另一个类的一部份这种关系。
协作(Association):代表两个类之间的操作关系。即类与类之间可以通过句柄对对方的属性,方法进行操作。它也可连接在同一个类上。
概括(Generalization):代表一个类是其他一个(多个)类的子类。
基于UML的软件分析与设计
软件开发正常情况下按照如下步骤进行。首先是了解系统(客户)需求,其次是系统分析,再次是代码编写,最后是代码的维护和扩展。
1.系统(用户)需求
它是问题提出的过程,软件大体要实现什么功能,有什么参与者。而应用图(Use Case Diagram)所表达的正是参与者(Actor)与软件应用(Use Case),应用和系统响应之间的关系。
在了解系统需求的过程中,就可以给应用图添加上相应的Actor与Use Case。在了解系统需求的后期,则可以把不同Actor与Use Case间的关系用相应的连线连接和对连线的定义使之清晰。之后可对Use Case的系统响应进行分析,即把系统执行顺序画出来,这已经进入系统分析阶段。
2.系统分析
在这一阶段,需要把软件的功能细节化,同时考虑数据间的关系(层次),然后建立与之对应的对象,接着分析对象间的关系(即软件结构)并定义对象的属性(Attribute)和方法(Method)。常用的分析方法有流程图、泡泡图和由上到下等,但都只能反映系统的某一个方面,要把它们综合起来,即是UML的分析方法。
首先当然是对Use Case的分析,可按时间顺序,把一个个过程标注出来,并分析哪一些过程属于哪一个对象,这是顺序图。同时UseCase中还可以使用协作图和状态图。协作图是按对象之间的关系来联接,适用于时间顺序不严格的过程变化。状态图的分析重点在于状态,即数据的变化,常用于观察过程的参数和数据的变化,它在类图分析中也使用。其次是把上一步分析的过程和数据整理成对象的方法(Method)和属性(Attribute),并在类图中画出来,
每一个类即代表一个对象。对于类中的操作(Operation),还可用状态图来分析运行过程。完成类的绘制后,要把相近的类划归在一起,形成一个包(Package),接着把这些类用相应的关系(继承、接口等)连接起来。类与类之间的关系在不同的面向对象的语言中有着各自的特殊之处,但都可用UML的关系(实现、集合、协作、概括)表达出来。
最后是在基于操作系统和特定语言的基础上分析整个系统需要哪些模块,对应于什么文件(比如在Windows中exe、dll、vxd等文件),这可在组件图中标记出来。如果设计的系统模块处于不同物理层次,比如一个网络系统,有多个Server(Database server、Web server等)和多个Client,而软件模块分布在不同的Server里运行,这时需要使用开发图,分析系统在实际环境运行时模块的分布和运行条件。
3.代码编写
这一过程是把抽象的软件模型转变为具体的代码。使用CASE工具建立了相应的模型,或者说建立起一个多视角的相关数据库系统(RDMS)之后,则可使用软件直接产生基于此模型的对应代码框架(比如Java代码,见表1)。至此一个具有清晰结构的软件系统就已经有了雏形。往后的阶段只需要把某一种具体代码往框架里填充。
4.代码的维护和扩展
面向对象的程序设计方法,主要目的就是为了让程序更容易维护,扩展。为了改动和添加代码,一般情况下就得通读源代码和注释,然后才明白程序的结构和完成的功能,进而修改。但对于UML设计出来的软件,先看其模型中不同视角的图表就可以把软件结构清晰的表达出来了。
同时在建立模型时所写的文档,也会加入源代码中。另外,有的CASE工具还提供COM接口,也就是说,可以通过编程把这些工具建立的模型进行分析,输出相应的报表、文档。以上3点都说明了用UML建立模型利于软件的维护和扩展。
Rational Rose
Rational公司推出的Rational Rose 98i是目前最好的基于UML的CASE工具。它把UML和谐地集成进面向对象的软件开发过程中。不论是在系统需求阶段,还是在对象的分析与设计、软件的实现与测试阶段,它都提供了清晰的UML表达方法和完善的工具,方便建立起相应的软件模型。它有良好的界面,可通过编辑*.MNU纯文本文件,修改和定义主菜单,添加运行模块。它可生成各种代码和数据框架,如C++、Java、Visual Basic,IDL(Interface Design Language)、DDL(Data Definition Language)等。
它有Rose Script,类似Office中的VBA(Visual Basic for Application),直接调用Rose模型的对象。对于模型中需要有特定数据结构,生成Rose不直接支持的代码的程序员,可考虑用其进行模型的扩展,直接在模型中加入特定数据结构。值得补充的是,因为Rose的接口是按照Microsoft COM(Compent Object Model)的标准制定的接口,所以也可以在VB或VC++环境中编程,对模型进行数据添加。它有Add-In Manager,可把编写好的RoseScript和COM组件在Rational Rose中添加或卸出。
UML是一个普遍的、抽象的分析方法,因而并不是每个CASE工具都可能,或都需要把100%的UML集成到各自的环境中。Rational Rose中就没有行为图(Activity Diagram)。
微软的Repository
按UML来设计模型,用于生成代码只是UML的用途之一。Microsoft公司的Repository也是以UML为基础设计的一个模型(与Rose模型类似)。UML在Repository中得到充分的实际运用,在这模型上可以把不同平台、不同程序的数据交换紧密连接起来。它由四个部分组成。
1.Open Information Model(OIM):它实际上是一组元数据(Meta Data),描述了不同数据的结构和它们之间的关系,它是Repository的基础;
2.Repository Engine:以SQL Server为基础的对象管理系统,提供COM接口和SQL的API;
3.SDK和Visual Modeling Enviroment:在此环境下可以创建一个与实际开发环境相联系的模型并用此模型开发程序,Microsoft公司已经把它集成于Visual Studio 6.0中;
4.XML Interchange Format:XML是新的、将要替代HTML的下一代标示语言(Markup Lanuage),在网络里,不同Repository数据库间的数据可以变成XML的格式来交换数据,新出的Repository 2.0允许直接用XML语句来改动模型(OIM)的数据。
随着更多软件厂商对UML的关注,UML必将在更广泛的领域发挥作用,成为提升软件设计与开发效率的利器。