UML之包的导入与访问
包是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之包的导入与访问的更多相关文章
- [UML]UML系列——包图Package
系列文章 [UML]UML系列——用例图Use Case [UML]UML系列——用例图中的各种关系(include.extend) [UML]UML系列——类图Class ...
- 01Spring_基本jia包的导入andSpring的整体架构and怎么加入日志功能
1.什么是Spring : v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:u ...
- UML之包图
包图是UML中用类似于文件夹的符号表示的模型元素的组合,系统中的每个元素都只能为一个包所有,一个包可嵌套在另一个包中,使用包图可将相关元素归入一个系统,一个包中包含附属包.图表或单个元素.简单的来说, ...
- java:包、继承,访问修饰符
包 包(package) 用于管理程序中的类,主要用于解决类的同名问题.包可以看出目录. 包的作用 [1] 防止命名冲突. [2] 允许类组成一个单元(模块),便于管理和维护 [3] 更好的保护类.属 ...
- python—day15 包的认识、执行顺序、执行流程、循环导入、包的导入、绝对、相对导入
一.包的认识 包通过文件夹来管理一系列功能相近的模块 包:一系列模块的集合体 重点:包中一定有一个专门用来管理包中所有模块的文件 包名:存放一系列模块的文件夹名字 包名(包对象)存放的是管理模 ...
- day 16 包的导入
包的认识 '''包通过文件夹来管理一系列功能相近的模块包:一系列模块的集合体重点:包中一定有一个专门用来管理包中所有模块的文件包名:存放一系列模块的文件夹名字包名(包对象)存放的是管理模块的那个文件 ...
- DAY16 模块和包的导入
一.包 1.包的定义 包:就是一系列模块的结合体 2.重点 1.包中一定要有一个专门来管理包中所有模块的文件 2.包名:存放一系列模块的文件夹名字 3.包名(包对象)存放的是管理模块的那个文件的地址, ...
- Day 16 模块和包的导入
包的认识 包通过文件夹来管理一些列功能相近的模块 包:一系列模块的集合体 重点:包中一定有一个专门来管理包中所有模块的文件 包名:存放一系列模块的文件夹名字 包名(包对象)存放的是管理模块的那个文件地 ...
- python基础(12)-包的导入&异常处理
包的导入 几种导入方式 import 包名 import time time.time() import 包名,包名 import time,sys time.time() sys.path from ...
- Hibernate初探之单表映射——jar包的导入
编写第一个Hibernate例子需要的基本步骤 创建Hibernate的配置文件 创建持久化类 创建对象-关系映射文件 通过Hibernate API编写访问数据库的代码 使用版本:Hibernate ...
随机推荐
- DNShell
DNShell 一款基于DNS C2隧道的反弹shell工具. 支持 功能: 支持DNS-recordA-直连型 的C2隧道. 目标: Windows下基于Powershell的反弹. Linux下基 ...
- (系列十)Vue3中菜单和路由的结合使用,实现菜单的动态切换(附源码)
说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发). 该系统文章,我会尽量说的非常详细,做到不管新手.老手都能看懂. 说明:OverallAuth2 ...
- ATC:多快好省,无参数token reduction方法 | ECCV'24
来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: Agglomerative Token Clustering 论文地址:https://arxiv.org/abs/2409.11923 论文 ...
- layui laydate日期时间范围,时间默认设定为23:59:59
在Layui中,如果你想设置日期时间选择器(datetime)的默认结束时间为当天的23:59:59,你可以使用如下代码(红色部分): laydate.render({ elem: '#test10' ...
- 基于sqli-labs Less-7 的sql高权读写注入详解
1. MySQL高权限读写简介 1.1 前置知识 数据库的高权用户对服务器上的文件进行读取写入操作,从而可以进行写入一句话木马来获得服务器权限或者读取服务器上的配置型文件等注入行为. select l ...
- FPGA开发中的复位问题
一.为什么需要复位? 在FPGA上电时,需要对reg.fifo等器件进行复位,以确保系统处于已知的状态,同时可以通过复位清除系统的错误异常状态. 二.复位的方式 从是否与时钟同步与否可以分为异步复位和 ...
- 大便系统怎样安装RPM包
alien包转换工具 如果我们有很喜欢的RPM包,而又没有deb版本. 怎么办~? 可以同过alien来转换或者直接安装,这个小家伙可是个很方便的东西! 基本命令如下: 首先通过apt-get ins ...
- Git Flow开发分支管理
Git Flow Git Flow 是一种基于 Git 版本控制系统的分支管理模型,定义了一套严格的分支命名和操作规范 主要包括以下几种分支类型: 主干分支(master):始终保持稳定,只包含经过充 ...
- 初识cuda一文通
cuda学习博客 本文为本人cuda学习过程中的记录和理解,多参考@谭升等大佬前辈的博客,以及NVIDIA官方文档.如有错误烦请指正,如有侵权请联系删除. 0. 并行计算与计算机架构 计算机架构是并行 ...
- Slate文档编辑器-WrapNode数据结构与操作变换
Slate文档编辑器-WrapNode数据结构与操作变换 在之前我们聊到了一些关于slate富文本引擎的基本概念,并且对基于slate实现文档编辑器的一些插件化能力设计.类型拓展.具体方案等作了探讨, ...