(转)uml 静态视图依赖
· 依赖
依赖表示两个或多个模型元素之间语义上的关系。它只将模型元素本身连接起来而不需要用一组实例来表达它的意思。它表示了这样一种情形,提供者的某些变化会要求或指示依赖关系中客户的变化。
根据这个定义,关联和泛化都是依赖关系,但是它们有更特别的语义,故它们有自己的名字和详细的语义。我们通常用依赖这个词来指其他的关系。 表 4–3 列出了 UML 基本模型中的一些依赖关系。
依赖关系 |
功能 |
关键字 |
访问 |
允许一个包访问另一个包的内容 |
access |
绑定 |
为模板参数指定值,以生成一个新的模型元素 |
bind |
调用 |
声明一个类调用其他类的操作的方法 |
call |
派生 |
声明一个实例可以从另一个实例导出 |
derive |
友员 |
允许一个元素访问另一个元素,不管被访问的元素是否具有可见性 |
friend |
输入 |
允许一个包访问另一个包的内容并为被访问包的组成部分增加别名 |
import |
实例化 |
关于一个类的方法创建了另一个类的实例的声明 |
instantiate |
参数 |
一个操作和它的参数之间的关系 |
parameter |
实现 |
说明和对这个说明的具体实现之间的映射关系 |
realize |
精化 |
声明具有两个不同语义层次上的元素之间的映射 |
refine |
发送 |
信号发送者和信号接收者之间的关系 |
send |
跟踪 |
声明不同模型中的元素之间存在一些连接,但不如映射精确 |
trace |
使用 |
声明使用一个模型元素需要用到已存在的另一个模型元素,这样才能正确实现使用者的功能(包括了调用、实例化、参数、发送) |
use |
表 4–3 依赖关系种类
跟踪是对不同模型中元素的连接的概念表述,通常这些模型是开发过程中不同阶段的模型。跟踪缺少详细的语义,它特别用来追溯跨模型的系统要求和跟踪模型中会影响其他模型的模型所起的变化。
精化是表示位于不同的开发阶段或处于不同的抽象层次中的一个概念的两种形式之间的关系。这并不意味着两个概念会在最后的模型中共存,它们中的一个通常是另一个的未完善的形式。原则上,在较不完善到较完善的概念之间有一个映射,但这并不意味着转换是自动的。通常,更详细的概念包含着设计者的设计决定,而决定可以通过许多途径来制定。原则上讲,带有偏移标记的对一个模型的改变可被另一个模型证实。而实际上,现有的工具不能完成所有这些映射,虽然一些简单的映射可以实现。因此精化通常提醒建模者多重模型以可预知的方式发生相互关系。
导出表示一个元素可以通过计算另一个元素来得到 ( 而被导出的元素可以被明确包含在系统中以避免花费太多代价进行迭代计算 ) 。导出、实现、精化和跟踪是抽象的依赖 — 它们将同一个潜在事物的不同形式联系起来。
使用表示的是一个元素的行为或实现会影响另一个元素的行为或实现。通常,这来自于与实现有关的一些问题,如编译程序要求在编译一个类前要对另一个类进行定义。大部分使用依赖关系可以从代码中获得,而且它们不需要明确声明,除非它们是自顶向下设计风格的系统的一部分(如,使用预定义的构件或函数库)。特别的使用关系可以被详细说明,但是因为关系的目的就为了突出依赖,所以它常常被忽略。确切的细节可以从实现代码中获得。使用的构造型包括调用和实例。调用表示一个类中的方法调用另一个类的操作;实例表示一个类的方法创建了另一个类的实例。
若干种使用依赖允许某些元素访问其他元素。访问依赖允许一个包看到另一个包的内容。引入依赖能够达到更高要求,可以将目标包内容的名字加入到引入包的命名空间内。友员依赖是一种访问依赖,允许客户看到提供者的私有内容。
绑定是将数值分配给模板的参数。它是具有精确语义的高度结构化的关系,可通过取代模板备份中的参数实现。使用和绑定依赖在同一语义层上将很强的语义包括进元素内。它们必须连接模型同一层的元素(或者都是分析层,或者都是设计层,并且在同一抽象层)。跟踪和精化依赖更模糊一些,可以将不同模型或不同抽象层的元素连接起来。
关系(一个元关系,不只限于依赖关系)实例表示一个元素(如对象)是另一个元素(如类)的实例。
依赖用一个从客户指向提供者的虚箭头表示,用一个构造型的关键字来区分它的种类,如 图 4–11 所示。
图 4–11 依赖