可视化序列图上的代码

若要将代码实施特定方法的方式可视化,请在 Visual Studio Ultimate 中创建方法的序列图。 序列图将对象之间的交互显示为一系列生命线和消息。 生命线表示对象的实例,而消息则表示这些对象之间的方法调用。 你可以从 Visual C# .NET 或 Visual Basic .NET 代码中生成序列图,但不能从在多个应用上共享代码的项目中生成。

生成的序列图显示与 UML 序列图上相似的那些元素。 从代码生成的序列图独立于 UML 模型存在,并且可以添加到任何 .Net 项目中。 相反,手动绘制的 UML 序列图始终是你在其中创建序列图的模型的一部分。 有关详细信息,请参阅 UML 序列图:参考

  • 从源代码生成序列图

  • 在序列图上浏览代码

  • 编辑序列图以建议设计更改

  • 从序列图转到代码

  • 将序列图链接到工作项

  • 与其它序列图的关系

  • 序列图故障排除

从源代码生成序列图

  1. 在 Visual Studio Ultimate 中,打开含有该方法定义的代码文件。

  2. 转到方法定义,在编辑器中右键单击,然后选择**“生成序列图”**。

  3. 最大调用深度框中,指定您想要查看的调用的最大级别。 例如,如果只需查看第一级调用,请将最大调用深度级别指定为 1。

    “生成序列”对话框

    备注

    序列图将第二级调用显示为不带目标生命线的消息(称为“丢失的消息”)。生成序列图后,你可以展开特定的丢失消息。有关丢失消息的详细信息,请参阅 UML 序列图:参考

  4. 在**“包含调用范围”**下,选择下表中所示的某个范围:

    要查看的调用

    Choose

    对即时项目中的项的调用

    当前项目

    对解决方案中的项的调用

    “当前解决方案”(默认)

    对解决方案内部和外部的项的调用

    解决方案和外部引用

    例如,你可以首先生成一个简单的序列图,只查看对即时项目中的项的方法调用。 然后,你可以生成一个新序列图,显示对解决方案中的项的调用,从而扩大序列图的范围。 如果你要查看对解决方案外部项的调用,则必须生成包含外部引用的序列图。

  5. 在**“排除调用范围”**下,你可以忽略对下列项的调用,从而进一步简化序列图:

    要忽略的调用

    选择

    属性和事件

    “属性和事件”(默认)

    System 命名空间

    “系统命名空间”(默认)

    特定命名空间

    “其他命名空间”,然后在框中键入命名空间,用逗号 (,) 分隔。 请不要使用通配符 (*),因为它们不受支持。

    要包括对这些项的调用,请清除对应的复选框。

  6. 如果要向当前项目添加图,则选中该框。

  7. 完成时,选择**“确定”**以生成序列图。

    有关与生成序列图相关的问题的信息,请参阅序列图疑难解答。

    备注

    数组声明不会显示在生成的序列图上。

若要标识和传达可能进行的更改而不影响代码,你可以浏览和修改生成的序列图。 例如,可以添加新的生命线、消息、交互使用和片段。 若要创建和跟踪对相应代码执行的工作的任务,你可以通过创建工作项或将工作项链接到序列图元素。 有关详细信息,请参阅链接模型元素和工作项

重要

生成序列图后,对序列图所做的任何更改将不会显示在代码中,对代码所做的任何更改也不会显示在该序列图中。若要显示这些更改,必须生成新的序列图。可以根据需要使用相同方法多次生成新序列图。

在序列图上浏览代码

序列图可以帮助你浏览代码并向其他人演示。 若要获得最适用于相应用途的序列图,请在生成序列图时试验不同的范围。 生成序列图之后,你还可以对其进行修改。 例如,你可以删除与演示和讨论设计无关的消息。

你可以对序列图进行以下更改。

执行这些步骤

显示下一级别的调用

打开没有目标生命线的消息的快捷菜单,然后选择“展开传出”

在新序列图中展开消息

打开消息的快捷菜单,然后选择“生成序列图”

新序列图将添加到当前项目中。

将一组消息折叠为一个生命线。

选择要组合的生命线,打开所选内容的快捷菜单,然后选择“折叠”

你可以重命名一个组,但在你展开组时,该名称将丢失。

若要展开某个组,请打开其快捷菜单,然后选择“展开”

删除元素

打开形状的快捷菜单,然后选择“删除”

改进布局

打开关系图空白区域的快捷菜单,然后选择“重新排列布局”

你还可以撤消该命令。

突出显示所选元素

打开元素的快捷菜单,然后选择“属性”。 在“属性”窗口中,设置“颜色”字段。

