首页 > 课堂 > 技术开发 > 正文

UML系列内容之十二:包图

2023-06-17 18:00:44
字体:
来源:转载
供稿:网友

今天,本号将给各位伙伴们介绍一下UML中的包图。

什么是包和包图

包是对UML中各模型元素进行组织管理的一种机制,它把概念上相似、有关联的模型元素(包括静态的和动态的)组织到一个包中,形成具有各种功能或用途的模块,并可以控制包中元素的可见性,以方便人们更好的理解复杂的系统。

包图由包之间的关系组成,通过包之间关系的描述来展现系统各个模块之间的依赖关系。

包的表示图形

它类似于操作系统中的文件夹,因此,它在UML中也使用类似的文件夹符号来表示。

UML包的表示图形

包的名称

在同一层级内,每个包应有一个与其它包不同的名称。

包的名称有两种形式:

(1)简单名称(Simple Name)

简单名称仅包含包的名称字符串,如下面的例子:

UML包的名称-简单名称

(2)路径名称(Path Name)

在很多情况下,包内又包含其它包,则在外围使用包内的某个包时可以使用路径名称来指明包的路径,其基本语法是:

外部包名称::本包名称

如下图所示的情形:

UML包的名称-路径名称2

上图中表明“Borrow”这个包位于“SystemInterface”包内。

但在Rose中使用了另外一种表示方法,即:本包名称(from外部包名称)

如下图所示的情形:

UML包的名称-路径名称

其含义是“Borrow”包是来自“SystemInterface”包内的。

包内的元素

包是一种分组机制,所以包内可以包含UML中任何元素,如类、用例、接口、组件、节点等,也可以包含其它包、用例图、协作图、序列图等。

包内元素的可见性

包中的元素可见性主要包含三种:

(1)公有的(public)

通过在元素前添加“+”符号来表示,则该元素对所有引入该包的元素可见。

(2)私有的(private)

通过在元素前添加“-”符号来表示,则该元素只能被同一个包内的元素可见。

(3)保护的(protected)

通过在元素前添加“#”符号来表示,则该元素对继承该包的包中元素可见。

下图给出了包内元素的三种可见性的表示方法:

UML包内元素的可见性

上图中的三个类“class A”、"class B"和“class C”的可见性分别是公有的、私有的和保护的。

包之间的关系

包之间的关系主要有依赖关系和泛化关系。

(1)依赖关系

包之间的依赖关系是指两个包内的若干元素之间存在着依赖。

依赖使用虚线箭头表示箭头由依赖包指向被依赖的包

下图表示的是两个包之间的依赖关系。

包之间的依赖关系

包之间的依赖关系可以是泛化、实现、导入等。

导入依赖(import dependency)是指允许一个包中的元素存取另外一个包中的元素,可以在虚线箭头上添加<<import>>构造型来表示。

在Rose中不支持给依赖添加构造型。

导入依赖不具有传递性。

(2)泛化关系

包之间的泛化关系类似于类之间的泛化关系。

包之间的这种泛化关系是指其中的特殊包可以替换一般包中的元素,并可以添加新的元素。

在Rose中不支持给包添加泛化关系,实际上包之间的泛化也是一种依赖关系。

包的构造型

在Rose中,给出了包的一些构造型,并使用不同的图形或标记来表示。

下图给出了Rose中提供的一些包的构造型。

UML包的构造型

在上图中,从上到下,从左到右分别表示业务分析模型(Business Analysis Model)、业务系统(Buesiness System)、业务用例分析模型(Business Use Case Analysis Model)、域包(Domain Package)、层(Layer)和子系统(Subsystem)。

根据需要可以选择相应的构造型,能够快速识别出包的作用。

包的设计原则

在实际建模中可以遵循以下原则:

(1)重用等价原则

对于同类可重用的模型元素尽量放到一个包中,不要把可重用模型元素和不可重用的模型元素混到一个包中。

(2)共同重用原则

把同一个应用要重用的多个模型元素放到同一个包中,以减少包间的依赖,提高包的独立性。

(3)共同封闭原则

把可能同时修改,同时维护的模型元素放到一个包中,以便于今后维护和升级。

