UML 序列图:准则
在 Visual Studio 旗舰版 中,您可以绘制序列图以显示交互。交互是类、组件、子系统或参与者的典型实例之间的消息序列。序列图有两种:
UML 是 UML 建模项目的一部分的序列图。本主题关于 UML 序列图。若要创建 UML 序列图,请在**“体系结构”菜单上,单击“新建关系图”**。
有关序列图中的元素的更多信息,请参见 UML 序列图:参考。有关视频演示,请参见 Sketching Interactions by using Sequence Diagrams (2010)。
可以从 .NET 程序代码生成的基于代码的序列图。有关更多信息,请参见 通过生成序列图来可视化代码 和 MSDN How Do I Series: How to Generate UML Sequence Diagrams (2010)。
主题内容
使用 UML 序列图
绘制序列图的基本步骤
创建和使用简单序列图
类和生命线
创建可重用交互序列
折叠生命线组
使用片段描述控制结构
从代码生成序列图
使用 UML 序列图
您可以在不同的程序详细级别使用序列图以实现各种用途。下面是需要绘制序列图的典型情况:
如果您具有汇总了系统用户及其目标的用例图,则可以绘制序列图以描述系统的主要组件如何交互以实现每个用例的目标。有关更多信息,请参见 UML 用例图:准则。
如果您已标识到达组件接口的消息,则可以绘制序列图以描述组件的内部部件如何交互以实现每个传入消息所需的结果。有关更多信息,请参见 UML 组件图:准则。
绘制序列图具有以下几个好处:
可以轻松了解任务在组件之间的分布方式。
可以标识使软件更新变得困难的交互模式。
与其他关系图的关系
您可以通过多种方式组合使用 UML 序列图与其他关系图。
生命线和类型
在序列图中绘制的生命线可以表示系统中的组件或类的典型实例。您可以根据类型创建生命线,也可以根据生命线创建类型,并且可以显示 UML 类图和 UML 组件图中的类型。有关更多信息,请参见类和生命线。
参数类型
对于在生命线之间发送的消息中用到的参数类型和返回值,也可以在 UML 类图中描述。
用例详细信息
用例表示用户的目标以及实现该目标的步骤序列。可以通过多种方法描述步骤序列。一种方法是绘制一个显示用户与系统主要组件之间的交互的序列图。有关更多信息,请参见 UML 用例图:准则。
源代码
您可以从源代码生成序列图。可以对关系图进行修改以体验不同的设计选项。还可以根据需要将内容复制到建模项目中的序列图。有关更多信息,请参见从代码生成序列图。
绘制序列图的基本步骤
有关序列图中的元素的完整列表,请参见 UML 序列图:参考。
说明 |
---|
如何创建任何建模图的详细步骤在如何:编辑 UML 模型和关系图中进行了介绍。 |
创建序列图
在**“体系结构”菜单上,单击“新建关系图”**。
在**“模板”下,单击“UML 序列图”**。
命名该关系图。
在**“添加到建模项目”中,从您的解决方案中选择一个现有建模项目,或者选择“创建新的建模项目”,然后单击“确定”**。
此时将显示一个新的序列图,同时显示**“序列图”**工具箱。该工具箱中包含所需的元素和连接线。
绘制序列图
将**“生命线”(1) 从“工具箱”**拖动到该关系图,以表示类、组件、参与者或设备的实例。
说明 也可以将现有类、接口、参与者或组件从“UML 模型资源管理器”拖动到该关系图,以创建生命线。这将创建一个表示所选类型的实例的生命线。
绘制消息以显示生命线如何协作以实现特定目标。
若要创建消息(3、4、6、7),请单击消息工具。然后在希望消息开始的位置单击发送生命线,再单击接收生命线。
接收生命线上将显示执行发生 (5)。执行发生表示实例执行方法的一段时间。您可以创建从执行发生开始的其他消息。
若要显示来自未知事件源 (9) 或传播给未知接收方 (10) 的消息,请绘制一个起始于或终止于该关系图上的空白区域的异步消息。这些消息称为“找到的消息”(9) 和“丢失的消息”(10)。
说明 若要移动具有丢失的消息或找到的消息的一组生命线,请先按照以下步骤选择生命线,然后再进行移动:在这些生命线周围绘制一个矩形,或者按住“Ctrl”键并单击每个生命线。如果使用“全选”或 Ctrl+A 选择所有生命线,然后移动它们,则附加到这些生命线的任何丢失的消息或找到的消息将不会移动。如果出现这种情况,您可以单独移动这些消息。
为相同组件或系统的每个主要消息绘制序列图。
更改消息的顺序
在消息的生命线中向上或向下拖动消息。可以将消息拖动到其他消息上方,也可以将消息拖入或拖出执行块。
- 或 -
单击消息并使用**“向上键”和“向下键”调整消息位置。使用“Shift+向上键”和“Shift+向下键”**更改消息的顺序。
在序列图上移动或复制消息序列
右击消息(3、4),然后单击**“复制”**。
右击要从中发送新消息的执行生成 (5) 或生命线 (1),然后单击**“粘贴”**。新发送方可以位于其他关系图上(如果需要)。
消息及其所有附属消息的副本将添加到执行生成或生命线的结尾。
说明 粘贴的消息始终显示在执行生成或生命线的结尾。粘贴消息之后,可以将其向上拖动到更早的位置。
若要显示和编辑该签名用于消息文本
必须绑定或映射目标生命线。签名文本的类型可以是可见的。若要完成此任务,请执行以下步骤之一:
右击生命线,然后选择 创建类。
- 或 -
选择生命线,然后再 属性 窗口中按 F4,然后,设置 类型 属性设置为现有类型或为新类型指定名称。右击消息标签,然后选择 创建操作。
签名文本在邮件标签下显示。现在可以编辑签名文本。有关更多信息,请参见 Classes and Lifelines。
改进序列图的布局
右击关系图的空白部分,然后单击**“重排布局”**。
若要撤消该操作,请单击**“编辑”,再单击“撤消”**。
更改拥有交互的包
在**“UML 模型资源管理器”**中,找到序列图显示的交互。
说明 您必须先向序列图添加一个生命线,“UML 模型资源管理器”中才会显示交互。
将该交互拖动到包中。
- 或 -
右击交互,然后单击**“剪切”。右击该包,然后单击“粘贴”**。
创建和使用简单序列图
最简单且使用最广泛的序列图只包含生命线和消息。使用此类型的关系图,您可以清晰地显示设计中各对象之间或系统及其用户之间的典型交互序列。这通常足够帮助您讨论和传达设计。
下面是在绘制简单序列图时需要考虑的一些事项。
消息的类型
可以使用三种工具来创建消息。
使用**“同步”**工具描述发送方等待接收方返回响应的交互 (3)。
**“<<返回>>”**箭头将显示在执行生成的结尾。它指示返回对发送方的控制。
使用**“异步”**工具描述发送方可以立即继续而无需等待接收方的交互 (4)。
使用**“创建”**工具描述发送方创建接收方的交互 (8)。
创建消息应是接收方接收的第一个消息。
对交互进行批注
若要描述有关序列的更多详细信息,可以在该关系图中的任意位置添加**“注释”**。
使用**“注释链接”**,您可以将注释链接到生命线、执行、交互使用和片段。
警告 |
---|
如果要将注释附加到序列中的特定位置,则需将其链接到执行生成、交互使用或片段。不要将注释链接到生命线,因为在这种情况下,注释不会保持附加在序列中的正确位置。 |
使用注释可以:
说明已在序列中的关键点处实现的目标。这有助于读者查看交互目标。
描述整个序列的总体目标。将注释附加到初始执行生成或不进行附加。例如,“客户已从菜单中点菜且已指定菜价”。
描述每个生命线的职责。将注释附加到生命线。例如“订单经理收集客户的菜单选项”。
请注意,异常或替代项可能会作为显示的典型序列的替代项执行。例如,“客户可以选择跳过此序列的其余部分”。
- 请考虑使用片段作为此类型注释的更为正式的替代项。请参见使用片段描述控制结构
确定关系图的范围
明白关系图将显示的内容非常重要。
初始事件
每个关系图都应显示从一个初始事件产生的交互序列。例如,初始事件可能是:
用户启动了一个用例,例如打开网页订购午餐。
消息从一个系统组件传送到另一个系统组件,例如查询客户要购买的午餐的可用性。
状态更改触发的事件,例如项的库存低于阈值。
详细级别
序列图可以显示不同详细级别。您可以在两个几乎独立的单独维度中确定详细级别。
生命线可以表示下列详细级别之一:
已经存在或将要开发的程序代码中的对象。
组件或其子组件,它们通常忽略外观、代理和其他连接机制。
系统和外部参与者
消息可以表示下列详细级别之一:
API 或 Web 接口的程序代码中的软件消息。
事务或子事务,例如,用户和系统之间或代码和数据库之间的事务或子事务。
用例 - 用户和系统之间的主要交互。
无论您要浏览现有代码还是描述新设计,绘制并讨论详细级别更低的视图通常很有用。
描述变体
该关系图显示单个典型事件序列。如果您要显示可能的替代项(例如失败方案),则可以使用以下两种选项之一:
绘制单独的序列图以描述这些方案
通过使用片段描述控制结构显示循环、替代项等。
评估设计
可以使用该关系图评估任务在其对象或组件之间的分布情况。如果您看到下列模式,请考虑进行重构:
一个生命线似乎执行任何操作,调用其他任何内容,而另一个生命线只是被动地响应。
许多消息跨越生命线。每个生命线应仅向邻近的几个生命线发送消息,不应与其邻近的邻近生命线通信。通常应该可以排列生命线,以便消息只在几个位置跨越生命线;在具有交点的地方,目标生命线还不应交换跨越了生命线的消息。
某些生命线似乎处理多种类型的任务。应该可以轻松找到描述每个生命线的职责的简洁句子,其中汇总了生命线用于响应所接收的每个消息所做的工作。
类和生命线
序列图中的生命线显示类或组件接口的实例。可以通过两种方法命名生命线:
用于实现此目的 |
使用此格式 |
---|---|
类型的匿名实例。 如果每个类型只有一个生命线,请使用这种格式。 |
typeName |
类型的命名实例。 如果要显示涉及同一类型的多个实例的序列,请使用此格式。 |
对象名称:类型名称 |
基于类型创建生命线
您可以基于已在比如类图上定义的类创建新生命线。
说明 |
---|
执行此任务之前,请确保已具有现有序列图。 |
基于现有类型创建生命线
将类、组件或接口从 UML 模型资源管理器拖动到序列图中。
- 或 -
在各自的关系图上右击类、组件或接口,然后单击**“创建生命线”**。
在**“创建生命线”对话框中,选择一个序列图,然后单击“确定”**。
随即显示新的命名实例生命线,其类型为您拖动的类型。
说明 可以根据需要重复此操作多次。这将创建具有不同实例名的生命线。
更改生命线的类型
右击生命线,然后单击**“属性”**。
在**“属性”窗口中,设置“类型”**属性。可以从下拉菜单中选择一个类型,也可以键入新名称。
基于生命线创建类
如果已创建多个序列图,则可以通过在这些序列图中创建类或接口来汇总生命线。
基于生命线创建类或接口
右击生命线,然后单击**“创建类”或“创建接口”**。
新类或接口将显示在“UML 模型资源管理器”中。
在生命线接收到的每个消息的类或接口中创建操作:
选择要包括的所有消息。
右击其中的一个消息,然后单击**“创建方法”**。
新类或接口具有每个所选消息的操作。
操作名称显示在每个消息箭头下方以及消息的**“操作”**属性中。
如果消息以“(参数 : 类型)”形式包含参数,则操作名称将显示在新操作的参数列表中。
说明 如果要在序列图中添加新消息,必须重复此步骤。
若要详细查看新类或接口,请将其添加到类图或组件图中。
打开或创建一个类图或组件图。
将新类或接口从**“UML 模型资源管理器”**拖动到类图。
新类或接口随即显示在类图中。
- 或 -
将新接口从**“UML 模型资源管理器”**拖动到组件图中的组件或端口上。
接口随即以棒糖形显示在组件上。
创建参数的类
可以在序列图上的消息中包括参数。可以使用 UML 类图描述参数类型。
创建可重用交互序列
可以使用单独的关系图描述包含要分离出的或几个关系图共有的详细信息的序列。
可以在一个关系图上创建指向另一个关系图中的详细信息的交互使用矩形 (12)。
双击“交互使用”,打开链接到它的序列图。
基于现有生命线创建可重用交互序列
在**“工具箱”中,单击“交互使用”**。
在序列图上,按住鼠标按钮,拖过要包括在可重用序列中的生命线。从要在其中插入交互使用的垂直位置开始。
交互使用将显示在序列图上的选定生命线中。
双击交互使用的名称,将其重命名为描述此关系图上可重用序列的效果的名称。
- 或 -
使用参数填写一个类似函数调用的名称。
将交互使用链接到其他序列图。右击交互使用,然后:
单击**“创建新序列”**以创建新的序列图
- 或 -
单击**“链接到序列”**以链接到现有关系图。
Visual Studio 将在交互使用和新交互序列之间创建一个链接。
解决方案中将显示一个新序列图。其中包含您用于创建交互使用的生命线。
说明 新关系图将只包含您用于创建交互使用的生命线。新关系图不包含在交互使用之后创建的生命线,即使交互使用现在涉及这些生命线也是如此。
基于现有消息创建可重用序列
右击要移除的消息,然后单击**“移动到关系图”**。
Visual Studio:
用交互使用替换所选消息及任何附属消息。
将替换的消息移动到新序列图。
在交互使用和新序列图之间创建链接。
导航到交互使用引用的序列
双击交互使用。
- 或 -
右击交互使用,然后单击**“转到序列”**。
使用交互使用创建占位符
可以创建交互使用而无需将其链接到其他关系图。可以使用该交互使用作为仍需为其创建详细信息的序列部分的占位符。使用交互使用的名称指示所需结果。
折叠生命线组
可以将一组生命线折叠到一起,以便该组显示为一个生命线。这有助于您将一组对象直观地显示为单个组件。折叠组中的生命线之间的消息和交互使用处于隐藏状态。包括其他生命线的消息和交互序列处于显示状态。
将生命线组折叠到一起
选择两个或多个生命线。
右击其中的一个,然后单击**“折叠”**。
这些单独的生命线将替换为一个生命线。
仅涉及组成员的消息和交互使用处于隐藏状态。
若要重命名组,请单击名称。
说明 展开组时,组名将丢失。
展开折叠的组
右击折叠的生命线,然后单击**“展开”**。
说明 组的名称以及从该组到注释或工作项的任何链接都将丢失。
使用片段描述控制结构
可以使用组合片段 (13) 定义序列图中的循环、分支和并发处理。或者,可以考虑改用活动图。活动图在显示参与者之间的消息时不太有用,但某些情况下,在显示循环、分支和并发时比较有用。
有关片段的类型的完整列表,请参见使用 UML 序列图中的片段描述控制流。
创建组合片段
选择一个消息,或消息序列(其中的所有消息都在同一执行生成或生命线上开始)。
说明 选择消息箭头,不是消息指向的执行生成。
右击一个消息,指向**“外侧代码”**,然后单击所需的片段类型。
随即显示新片段。其中包含您选择的消息。
如果组合片段类型允许多个片段,也将显示空片段。
若要设置片段的临界,请右击片段边框,然后单击**“属性”。设置“临界”**属性。
临界用于定义分支或循环的条件。
若要将新片段添加到允许多个片段的类型,请右击片段的边界,然后指向**“添加”。单击“前面的交互操作数”或“后面的交互操作数”**。
若要将新消息添加到片段,请使用消息工具或者使用复制和粘贴。
从代码生成序列图
可以从 Visual C# 或 Visual Basic 代码文件中的方法定义生成序列图。
生成的序列图与您在建模项目中创建的序列图非常类似。但是,生成的序列图中的元素未显示在 UML 模型资源管理器中。
从代码生成序列图
在 Visual Studio 中,打开包含方法定义的代码文件。
在方法定义中的任意位置右击,然后单击**“生成序列图”**。
有关更多信息,请参见通过生成序列图来可视化代码。
说明 生成序列图后,对序列图所做的任何更改将不会显示在代码中,对代码所做的任何更改也不会显示在该序列图中。若要显示这些更改,必须生成新的序列图。可以根据需要使用相同方法多次生成新序列图。
可以从生命线和消息导航到它们表示的类和方法的代码定义。
从生成的生命线和消息导航到代码
- 右击生成的生命线或消息,然后单击**“转到定义”**。
将生成的序列复制到 UML 模型
可以将生成的序列的生命线、消息和其他部分复制到建模项目中的序列图。
将生成的序列图复制到 UML 模型或从 UML 模型中复制生成的序列图
在序列图上,选择要复制的元素(例如生命线和消息)。如果您要复制该关系图中的所有内容,请在**“编辑”菜单上单击“全选”**。
在**“编辑”菜单上单击“复制”**。
在建模项目中创建或打开一个序列图。若要了解如何执行此操作,请参见绘制序列图的基本步骤。
在**“编辑”菜单上,单击“粘贴”**。
所选元素的副本随即显示在该关系图上。
说明 您可能必须调整粘贴的元素的颜色。选择这些元素,然后在“属性”窗口中设置颜色。