包是UML中管理元素的有效手段,UML中的所有元素均隶属于某一个包,即使你没有指定元素所属的包,这些元素也会被置于一个默认包中,包的本质是命名空间。当我们在一个包中需要访问另一个包中的元素时,可以使用符号“::”逐级引用。

例如在下图所示的包图中,存在两支包含多个层次的包,如果包A3中的元素需要访问包B3中的元素C,则可以使用B1::B2::B3::C的形式达到目的。



不同包中的元素进行交互是常态而不是偶发现象,使用符号“::”引用其他包中的元素,特别是在包的层级较深时,元素前面会有长长的由“::”连接的包路径。对人类而言,这种冗长的形式无论是书写还是阅读都是一项具有挑战性的工作,它影响的不只是效率,可读性也大打折扣。为解决这个问题,UML提供了包导入的机制,例如在上面这种情况下,我们可以将包B3导入到包A3中,其图形化表示如下图所示。导入关系使用由导入包发出终止于被导入包的虚线箭头表示,并需要标注“<>”标签。



一旦包B3被导入包A3中,包B3就如同成了包A3的一个虚拟的子包,在遵循可见性规则的前提下,包A3中的元素就像使用子包中的元素一样使用包B3中的元素。在下图中,使用虚线在包A3中描画包B3,表达了这种虚拟的关系。



注:关于UML中可见性的说明,可参见文章《修饰符》中“可见性修饰符”部分。

包的设计本质上应有其内在逻辑含义,但客观上它也是解决命名冲突的一种手段,而通过import向一个包导入另一个包时,如果被导入的包中与当前包中存在同名元素就会产生名称冲突。在这种情况下,被导入包中的冲突元素将被忽略而不被导入,如果需要使用这个产生冲突的元素,我们将不得不继续使用“::”的形式来进行意图表达。这就正如当前包中的元素与子包中的元素名称产生冲突时一样。

如上文所述,将一个包全部导入到另一个包中可能会产生诸如名称冲突或其他潜在问题。如果一个包只使用另一个包中一个或少数几个元素,更好的做法是仅导入那些我们需要的元素。例如包A3仅需要使用包B3中的元素C,则在导入时,可仅导入元素C,在图形描画上,导入箭头直接指向元素C即可,如下图所示。



仅导入需要的元素时,将只有被导入的元素可直接使用,而那些与被导入元素位于同一包的其他元素对当前包则需要继续使用符号“::”引用。在上述示例中,被导入的元素C在使用逻辑上也如同直接在包A3中定义一样,而元素D则是包A3之外位于其他包中的一个普通元素。



仅导入特定元素降低了导入产生潜在问题的可能性,但是也有可能被导入的元素与当前包中的元素碰巧产生了冲突。例如我们要在包A3中导入包B3中的元素C,但包A3中已经包含了一个名为C的元素,导入产生名称冲突。此时,我们可以使用“<> 别名”的形式为导入的元素指定一个别名,在下图中我们使用“<> E”为包B3中元素C指定了在包A3中的别名E,即在包A3中,我们可以使用E代表包B3中的元素C,而使用C时则指包A3中的元素C。



上述对import的说明重点在import使用和细节上,但其实<>表明两个包之间的依赖关系。而包之间的常见依赖关系除导入(import)外,还有访问(access)。访问表明当前包依赖使用被访问的包。例如包B需要使用包A1,则通过由包B出发终止于包A1的并带有标签“<>”虚线描画表示。

在下图中,同时描画了包之间的import和access关系,包B访问包A1而导入包A2。



在UML的场景下,包B中的元素使用包A1和A2并无二致,我们可将包A1与A2均视为包B中虚拟的子包,但这两种依赖关系的效果有一个明显的区别,即“<>”所引入的包A2在包B中的可见性可视为public,而“<>”所表明依赖的包A1在包B中的可见性为private。如果进一步探究这种差异,可以尝试令包C通过“<>”依赖于包B,由于包A1在包B中的可见性为private,故包A1在包C中不可见,而包A2在包B中的可见性为public,故包A2在包C中也等价于被导入,可直接使用。其虚拟效果如下图所示:



在编程时包之间的依赖关系如果设置有误,往往会在程序编译与运行时发生异常,UML仅通过图形表达相关关系,不同UML工具对依赖的检查并不一致,所以需要仔细检查确认。

参考文献:

1.《OCUP 2 Certification Guide_ Preparing for the OMG Certified UML 2.5 Professional 2 Foundation Exam》 Michael Jesse Chonoles

2.《OMG Unified Modeling Language (OMG UML) Version 2.5.1》

