UML中的四种机制使地它简单和更易于使用,你可以在UML语言的任何时候用同样的方法来使用,这四种机制是:
l specifications
l adornments
l common divisions
l extensibility
本章讨论adornments和extensibility这两种机制。
注释是最重要的一种修饰。一个注释在UML中是一个图形符号,描述了和它相关联的元素或一组元素的限制或注释语。
上面是一个使用扩充机制的例子。<<subsystem>>是stereotype,{version = 3.2}是标记值
注释是一种图形符号用来限制或给一个元素或一组元素加上注解。注释画成一个带折角的矩形,在矩形中加上文字或图形的注解,
限制是UML元素语义的扩充,允许你对一个UML元素添加新规则或修改存在的规则。限制通常画成{}内的字符串,放在关系附近。当然,你也可以把限制用注释来表示。
1. 建模注解
使用注释的目的是为了让模型更清晰,下面是使用注释的一些技巧:
l 将注释放在你要注解的元素边上,写下注解的文字。用依赖关系的线将注释和被注释的元素连起来会让人更明白。
l 记住,你可以隐藏元素或使隐藏的元素可见。这就意味着你可以将注释不隐藏起来,而她注释的元素是可见的,这样会使你的模型图简洁,在必要的地方让注释可见。
l 如果你的注释很长或不仅仅是普通文本,你可以将你的注解放到一个独立的外部文件中(如WORD文档)然后链接或嵌入到你的模型中。
下面是一个使用注解的例子:
UML的建筑块如:类、接口、合作、组件、注释、关系等等,都在为具体问题建模的时候基本上是够用了。然而,如果你想扩展你的模型的词汇,如用来表示你的特定的问题领域,你需要stereotypes。
建立新的建筑块有如下的技巧:
l 确定没有现成的基本的UML方法可以表达你的需要。如果你碰到一个普通的建模问题,很有可能已经有某种标准的stereotype是你想要的。
l 如果你确信没有现成的东西可以表达这些语义,首先找到一个UML中的最接近你要建立的模型的元素(例如:类、接口、组件、注释、关系等等)然后为她定义一个stereotype。值得一提的是你可以定义stereotypes的层次从而得到一般的stereotypes和为它定义的特别的特性。这种方法尽量少用。
l 通过对普通的stereotype定义一组标记值和对stereotype进行限制可以实现普通stereotype不能实现的功能。
l 如果你希望这些stereotype具有不同的视觉效果,为他们定义一个特别的图标。
上面是一个例子。假如你用活动图来为一个涉及到教练工作流和队员工作流的体育活动建模。在这里,区别教练和运动员以及与其他的本领域的对象是有意义的。上面的图中有两个事物是很突出的,教练对象和队员对象。这里不仅仅是普通的类,更确切地说,他们现在是两个新的建筑块。因为定义了教练和员stereotype,并且运用到了UML的类上。在这个图上,被标记为:Coach和:Team的匿名实例,后者显示了不同的状态。
UML建筑块的基本属性如:类的属性和操作,包的内容等等,都足够描述清楚你要建立的模型。然而,如果你想扩展这些基本建筑块(或者用stereotype建立的新的建筑块)的属性,你就需要使用标记值。
下面是一些技巧:
l 首先要确定的是你的需要无法用基本的UML表达。如果你碰到一个普通的建模问题,很有可能已经有某种标准的标记值是你想要的
l 如果你确定没有其他的方法可以表达你需要的语义,添加新的属性到一个单独的元素或一个stereotype。继承的规则是适用的,也就是说对父亲定义的标记值对儿子也具有。
当你用UML建立模型的时候,你总是使用UML定义的规则,这实在是件好事,因为别的懂得如何读UML的人可以毫无偏差地读懂你想要表达的东西。然而,如果你发现你需要表达的语义是UML无法表达的或你想要修改UML的规则,这时你就需要使用限制了。下面是使用限制的一些技巧:
l 首先要确定的是你的需要无法用基本的UML表达。如果你碰到一个普通的建模问题,很有可能已经有某种标准的限制是你想要的。
l 如果你确定没有其他的方法可以表达你需要的语义,用文本的形式在限制中写下你的新语义,并且将他放在他涉及的元素附近。你可以使用依赖关系来明确地表示限制和他涉及的元素之间的关联。
l 如果你需要详细说明你的语义,你可以用使用OCL把它写下来。
下面的图是一个公司人力资源系统的一小部分:
这副图显示了每个Person可能是0个或多个Department的成员。每个Department至少要有一个Person成员。这副图进一步说明每个Department严格地有一个Person作为管理者,每个Person可以是0个或多个Department的被管理人员。所有的这些语义可以被简单的UML表达。然而,为了指出一个管理者必须也是Department的成员是多员关系所忽略的,也是简单的UML无法表达的。为了表达这种关系,你必须写下一个限制指出管理者是Department成员的一个子集。从子集到超集用依赖关系将两个关系联系起来。