批注序列图

选择“注释”工具,在序列图中单击,然后在注释中键入说明。 使用“注释链接”工具,将注释连接到生命线或片段上的一个或多个点。

编辑序列图以建议设计更改

你可以更改序列图,通过添加和删除元素,帮助你考虑备选设计。 你还可将序列图的某些部分复制到你在 UML 建模项目中创建的 UML 序列图中。 通过这种方式,你可以将生命线与 UML 模型的类型、组件和参与者相关联。

下表汇总了可用于描述设计方案的更改。 有关详细信息,请参阅 UML 序列图:准则

执行这些步骤

突出显示生命线、消息和其他元素

更改元素的“颜色”属性。

- 或 -

“注释”链接到元素:

  1. “工具箱”中,选择“注释”,然后在序列图上的元素附近单击。

  2. “工具箱”中,选择“注释链接”,然后在序列图上选择注释,然后选择元素。

移动生命线

将生命线拖到序列图的不同区域。

若要移动具有丢失的消息或找到的消息的一组生命线,请先按照以下步骤选择生命线,然后再进行移动:

  • 在生命线周围绘制一个矩形。

    - 或 -

    在选择每个生命线时按住 Ctrl 键。

    备注

    如果使用“全选”Ctrl+A 选择所有生命线,然后移动它们,则附加到这些生命线的任何丢失的消息或找到的消息将不会移动。如果出现这种情况,你可以单独移动这些消息。

移动和重新排列消息

在序列图上向上或向下拖动消息。

  1. 选择一个消息,然后:

  2. 若要调整消息的位置,请使用“向上键”“向下键”

  3. 若要更改消息的顺序,请使用 Ctrl+向上键Ctrl+向下键

添加生命线

选择“工具箱”中的“生命线”,然后选择序列图。

添加消息

如何创建消息
  1. “工具箱”中,选择“同步”“异步”消息。

    若要添加“找到的消息”或“丢失的消息”,请使用“异步”消息。 找到的消息来自未知事件源,丢失的消息广播到未知接收方。

  2. 在关系图上,选择源生命线。

  3. 选择目标生命线。

    - 或 -

    若要创建找到的消息或丢失的消息,请分别选择关系图上源生命线后面或前面的空白区域。

  4. 为消息键入一个新名称。

将生命线和消息复制到其他序列图或从其他序列图复制生命线和消息

复制和粘贴生命线。

生命线之间的消息也将自动复制。

备注

当你将建模项目中的 UML 序列图复制到生成的序列图时,可能仅显示生命线标头,或者你可能需要调整其颜色。若要修复此问题,请选择粘贴的生命线,并设置其“颜色”属性。

将消息包含在组合片断中

  1. 选择一个或多个消息。

  2. 打开所选内容的快捷菜单,指向“外侧代码”,然后选择一种组合片段。

使用组合片段表示可选序列、循环和其他消息组合。

将消息移到新序列图

打开消息的快捷菜单,然后选择“移动到关系图”

将创建新的序列图,其中包含消息以及附属消息。 在原始序列图上,消息被替换为“交互使用”

复制序列图

在解决方案资源管理器中复制序列图,或在 Windows 资源管理器中复制文件。 每个序列图有两个关联文件。

生成的序列图中可以使用任何 Visual Studio 旗舰版实例进行编辑,并且可以使用 Visual Studio 旗舰版或 Visual Studio 高级专业版读取。

不突出显示某些手动更改,例如添加和名称更改

  1. 打开序列图图面的快捷菜单,然后选择“属性”

  2. “显示手动更改”属性设置为“False”

从序列图转到代码

执行这些步骤

从生命线或消息分别导航到类或方法的定义

打开生命线或消息的快捷菜单,然后选择“转到定义”

在体系结构资源管理器中查找类或方法

打开生命线或消息的快捷菜单,然后选择“在体系结构资源管理器中显示”

有关详细信息,请参阅在依赖项关系图上映射代码间的依赖关系

将序列图链接到工作项

若要帮助规划实施更改的工作,可在 Team Foundation Server 中将序列图上的任何类型的元素链接到工作项。 在开始之前,确保你已连接到 Team Foundation Server。 有关详细信息,请参阅链接模型元素和工作项

执行这些步骤

创建新的工作项并将其链接到生命线、消息或其他元素

  • 打开一个或多个元素的快捷菜单,选择“创建工作项”,然后选择你要创建的工作项的类型。

    新的工作项将打开,以便你可完成它。

将生命线、消息或其他元素链接到工作项

  1. 打开一个或多个元素的快捷菜单,然后选择“链接到工作项”

  2. “链接到工作项”对话框中, 运行查询以查找工作项,或直接输入其 ID。 可以选择任意数量的工作项。

