UML基础与Rose建模实用教程(第三版)
上QQ阅读APP看书,第一时间看更新

2.4.2 UML的扩展机制

尽管UML已经是一套功能较强、表现力非常丰富的建模语言,但是有时仍然难以准确表达模型的许多细小方面。为此,UML的开发者们为UML设计了一种简单通用的扩展机制,用户可以使用扩展机制对UML进行扩展和调整,以便使其与一个特定的方法、组织或用户相一致。扩展机制是对已有的UML语义按不同系统的特点合理地进行扩展的一种机制。下面将介绍三种扩展机制,它们分别是构造型(Stereotype)、标记值(Tagged Value)和约束(Constraint)。

构造型扩充了UML的词汇表,允许针对不同的问题,从已有的基础上创建新的模型元素。标记值扩充了UML的模型元素属性,允许在模型元素的规格中创建新的信息。约束扩充了UML模型元素的语义,允许添加新的限制条件或修改已有的限制条件。使用这些扩展机制能够让UML满足各种开发领域的特别需要。

1.构造型(stereotype)

在对系统建模的时候,会发现现有的一些UML构造块在一些情况下不能完整无歧义地表示出系统中的每一元素的含义,因此需要利用构造型来扩展UML的词汇,可以利用它来创造新的构造块,这个新创造的构造块既可以从现有的构造块派生,又专门针对我们要解决的问题。

构造型就像在模型元素的外面重新添加了一层外壳,这样就在模型元素上又加入了一个额外语义。通常来讲,由于构造型是对模型元素相近的扩展,所以一个元素的构造型和原始的模型元素经常使用在同一场合。构造型可以是基于各种类型的模型元素,比如构件、类、节点以及各种关系等。对构造型的使用通常是使用那些已经在UML中预定义了的构造型,这些预定义的构造型在UML的规范以及介绍UML的各种书中都有可能找到。

构造型的一般表现形式为使用“<<”和“>>”包含构造型的名称,例如<<use>>、<<extends>>等。<<use>>和<<extends>>构造型的名字就是由UML预定义的。使用这些预定义的构造型用于调整一个已存在的模型元素,而不是在UML工具中添加一个新的模型元素。这种策略保证了UML工具的简单性。突出的表现在对关系的构造型的表示上。比如在用例图中,对两个用例进行关联。可以使用如图2-29所示的方式简单表示“依赖或实例化”关系。如果要使用附加的构造型,只需要用鼠标双击关系的连线,在弹出的对话框的“Stereotype”选项中选择相应的构造型即可。假设选择“include”关系,效果则如图2-30所示,在关系的表示上,只需要添加相应构造型即可。

图2-29 未适用构造型示例

构造型的表现形式并不都是使用“<<”和“>>”来表示,有的是通过图形的改变来表示的。比如,某个类,使用的构造型是“Service”,在Rational Rose中它的表示方法如图2-31所示。

图2-30 使用“include”构造型示例

图2-31 “Service”的构造型表示

用户也可以自己来定义构造型,即用户自定义构造型,其格式按照构造型的一般表现形式来表示。

综上所述,构造型是一种优秀的扩展机制,它能够有效地防止UML变得过度复杂,同时还允许用户进行必要的扩展和调整。

2.标记值(Tagged Value)

标记值是由一对字符串构成,这对字符串包含一个标记字符串和一个值字符串,用来存储有关模型元素或表达元素的一些相关信息。标记值,可以用来扩展UML构造块的特性,也可以根据需要来创建详述元素的新元素。标记值可以与任何独立元素相关,包括模型元素和表达元素。标记值是当需要对一些特性进行记录的时候而给定元素的值。

通过标记值可以将各种类型的信息都附属到某个模型元素上。如元素的创建日期、开发状态、截止日期和测试状态等。将这些信息进行划分,则主要包括:对特定方法的描述信息、建模过程的管理信息(如版本控制、开发状态等)、附加工具的使用信息(如代码生成工具),或者是用户自定义连接的信息。

标记值用字符串表示,字符串由标记名、等号和值构成,一般表现形式为“{标记名=标记值}”。各种标记值被规则地放置在大括弧内。如图2-32所示,它是关于一个版本控制信息的标记值。

图2-32 版本信息的标记值

3.约束(Constraint)

如果需要对UML构造块的语义进行扩展,就可以使用约束机制,这种机制用于扩展UML构造块的语义,允许建模者和设计人员增加新的规则和修改现有的规则。约束可以在UML工具中预定义,也可以在某个特定需要的时候再进行添加。约束可以表示UML规范中不能表示的语义关系。

图2-33 约束条件示例

约束使用大括号和大括号内的字符串表达式来表示,即约束的表现形式为“{约束的内容}”。约束可以附加在表元素、依赖关系或注释上。例如,“{信息的等待时间小于10秒钟}”。

图2-33显示了学生类和大学生类之间的关联关系。但是,要具体地表达就需要定义一定的约束条件。例如只有学生被大学录取才能被称为大学生、大学生应该是在校学习的。在定义了这些约束以后,分别加入到对应的元素中。这些约束信息能够有助于对系统的理解和准确地应用系统,因此,在定义约束信息时,应尽可能准确地去定义这些约束信息。一个不佳的约束定义还不如不去定义。

在上述情况下,约束是在图中直接定义的,不过,前文也提到,约束是可以被预定义的,它可以被当作一个带有名称和规格说明的约束,并且在多个图中使用。要想进行这种定义,就需要依赖一种语言来表达约束,这种语言被称为对象约束语言(Object Constraint Language,OCL)。下一小节来介绍这种对象约束语言。