UML之包的导入与访问的更多相关文章

  1. [UML]UML系列——包图Package

    系列文章 [UML]UML系列——用例图Use Case       [UML]UML系列——用例图中的各种关系(include.extend)       [UML]UML系列——类图Class   ...

  2. 01Spring_基本jia包的导入andSpring的整体架构and怎么加入日志功能

    1.什么是Spring : v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:u ...

  3. UML之包图

    包图是UML中用类似于文件夹的符号表示的模型元素的组合,系统中的每个元素都只能为一个包所有,一个包可嵌套在另一个包中,使用包图可将相关元素归入一个系统,一个包中包含附属包.图表或单个元素.简单的来说, ...

  4. java:包、继承,访问修饰符

    包 包(package) 用于管理程序中的类,主要用于解决类的同名问题.包可以看出目录. 包的作用 [1] 防止命名冲突. [2] 允许类组成一个单元(模块),便于管理和维护 [3] 更好的保护类.属 ...

  5. python—day15 包的认识、执行顺序、执行流程、循环导入、包的导入、绝对、相对导入

    一.包的认识   包通过文件夹来管理一系列功能相近的模块 ​ 包:一系列模块的集合体 重点:包中一定有一个专门用来管理包中所有模块的文件 包名:存放一系列模块的文件夹名字 包名(包对象)存放的是管理模 ...

  6. day 16 包的导入

    包的认识 '''包通过文件夹来管理一系列功能相近的模块​包:一系列模块的集合体重点:包中一定有一个专门用来管理包中所有模块的文件包名:存放一系列模块的文件夹名字包名(包对象)存放的是管理模块的那个文件 ...

  7. DAY16 模块和包的导入

    一.包 1.包的定义 包:就是一系列模块的结合体 2.重点 1.包中一定要有一个专门来管理包中所有模块的文件 2.包名:存放一系列模块的文件夹名字 3.包名(包对象)存放的是管理模块的那个文件的地址, ...

  8. Day 16 模块和包的导入

    包的认识 包通过文件夹来管理一些列功能相近的模块 包:一系列模块的集合体 重点:包中一定有一个专门来管理包中所有模块的文件 包名:存放一系列模块的文件夹名字 包名(包对象)存放的是管理模块的那个文件地 ...

  9. python基础(12)-包的导入&异常处理

    包的导入 几种导入方式 import 包名 import time time.time() import 包名,包名 import time,sys time.time() sys.path from ...

  10. Hibernate初探之单表映射——jar包的导入

    编写第一个Hibernate例子需要的基本步骤 创建Hibernate的配置文件 创建持久化类 创建对象-关系映射文件 通过Hibernate API编写访问数据库的代码 使用版本:Hibernate ...

随机推荐

  1. windows下安装部署 hadoop

    一.安装下载 1.首先在hadoop官网下载一个稳定版本,选择binary包 官网地址:https://hadoop.apache.org/releases.html 下载下来是tar.gz文件,用w ...

  2. 云原生周刊 | 使用 ChatGPT 协助解决 Prometheus 告警

    开源项目推荐 kubernetes-chatgpt-bot 这是一个适用于 Slack 的 ChatGPT 机器人,只要有监控告警发送到 Slack 频道中,你就可以通过机器人向 ChatGPT 咨询 ...

  3. WEB渗透01_渗透测试方法论

    前言 这个系列是根据一个网络安全教程学习的笔记. 1 渗透测试 渗透测试,是为了证明网络防御按照预期计划正常运行而提供的一种机制.不妨假设,你的公司定期更新安全策略和程序,时时给系统打补丁,并采用了漏 ...

  4. Cartographer学习——地图概率更新过程

    前言:最近一直在研究建图,对google的开源SLAM框架 Cartographer 进行了源码梳理,发现很多巧妙的算法设计,结合原论文 <Real-time Loop Closure in 2 ...

  5. 工作中的技术总结_ form表单使用注意事项之form触发后台提交事件 _20220127

    工作中的技术总结_ form表单使用注意事项之form触发后台提交事件 _20220127 如无必要不要使用 form标签 来作为组件的父节点 事件过程: 项目使用的是 spring + jsp 的框 ...

  6. fiddler限速配置&mock配置

    一.限速配置 1.开启性能选项 2.找到对应的参数入口 3.修改对应的从参数 解释下 这2个参数是如何做到限速的 4.request-trickle-delay(上传数据限制) 默认值是300,他的意 ...

  7. 本地文件包含漏洞详解与CTF实战

    1. 本地文件包含简介 1.1 本地文件包含定义 本地文件包含是一种Web应用程序漏洞,攻击者通过操控文件路径参数,使得服务器端包含了非预期的文件,从而可能导致敏感信息泄露. 常见的攻击方式包括: 包 ...

  8. PostgreSQL加密连接SSL配置

    PostgreSQL加密连接SSL配置 环境说明 操作系统 主机名 IP 类型 说明 CentOS Linux release 7.6.1810 (Core) centos7.6 192.168.1. ...

  9. 痞子衡嵌入式:在i.MXRT启动头FDCB里配置串行NOR Flash多个寄存器的注意事项

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在FDCB里配置串行NOR Flash多个寄存器的注意事项. 关于使用 i.MXRT 启动头 FDCB 来设置 Flash 内部寄存器, ...

  10. Python中函数或者类对象带()与不带()的区别——闭包和函数返回时的常见现象

    Python中函数或者类对象带()与不带()的区别-----闭包和函数返回时的常见现象 - 函数不带括号时,调用的是这个函数本身 ,是整个函数体,是一个函数对象,不需等该函数执行完成,返回一个已定义函 ...