(4)非循环依赖原则

包之间的依赖关系不要形成循环:即不要出现A依赖B,B又依赖于A的现象,或者多个包形成循环依赖。

包图建模技术

严格来讲,包图并不是真正意义上的UML图,但在模型元素分类、模型结构和程序命名空间中扮演者重要的作用。

在实际建模过程中,可以使用下面的做法来绘制包图:

(1)分析系统的模型元素,把概念上或语义上相近的模型元素纳入到一个包中;

(2)对包中的每个元素标识其可见性;

(3)确定包与包之间的依赖关系;

(4)绘制包图,并对包图进行优化。

Rose中绘制包图的方法

在Rose中的用例视图、逻辑视图和组件视图中都可以创建包。

(1)创建包

创建包可以通过以下三种方式来完成:

①使用菜单栏中的“Tools”(工具)->“Create”(新建)->“Package”(包)来创建一个包,选择该菜单后,鼠标形状将变成“+”,这时在绘图区的任意位置点击一下,则完成了包的创建。

②在左侧对象浏览器的某个节点上(如逻辑视图),右击该节点,然后选择“New”(新建)->“Package”(包),则完成了一个包的创建,如果要在绘图中使用这个包,则直接把它拖拽到绘图区即可。

③在对象浏览器和绘图区中间的工具箱中选择包工具后,在绘图区中点击一下即完成了一个包的创建。

Rose中,每创建一个包,都会在左侧对象浏览器中创建一个文件夹节点,所以,在Rose中,包更偏向于对模型的组织和分类。

Rose中包的表现形式

(2)包的重命名

在左侧对象浏览器的包上右击,然后选择“Rename”则可以对包重新命名。

也可以在绘图区的包上,右击然后选择“Open Specification...”,在弹出的如下图所示的对话框中的“Name”项中对其重命名。

Rose中包的描述

(3)设置包的构造型

右击一个包,然后在弹出的菜单中选择“Open Specification...”,则打开如下图所示的对话框,在“Stereotype”的下拉列表中选择Rose中已经设定的一些构造型。

用户根据需要也可以直接在下拉列表中输入构造型的名称。

Rose中为包设置构造型

用户输入的构造型,将以“<<用户输入的名称>>”的形式进行显示。

下面给出了用户输入的构造型的情形。

Rose中为包设置构造型

(4)给包添加元素

用户创建完包后,可以双击打开包,在包中直接建立相关模型,如用例图、状态图、活动图、类图等。

用户也可以通过下面两种方式为包添加元素。

①右击包,然后选择“Open Specification...”,在打开的对话框中,选择“Detail”选项卡,在下面的“Diagrams”中会列出包中已有的元素,用户在列表中右击,可以选择插入新的建模图形,创建的同时可以给新建的图形命名。

如下图所示:

Rose中为包添加元素

完成创建并命名后的效果如下图所示:

为包添加元素后的效果

在上面的图中,双击新建的元素标题,就可以打开它,并在里面进行相关的建模。

②在左侧浏览器中的对应包节点上右击,然后选择“New”(新建),然后在下级菜单中选择相应的元素类型即可。如下图所示的情形。

Rose中在浏览器中添加元素

(5)添加包之间的联系

上面已经说过,在Rose中,只支持包之间的依赖联系,同时不支持给联系添加构造型。

如果添加依赖联系,则在工具箱中选择“Dependency”箭头,从“依赖包”上点击后按住鼠标左键到“被依赖包”上松开鼠标后,即完成了一个依赖关系的建立。

建模实例

下面给出包图的两个例子来说明包图的具体使用方法。

第一个例子反映的是在建模过程中各模型元素的组织情况,使用包按照系统分析设计的阶段来组织各种模型。

UML包的例子-1

下面的包图例子描述了系统开发中各元素的组织情况。

UI中包含了使用的各种用户界面,BLL中包含了业务逻辑处理的各种类或接口,DAL中包含了数据访问层的相关类,Common中存放的是系统各个模块共用的一些组件或类是内容。

UML包的例子-2

以上内容介绍了UML中包图的相关知识及在Rose中绘制包图的方法,如有问题,请留言说明。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表