你以后可以重复此命令,将更多工作项链接添加到同一模型元素中。

查看链接的工作项

打开一个或多个元素的快捷菜单,然后选择“查看工作项”

移除指向工作项的链接

  1. 打开元素的快捷菜单,然后选择“移除工作项”

  2. “移除指向工作项的链接”对话框中,选择要移除的工作项链接。

模型元素与所选工作项之间的链接将被删除。 工作项和模型元素不会被删除。

生成序列图使用指南

当你使用生成的序列图浏览代码时,以下准则可能会有所帮助。

浏览代码

生成依赖项关系图,以总体了解大型代码体中的主要分组和依赖项。 然后生成序列图,重点显示设计的各个部分。 有关详细信息,请参阅在依赖项关系图上映射代码间的依赖关系

解释序列图

创建序列图的算法可以实施代码的符号化执行。 在某些情况下,此技术无法满足要求。 具体来说,这些情况包括:

  • 两个或更多生命线可能出现在同一个序列图中,但执行代码在一个序列图中只能处理一个实例。 一般情况下,只为每个消息生成一个单独的目标生命线。

  • 即使你的代码始终使用子类型,生命线的类型也是在程序代码中声明的类型。

重点显示设计的某个方面

  • 选择要重点显示的某一个设计方面。 你可以生成不同的序列图以重点显示不同方面,并在工作的任何阶段创建序列图的副本。

  • 为了生成一个清楚地呈现某个设计方面的有用序列图,你可能需要试验多个命名空间筛选器和生成。

  • 删除与重点显示的设计方面无关的消息,并展开相关消息以显示更多详细信息。

  • 使用**“折叠”**命令,可将表示对象协作组的生命线重合在一起,除非它们的内部交互与你要重点显示的方面相关。

更新设计

  • 你可以使用版本控制在序列图上协同工作。 我们建议你在编辑某个序列图时将其锁定,在同一时间只允许有一个用户编辑序列图。

  • 使用生成的序列图,你通常可以识别现有代码的哪些功能使得设计难以更改或调整。 例如,你可能会注意到某一个生命线发送了所有消息,而其他生命线只是响应消息,而很少发送自己的消息。 此时可以考虑是否可将目前由该对象完成的工作更加有效地在其他对象之间分配。 每个对象类应该具有明确定义的任务。 通常,此种策略使我们可以更加简单地确定当用户的需求变化时,必须更改程序的哪些部分,或者如何在应用程序的不同变体中重新排列各个部分。

  • 如果一个序列图重点显示设计的特定部分,你可以创建它的副本并进行编辑,以创建针对更改的备选方案。

  • 你可以将生成的序列图中的元素复制到 UML 序列图中。 必须首先在 UML 建模项目内创建 UML 序列图。 在序列图中,可以对更新设计的不同视图进行建模,并将生命线链接到模型中的组件或类。 还可以扩展交互,使其包括外部参与者。

序列图故障排除

下表描述了在生成序列图时可能出现的问题以及可能的解决方法:

问题

解决方法

无法生成序列图。

如果排除 System 命名空间,且代码包含对接受 ref 或 out 参数的 COM 方法的调用并使用 new 关键字传递参数,则无法生成序列图。 若要避免此问题,请更改代码,或在生成序列图时包含 System 命名空间。

在显示以下消息后,会生成一个空序列图:

“对象引用未设置为某个对象的实例。"

当从接口方法的显式实现生成序列图,且该序列图未自动添加到源项目时,此问题将出现。 显式实现会在方法名的前面添加接口名和一个句点 (.)。

例如,当从以下签名生成序列图,且不自动将该序列图添加到项目时,此问题将出现:

void ILinkedWorkItemExtension.OnWorkItemCreated( ) {}

如果可能,不包含接口名和句点 (.)。

- 或 -

在序列图生成对话框中,确保自动将序列图添加到项目。

生成序列图需要花费较长时间。

- 或 -

序列图在重新打开时崩溃。

根据你的计算机配置,序列图可能太大而无法快速生成,并且当你关闭并重新打开序列图时可能会导致 Visual Studio 内存不足而发生崩溃。 例如,具有 390 根生命线和 19,000 条消息的序列图会生成一个 85 MB 以上的序列图文件。

可以通过减小调用深度、筛选出不必要的命名空间、删除属性和事件等操作来减小序列图的范围。

请参见

参考

UML 序列图:参考

概念

可视化代码

在依赖项关系图上映射代码间的依赖关系

从代码创建层关系图