今天,本号将给各位伙伴们介绍一下UML中的包图。
包是对UML中各模型元素进行组织管理的一种机制,它把概念上相似、有关联的模型元素(包括静态的和动态的)组织到一个包中,形成具有各种功能或用途的模块,并可以控制包中元素的可见性,以方便人们更好的理解复杂的系统。
包图由包之间的关系组成,通过包之间关系的描述来展现系统各个模块之间的依赖关系。
它类似于操作系统中的文件夹,因此,它在UML中也使用类似的文件夹符号来表示。
在同一层级内,每个包应有一个与其它包不同的名称。
包的名称有两种形式:
(1)简单名称(Simple Name)
简单名称仅包含包的名称字符串,如下面的例子:
(2)路径名称(Path Name)
在很多情况下,包内又包含其它包,则在外围使用包内的某个包时可以使用路径名称来指明包的路径,其基本语法是:
外部包名称::本包名称
如下图所示的情形:
上图中表明“Borrow”这个包位于“SystemInterface”包内。
但在Rose中使用了另外一种表示方法,即:本包名称(from外部包名称)。
如下图所示的情形:
其含义是“Borrow”包是来自“SystemInterface”包内的。
包是一种分组机制,所以包内可以包含UML中任何元素,如类、用例、接口、组件、节点等,也可以包含其它包、用例图、协作图、序列图等。
包中的元素可见性主要包含三种:
(1)公有的(public)
通过在元素前添加“+”符号来表示,则该元素对所有引入该包的元素可见。
(2)私有的(private)
通过在元素前添加“-”符号来表示,则该元素只能被同一个包内的元素可见。
(3)保护的(protected)
通过在元素前添加“#”符号来表示,则该元素对继承该包的包中元素可见。
下图给出了包内元素的三种可见性的表示方法:
上图中的三个类“class A”、"class B"和“class C”的可见性分别是公有的、私有的和保护的。
包之间的关系主要有依赖关系和泛化关系。
(1)依赖关系
包之间的依赖关系是指两个包内的若干元素之间存在着依赖。
依赖使用虚线箭头表示。箭头由依赖包指向被依赖的包。
下图表示的是两个包之间的依赖关系。
包之间的依赖关系可以是泛化、实现、导入等。
导入依赖(import dependency)是指允许一个包中的元素存取另外一个包中的元素,可以在虚线箭头上添加<<import>>构造型来表示。
在Rose中不支持给依赖添加构造型。
导入依赖不具有传递性。
(2)泛化关系
包之间的泛化关系类似于类之间的泛化关系。
包之间的这种泛化关系是指其中的特殊包可以替换一般包中的元素,并可以添加新的元素。
在Rose中不支持给包添加泛化关系,实际上包之间的泛化也是一种依赖关系。
在Rose中,给出了包的一些构造型,并使用不同的图形或标记来表示。
下图给出了Rose中提供的一些包的构造型。
在上图中,从上到下,从左到右分别表示业务分析模型(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中的用例视图、逻辑视图和组件视图中都可以创建包。
(1)创建包
创建包可以通过以下三种方式来完成:
①使用菜单栏中的“Tools”(工具)->“Create”(新建)->“Package”(包)来创建一个包,选择该菜单后,鼠标形状将变成“+”,这时在绘图区的任意位置点击一下,则完成了包的创建。
②在左侧对象浏览器的某个节点上(如逻辑视图),右击该节点,然后选择“New”(新建)->“Package”(包),则完成了一个包的创建,如果要在绘图中使用这个包,则直接把它拖拽到绘图区即可。
③在对象浏览器和绘图区中间的工具箱中选择包工具后,在绘图区中点击一下即完成了一个包的创建。
Rose中,每创建一个包,都会在左侧对象浏览器中创建一个文件夹节点,所以,在Rose中,包更偏向于对模型的组织和分类。
(2)包的重命名
在左侧对象浏览器的包上右击,然后选择“Rename”则可以对包重新命名。
也可以在绘图区的包上,右击然后选择“Open Specification...”,在弹出的如下图所示的对话框中的“Name”项中对其重命名。
(3)设置包的构造型
右击一个包,然后在弹出的菜单中选择“Open Specification...”,则打开如下图所示的对话框,在“Stereotype”的下拉列表中选择Rose中已经设定的一些构造型。
用户根据需要也可以直接在下拉列表中输入构造型的名称。
用户输入的构造型,将以“<<用户输入的名称>>”的形式进行显示。
下面给出了用户输入的构造型的情形。
(4)给包添加元素
用户创建完包后,可以双击打开包,在包中直接建立相关模型,如用例图、状态图、活动图、类图等。
用户也可以通过下面两种方式为包添加元素。
①右击包,然后选择“Open Specification...”,在打开的对话框中,选择“Detail”选项卡,在下面的“Diagrams”中会列出包中已有的元素,用户在列表中右击,可以选择插入新的建模图形,创建的同时可以给新建的图形命名。
如下图所示:
完成创建并命名后的效果如下图所示:
在上面的图中,双击新建的元素标题,就可以打开它,并在里面进行相关的建模。
②在左侧浏览器中的对应包节点上右击,然后选择“New”(新建),然后在下级菜单中选择相应的元素类型即可。如下图所示的情形。
(5)添加包之间的联系
上面已经说过,在Rose中,只支持包之间的依赖联系,同时不支持给联系添加构造型。
如果添加依赖联系,则在工具箱中选择“Dependency”箭头,从“依赖包”上点击后按住鼠标左键到“被依赖包”上松开鼠标后,即完成了一个依赖关系的建立。
下面给出包图的两个例子来说明包图的具体使用方法。
第一个例子反映的是在建模过程中各模型元素的组织情况,使用包按照系统分析设计的阶段来组织各种模型。
下面的包图例子描述了系统开发中各元素的组织情况。
UI中包含了使用的各种用户界面,BLL中包含了业务逻辑处理的各种类或接口,DAL中包含了数据访问层的相关类,Common中存放的是系统各个模块共用的一些组件或类是内容。
以上内容介绍了UML中包图的相关知识及在Rose中绘制包图的方法,如有问题,请留言说明。
新闻热点
疑难解答