引用:
统一建模语言(UML)是描述、构造和文档化系统制品的可视化语言[OMG03a]。
在上面的UML定义中,关键点是可视化这个词,UML是图形化表示法的事实标准,用来绘制和展示与软件(特别是OO软件)相关的图形(以及文字)。
UML是一个庞大的表示法体系,而本书并不会涵盖其所有的内容。本书重点关注UML的常用图、这些常用图中的常用特性和在未来版本中不太可能变化的核心表示法。
UML定义了各种UML简档(UML profile),这些简档专用于某些常用主题领域的表示法子集,例如对EJB使用UML EJB简档。
在更深入的层次上,UML表示法的基础是UML元模型(meta-model),它描述建模元素的语义,UML元模型主要对模型驱动架构(Model Driven Architecture,MDA)CASE工具供应商具有影响。开发者并不需要对其进行学习。
[Fowler03]介绍了三种应用UML的方式:
·UML作为草图——非正式的、不完整的图(通常是在白板上手绘草图),借助可视化语言的功能,用于探讨问题或解决方案空间的复杂部分。
· UML作为蓝图——相对详细的设计图,用于:1)逆向工程,即以UML图的方式对现有代码进行可视化,使其易于理解。2)代码生成(前向工程)。
·对于逆向工程,UML工具读取源文件或二进制文件,并生成UML包图、类图和顺序图(一般情况下)。这些“蓝图”能够帮助读者从整体上理解元素、结构和协作。
·无论是人工还是使用自动工具生成代码(例如,Java代码),在此之前绘制一些详细的图都能够为生成代码的工作提供指导。一般情况下,代码生成工具使用图生成一些代码,然后由开发者编写并填充其他代码(或许应用了UML草图)。
·UML作为编程语言——用UML完成软件系统可执行规格说明。可执行代码能够被自动生成,但并不像通常一样为开发者所见或修改;人们仅使用UML“编程语言”进行工作。如此应用UML需要有将所有行为或逻辑进行图形化表示的实用方法(很可能使用交互图或状态图),但是目前在理论、工具的健壮性和可用性方面仍然处于发展阶段。
UML和银弹思想
Frederick Brooks博士在1986年发表了一篇题为“没有银弹”的著名论文,其经典著作《人月神话(20周年纪念版)》也收录了该文。建议阅读之!该文主要驳斥了一种基本的错误认识(迄今为止,这一认识仍被无休止地重复),即相信软件中存在某种特殊的工具或技术,可以在生产率、缺陷缩少、可靠性和简易性等方面带来极大的变化。该文还指出,工具无法弥补设计上的疏漏。
然而,你会听到如下一些声明(通常来自工具提供商):绘制UML图会使事情变得更好;基于UML的模型驱动架构(MDA)工具将会打破没有银弹的论调,等等。
时间检验真理。UML仅仅是标准的图形化表示法,例如框,线等。使用常用符号的可视化建模能够带来极大的帮助,但它不可能与设计和对象思想同等重要。设计知识是极不寻常的且更为重要的技能,它并不是通过学习UML表示法或者CASE或MDA工具就可以掌握的。如果不具备良好的OO设计和编程技能,那么即使使用UML,也只能画出拙劣的设计。如果要深入了解这一主题,建议阅读“Death by UML Fever[Bell04]”(UML的发明者Grady Booch亦为认可)和“What UML Is and Isn't? [Larman04]”。
因此,本书是对OOA/D和应用UML进行熟练OO设计的介绍。
敏捷建模(agile modeling)强调了UML作为草图的方式,这也是使用UML的普通方式,而且通常对时间投入具有高回报(一般费时较短)。虽然UML工具能够提供帮助,但是建议也考虑使用UML的敏捷建模方法。
UML描述的是原始图类型,如类图和顺序图。它并没有在这些图上叠加建模的透视图。例如,同样的UML类图表示法既能够描绘现实世界的概念,又能够描绘Java中的软件类。
Syntropy面向对象方法[CD94]强调了这一观点。其主旨是,同一种表示法可以用来描述模型的三种透视图和类型(如图1-6所示)。
图1-6 UML的不同透视图
1)概念透视图:用图来描述现实世界或关注领域中的事物。
2)规格说明(软件)透视图:用图(使用与概念透视图中相同的表示法)来描述软件的抽象物或具有规格说明和接口的构件,但是并不约定特定实现(例如,非特定为C#或Java中的类)。
3)实现(软件)透视图:用图来描述特定技术(例如,Java)中的软件实现。
我们在图1-3和图1-5中已经见过这样的例子,这两幅图在描绘领域模型和设计模型时使用了相同的UML类图表示法。
在实际设计过程中,很少会使用规格说明透视图(推延了目标技术的选择,例如使用Java还是使用.NET);大多数面向软件的UML图都会采用实现透视图。
不同透视图中“类”的含义
在原始的UML中,图1-6中的矩形框被称为类(class),但这个术语包含各种现象,如物理事物、抽象概念、软件事物、事件等等。
一个方法在原始UML之上添加了另一个术语。例如,在UP中,领域模型中的UML框被称为领域概念(domain concept)或概念类(conceptual class)。领域模型表示的是概念透视图。设计模型中的UML框被称为设计类(design class),设计模型依据建模者的需要,表示的是规格说明透视图或实现透视图。
为清晰起见,本书中与类相关的术语将与UML和UP保持一致,这些术语如下:
·概念类(conceptual class)——现实世界中的概念或事物。在概念或本质透视图中使用。UP领域模型中包含概念类。
·软件类(software class)——无论在过程还是方法中,都表示软件构件在规格说明或实现透视图中的类。
·实现类(implementation class)——特定OO语言(如Java)中的类。
2004年底,UML重要的新版本——UML 2发布。本书将基于UML 2进行介绍。而且,本书使用的表示法是经过UML规格说明组的关键成员认真复查过的。
本书的主题并不是UML表示法,而是在OOA/D和相关需求分析的语境下,对UML应用、模式和迭代过程的全景揭示。需求分析通常先于OOA/D,因此,本书在开始几章先介绍关于用例和需求分析的重要主题,然后在后继各章中详细介绍OOA/D和UML。