1、第八章 共用机制(Common Mechanism)1、 引言 共用机制是 UML 里适用于各种建模元素的公共建模方法 UML 的共用机制包括四类 : 规格说明 修饰 公用划分 扩充机制 UML 的共用机制适用于 UML 的所有的建模元素 这使得 UML 模型 易于理解 易于使用 本章介绍其中的两种 修饰和扩充机制。 UML 是用来交流的 它提供了一系列的建模元素,描述软件系统的各方面的特性,通过用 UML 为软件系统建模,可以达到为软件系统进行说明、视化、建造、建档的目的 UML 用图形化、标准化的方式,为软件生产相关人员提供了一种交流的媒介,从这个意义上说 UML 是一种语言 作为语言,
2、其内容是不断的发展的 可能不断产生新的 词汇 概念、 语法规则 UML 在这方面也是类似的。 UML 提供了一系列的图形化的标准建模元素 可用于描述软件系统的大多数侧面的特性 但也有可能在某些情形下,由于应用领域特殊性 标准的 UML 建模元素 无法完整而准确地描述软件系统的分析和设计 这时,需要对 UML 的标准建模元素进行扩充 以提高模型的表达能力 UML 的修饰和扩充机制就是为这个目的而设置的。 标注 标注是 UML 修饰机制的一个重要组成部分 当用 UML 的各种建模元素为软件系统建模时 将遇到关于这些建模元素的复杂的语法、语义、原理、约束、注释等 这些内容对表达问题的某一方面很重要
3、但又无法通过标准建模元素被完整地表达 这时 可以使用标注 对这些建模元素进行附加说明 例如 在使用序列图来描述一组对象间的交互时 其中的消息的语义、语法无法在消息的名字字串内完整地表达 可以用标注的方法进行直观的说明。 对于类、模型包、部件等,也可能遇到类似的情形 因此也可以用标注的方法进行补充说明 标注的手段不是软件建模独有的,在其它工业建模领域,标注也是大量存在的 例如,在电子线路图上,可以通过标注对电路的电气特性进行说明。 除了标注之外, 变体 标记值(tagged value) 约束(constraint) 也是 UML 扩充机制的组成部分 变体 它用来扩充 UML 的词汇 有时,UM
4、L 的标准建模元素 不足以对现有的问题领域进行描述 例如:在描述交互中的各对象时 如果只用类来对它们进行抽象 将不足以表示某一组不同的类的特殊性质 这时 需要对类进行细分 于是产生了系统作用者的概念。 系统作用者本身属于类 但它又是一种特殊的类 代表系统之外但又与系统交互的一类对象, 因此把它们特别地标识出来 变体就是 类似于已有的 UML 建模元素 但又对特定的问题领域具有特殊含义的新的建模元素。 任何一个 UML 建模元素都有其标准构成 例如,对类来说,名字、属性、操作就是它的三个基本构成 如果在建模的过程中,出于某种原因 需要增加一个新的构成以表达建模元素的某种特性,就可以使用 标记值
5、例如:如果对软件系统中的同一个类,需要标识它在不同版中的定义,就需要为类开辟一个新的构成,这构成可以用名为 version 的标记值来表达。 每一 UML 标准建模元素都有明确的语义 约束 可以用来对建模元素的标准语义进行扩充 例如 双向的关联关系及其角色名和重复度描述了类之间的对应关系 如果需要在此对应关系上在增加同一角色的多个重复对象中的排序关系, 可以在这关联关系上加一 “有序”的约束 以表达这关联关系的新规则。 扩充机制为 UML 提供了用于定义特定问题领域的 UML 建模元素的手段 但此手段不应被滥用 以避免产生大量的“方言” 以至于使交流无法进行 因此,扩充机制必须有控制地被使用
6、通常,在建模时 应尽量使用标准的 UML 建模元素 当必须进行扩充时 首先要选择 UML 推荐的标准扩充。2、 概念和定义(1)、标注(Note) 标注的定义 在 UML 中, 标注被定义为 UML 的一个图形表示,它用来描述对一个或一组 UML 建模元素的 约束或注释 标注可以作用于任何 UML 建模元素(如:类、对象、关系、消息等) 用于对此建模元素的各方面的特性作补充说明 可以用标注来捕获设计分析过程中产生的假设和决定。 标注的内容对被标注的建模元素没有任何语义上的影响 它只起到增强模型的可读性的作用 UML 对标注的内容不作任何限制,它 可以是普通的文本, 也可以是形式化的描述 如果工
7、具支持的话 标注还可以包含网络链接 标注的内容不宜过长 如果有很长的内容需要通过标注表达的话 可以把内容存放在一个分开的文件内 在标注内则放置对此内容的引用。 标注的图形化表示 在 UML 里,标注被图形化为一个折角矩形 矩形的内部放置标注的内容 标注和被标注的建模元素之间用虚线连接 一个标注可以为多个建模元素作标注(图 8.1)。(2)、变体 UML 已经提供了标准的建模元素用于软件系统的建模 在对软件系统进行分析和设计时 可以用这些建模元素对软件系统的动态行为和静态结构进行建模 但在各种不同的应用领域,往往有可能出现 用现有的建模元素无法充分表达所需内容的情况 这时 需要在现有的建模元素的
8、基础上进行扩充 产生对特定建模问题特有的建模元素 这种建模元素就是变体 变体(stereotype)的定义 在 UML 中, 变体(stereotype)被定义为是对 UML 词汇(建模元素)的扩充,用来描述和已有的 UML 建模元素类似,但又对特定的问题领 域有特殊意义的建模元素。 当在 UML 模型现有的标准建模元素的基础上创建其变体时 此变体就变成了一个新的 UML 建模元素 这个新的建模元素 除了和最初的建模元素类似之外 它可以有自己的 新的构成(用标记值表示) 新的语义(可用约束表示) 和自己的标识符(文本的和图形化的) 变体的图形表示 变体的标识可以采取两种形式: 记名的变体(na
9、med stereotype) 和变体的图标形式(stereotyped element as icon) 具名变体 是在 UML 模型中变体最简单的表达形式 它保留了原建模元素的图形化表示 而用变体名来修饰原建模元素的名字 以使变体在图形化表示上区别于原建模元素。 在创建一个变体时,必须为其指定一个名字 当变体的标识采用具名变体的形式时, 在原建模元素的图形表示的名字的上方 放置用双尖括号()扩起来的变体名(图 8.2)。 变体还可以使用自己的图标 用来代替原来的建模元素的图形化表示 这就是变体标识的图标形式。(3)、标记值 任何一个 UML 标准建模元素都有其基本构成 例如,对于类而言,它
10、的三个基本构成是:名字、属性、操作。 在特定的情形下,将有必要在建模元素的基本构成之外再增加一些构成, 此构成就是 标记值(tagged value)。 例如:可以在类上在增加一个名为 version 的标记值,用来表明词类的定义对某一特定的软件版本有效。 标记值的定义 在 UML 中,标记值被定 义为是对 UML 建模元素的构成(property)的扩充,用于 为此建模元素增加新的规格说明。 标记值和类的属性不同 属性定义的是被建模的事物的构成 而标记值定义的是建模元素本身的构成 就这个角度而言,标记值可以看作是 UML 的元数据 。 标记值必须是具名的,此名字应有合法的取值 如果把类的属性
11、看作标记值的话 此标记值的名字就是“属性(attribute)”, 而类的属性的定义的集合,就是“属性”这个标记值的取值。 标记值的图形表示 在 UML 里,标记值被图形化地表达为一个字符串 此字符串用花括弧括( ) 起来 被放置到原建模元素的名字的下方 标记值的字符串由标记值的名字、取值、及分隔符组成。 名字位于字符串的起始,取值位于字符串的尾部,它们之间用等号分隔。在不引起混淆的情况下,标记值的名字可以省略。(4)、约束 和标记值对 UML 建模元素的构成进行扩充类似 UML 提供了对 UML 建模元素的语义进行扩充的机制 这机制被称为约束。 约束的定义 在 UML 里,约束用来扩 充 U
12、ML 建模元素的语义,以便增加新的规则或修改已有的规则 在 UML 里,每一个建模元素都有明确的语义 语义规定了用建模元素为软件系统建模的规则 如果在建模时,有些特定的规则不包含在现有的UML 语义内 可以用约束对建模元素的现有建模规则进行扩充。 约束为对应的建模元素规定了一个条件,对于一个完备的模型而言,此建模对象必须使该条件被满足。 约束的图形化表示 在 UML 里,约束被图形化为一个文本串 此文本串被括在一对花括号内, 并被放置在被约束的建模元素附近 例如,通常,关联关系只表示两个类之间的语义连接,而在图 8.4 中,需要表示用继承关系实现的多个鼠标工具的切换。 这时,任何时刻,指向它们
13、的基类的指针只和一个导出类相关连 为了表达这种情形,这些关联关系加以约束(or),以表示任意时刻,类CmainFrame 的关联角色 m_pCToolBase 或者和 CtoolZoom 关联,或者和 CtoolPan 关联。3、标准扩充 UML 的扩充机制应有节制地使用, 以避免避免产生过多的“方言”而影响 UML 交流功能的发挥。 为此,UML 提供了一些标准的扩充元素,称为 标准扩充(standard elements) 标准扩充可适用于大多数软件系统的建模 因此在建模时,通常应 优先使用这些标准的扩充元素 其次再考虑设计自己的扩充元素 下面就是常用的一些 UML 标准扩充:(1)、文档
14、 文档(documentation)是一个标记值 可以用于所有的 UML 建模元素。 其取值可以是对此建模元素的 注释 描述 或解释 在一些工具里 此标记值不通过标准的标记值的图形表达法显示 而是在其用户界面上用一个标准窗口来显示(图 8.5) 。(2)、标准变体 UML 是一个通用的建模语言 它的建模对象不仅仅局限于软件系统 在用 UML 进行软件系统的分析设计时, 需要对这些建模元素的语义进行强化 这如同在人类的自然语言在不同的专业领域有不同的专业术语一样。1)、系统作用者 系统作用者(actor)是在进行软件系统的用例分析时必须用到的 系统作用者的定义 系统作用者是类的变体,代表位于系
15、统之外,但又和系统相关联的对象 系统作用者的图形表示 UML 用一个人形图符表示系统作用者 可以用系统作用者代表。 软件系统的使用者 位于系统之外的软件系统、硬件系统2)、控制类边界类实体 UML 对软件系统的分析和设计是从软件的体系结构出发的。 在对软件体系结构的四个视图(用例视图、逻辑视图、部件视图、分布视图)进行分析和设计时 需要对 UML 的进行语义的强化。 这时可以使用 控制类 边界类 实体类 他们是对这种强化的标准概括 它们都是类的变体。 控制类(control class) 控制类代表一类控制或启动交互的对象。 它的行为通常都是针对于一个特定的用例, 它的对象一般只存在于此用例的
16、协同中。 例如 在窗口操作系统中 对话框内的控制钮就可以用控制类来建模。 其它的诸如 操作系统命令窗口 设备控制器等 也是控制类的建模对象 控制类的图形化表示 在 UML 里,控制类被图形化表示为一个带有箭头的圆圈。 边界类(boundary class) 边界类的定义 边界类代表处于系统边界上,不但和系 统内部对象交互,而且又和系统外部的系统作用者交互的一类对象。 例如: 软件系统的通用外部设备 如打印机 显示器 键盘及其驱动软件等 可以用边界对象建模。 边界类的图形化表示 边界类被图形化描述为带有 T 形连接的圆圈。 实体类(entity class) 实体类的定义 实体类是一类被动的对象,它本身不会启动交互,可以参加多个用例的交互,并且存活于任何单独的交互之外。 通常,软件系系统中的 文件 数据库等, 可以用实体类建模。 实体类图形化表示 实体类被图形化描述为和一条短直线在底部相切的圆圈。4、建模指南 在使用 UML 的标注和扩充机制进行建模时,应注意的一条重要原则是: UML 建模的目的是交流 因此, 可以充分利用标注的强化模型的可读性的功能 通过标注对建模元素的语义进行直观的解释和说明 标注内可以包含任内容 甚至可以以包含图形 如果标注内容较长 则可把内容存放在一个分开的文件内 在标注上指明此文件的位置。