通过生成序列图来可视化代码
在 Visual Studio 旗舰版中,生成“序列图”,以帮助您直观地了解代码如何实现特定方法。 序列图以一系列生命线和消息的方式,显示对象之间的交互。 生命线表示对象的实例,而消息则表示这些对象之间的方法调用。 您可以从 Visual C# .NET 或 Visual Basic .NET 代码生成序列图。
备注
生成的序列图显示与 UML 序列图上相似的那些元素。从代码生成的序列图独立于 UML 模型存在,并且可以添加到任何 .Net 项目中。相反,手动绘制的 UML 序列图始终是您在其中创建序列图的模型的一部分。有关更多信息,请参见 UML 序列图:参考。
主题内容
从源代码生成序列图
在序列图上浏览代码
编辑序列图以建议设计更改
从序列图导航
将交互元素链接到工作项
与其他序列图的关系
序列图疑难解答
从源代码生成序列图
从代码生成序列图
在 Visual Studio 中,打开包含方法定义的代码文件。
打开快捷菜单方法定义中的任意位置,然后选择 生成序列图。
在**“生成序列图”对话框中的“最大调用深度”**框中,指定要查看的最大调用级别。
例如,如果只需查看第一级调用,请将最大调用深度级别指定为 1。
备注
序列图将第二级调用显示为不带目标生命线的消息(称为“丢失的消息”)。生成序列图后,您可以展开特定的丢失消息。有关丢失的消息的更多信息,请参见 UML 序列图:参考。
在**“包含调用范围”**下,选择下表中所示的某个范围:
要查看的调用
Choose
对即时项目中的项的调用
当前项目
对解决方案中的项的调用
“当前解决方案”(默认)
对解决方案内部和外部的项的调用
解决方案和外部引用
例如,您可以首先生成一个简单的序列图,只查看对即时项目中的项的方法调用。 然后,您可以生成一个新序列图,显示对解决方案中的项的调用,从而扩大序列图的范围。 如果您要查看对解决方案外部项的调用,则必须生成包含外部引用的序列图。
在**“排除调用范围”**下,您可以忽略对下列项的调用,从而进一步简化序列图:
要忽略的调用
Select
属性和事件
“属性和事件”(默认)
System 命名空间
“系统命名空间”(默认)
特定命名空间
“其他命名空间”,然后在框中键入命名空间,用逗号 (,) 分隔。 请不要使用通配符 (*),因为它们不受支持。
要包括对这些项的调用,请清除对应的复选框。
完成后,选择 确定。
Visual Studio 将生成序列图并将其添加到相应项。 有关与生成序列图相关的问题的信息,请参见序列图疑难解答。
备注
数组声明不会显示在生成的序列图上。
若要标识和传达可能进行的更改而不影响代码,您可以浏览和修改生成的序列图。 例如,可以添加新的生命线、消息、交互使用和片段。 若要创建和跟踪对相应代码执行的工作的任务,您可以通过创建工作项或将工作项链接到序列图元素。 有关更多信息,请参见链接模型元素和工作项。
重要
生成序列图后,对序列图所做的任何更改将不会显示在代码中,对代码所做的任何更改也不会显示在该序列图中。若要显示这些更改,必须生成新的序列图。可以根据需要使用相同方法多次生成新序列图。
在序列图上浏览代码
序列图可以帮助您浏览代码并向其他人演示。 若要获得最适用于相应用途的序列图,请在生成序列图时试验不同的范围。 生成序列图之后,您还可以对其进行修改。 例如,您可以删除与演示和讨论设计无关的消息。
您可以对序列图进行以下更改。
若要 |
执行这些步骤 |
---|---|
显示下一级别的调用 |
打开没有目标生命线的消息的快捷菜单,然后选择 展开发出。 |
在新序列图中展开消息 |
打开邮件的快捷菜单,然后选择 生成序列图。 新序列图将添加到当前项目中。 |
将一组消息折叠为一个生命线。 |
选择要分组的生命线,打开选定内容的快捷菜单,然后选择 Collapse。 您可以重命名一个组,但在您展开组时,该名称将丢失。 若要展开组,请打开该文件的快捷菜单中选择 展开。 |
删除元素 |
打开形状的快捷菜单中选择 删除。 |
改进布局 |
打开关系图的空白区域的快捷菜单,然后选择 重新排列格式。 您还可以撤消该命令。 |
突出显示所选元素 |
打开组件的快捷菜单中选择 属性。 在“属性”窗口中,设置“颜色”字段。 |
批注序列图 |
选择 注释 工具,单击序列图,然后键入说明。注释。 使用“注释链接”工具,将注释连接到生命线或片段上的一个或多个点。 |
编辑序列图以建议设计更改
您可以更改序列图,通过添加和删除元素,帮助您考虑备选设计。 您还可将序列图的某些部分复制到您在 UML 建模项目中创建的 UML 序列图中。 通过这种方式,您可以将生命线与 UML 模型的类型、组件和参与者相关联。
下表汇总了可用于描述设计方案的更改。 有关更多详细信息,请参见 UML 序列图:准则。
若要 |
执行这些步骤 |
---|---|
突出显示生命线、消息和其他元素 |
更改元素的“颜色”属性。 - 或 - 将“注释”链接到元素:
|
移动生命线 |
将生命线拖到序列图的不同区域。 若要移动具有丢失的消息或找到的消息的一组生命线,请先按照以下步骤选择生命线,然后再进行移动:
|
移动和重新排列消息 |
在序列图上向上或向下拖动消息。
|
添加生命线 |
选择在 工具箱的 生命线 ,然后选择关系图。 |
添加消息 |
|
将生命线和消息复制到其他序列图或从其他序列图复制生命线和消息 |
复制和粘贴生命线。 生命线之间的消息也将自动复制。
说明
当您将建模项目中的 UML 序列图复制到生成的序列图时,可能仅显示生命线标头,或者您可能需要调整其颜色。若要修复此问题,请选择粘贴的生命线,并设置其“颜色”属性。
|
将消息包含在组合片断中 |
使用组合片段表示可选序列、循环和其他消息组合。 |
将消息移到新序列图 |
打开邮件的快捷菜单,然后选择 移动到关系图。 将创建新的序列图,其中包含消息以及附属消息。 在原始序列图上,消息被替换为“交互使用”。 |
复制序列图 |
在解决方案资源管理器中复制序列图,或在 Windows 资源管理器中复制文件。 每个序列图有两个关联文件。 生成的序列图中可以使用任何 Visual Studio 旗舰版实例进行编辑,并且可以使用 Visual Studio 旗舰版或 Visual Studio 高级专业版读取。 |
不突出显示某些手动更改,例如添加和名称更改 |
|
从序列图导航
若要 |
执行这些步骤 |
---|---|
从生命线或消息分别导航到类或方法的定义 |
打开生命线或消息的快捷菜单,然后选择 转到定义。 |
在体系结构资源管理器中查找类或方法 |
打开生命线或消息的快捷菜单,然后选择 显示在体系结构资源管理器。 有关更多信息,请参见在依赖项关系图上可视化代码依赖项。 |
将序列图链接到工作项
若要帮助规划实施更改的工作,可在 Team Foundation Server 中将序列图上的任何类型的元素链接到工作项。 在开始之前,请确保已连接到 Team Foundation server。 有关更多信息,请参见链接模型元素和工作项。
若要 |
执行这些步骤 |
---|---|
与生命线、消息,或其他元素创建和新工作项链接到 |
|
链接生命线、消息,或其他元素工作项 |
您以后可以重复此命令,将更多工作项链接添加到同一模型元素中。 |
查看链接的工作项 |
打开一个的快捷菜单或多个元素,然后选择 查看工作项。 |
移除指向工作项的链接 |
模型元素与所选工作项之间的链接将被删除。 工作项和模型元素不会被删除。 |
生成序列图使用指南
当您使用生成的序列图浏览代码时,以下准则可能会有所帮助。
浏览代码
生成依赖项关系图,以总体了解大型代码体中的主要分组和依赖项。 然后生成序列图,重点显示设计的各个部分。 有关更多信息,请参见在依赖项关系图上可视化代码依赖项。
解释序列图
创建序列图的算法可以实施代码的符号化执行。 在某些情况下,此技术无法满足要求。 具体来说,这些情况包括:
两个或更多生命线可能出现在同一个序列图中,但执行代码在一个序列图中只能处理一个实例。 一般情况下,只为每个消息生成一个单独的目标生命线。
即使您的代码始终使用子类型,生命线的类型也是在程序代码中声明的类型。
重点显示设计的某个方面
选择要重点显示的某一个设计方面。 您可以生成不同的序列图以重点显示不同方面,并在工作的任何阶段创建序列图的副本。
为了生成一个清楚地呈现某个设计方面的有用序列图,您可能需要试验多个命名空间筛选器和生成。
删除与重点显示的设计方面无关的消息,并展开相关消息以显示更多详细信息。
使用**“折叠”**命令,可将表示对象协作组的生命线重合在一起,除非它们的内部交互与您要重点显示的方面相关。
更新设计
您可以使用版本控制在序列图上协同工作。 我们建议您在编辑某个序列图时将其锁定,在同一时间只允许有一个用户编辑序列图。
使用生成的序列图,您通常可以识别现有代码的哪些功能使得设计难以更改或调整。 例如,您可能会注意到某一个生命线发送了所有消息,而其他生命线只是响应消息,而很少发送自己的消息。 此时可以考虑是否可将目前由该对象完成的工作更加有效地在其他对象之间分配。 每个对象类应该具有明确定义的任务。 通常,此种策略使我们可以更加简单地确定当用户的需求变化时,必须更改程序的哪些部分,或者如何在应用程序的不同变体中重新排列各个部分。
如果一个序列图重点显示设计的特定部分,您可以创建它的副本并进行编辑,以创建针对更改的备选方案。
您可以将生成的序列图中的元素复制到 UML 序列图中。 必须首先在 UML 建模项目内创建 UML 序列图。 在序列图中,可以对更新设计的不同视图进行建模,并将生命线链接到模型中的组件或类。 还可以扩展交互,使其包括外部参与者。
序列图疑难解答
下表描述了在生成序列图时可能出现的问题以及可能的解决方法:
问题 |
解决方法 |
---|---|
无法生成序列图。 |
如果排除 System 命名空间,且代码包含对接受 ref 或 out 参数的 COM 方法的调用并使用 new 关键字传递参数,则无法生成序列图。 若要避免此问题,请更改代码,或在生成序列图时包含 System 命名空间。 |
在显示以下消息后,会生成一个空序列图: “对象引用未设置为某个对象的实例。" 当从接口方法的显式实现生成序列图,且该序列图未自动添加到源项目时,此问题将出现。 显式实现会在方法名的前面添加接口名和一个句点 (.)。 例如,当从以下签名生成序列图,且不自动将该序列图添加到项目时,此问题将出现:
|
如果可能,不包含接口名和句点 (.)。 - 或 - 在序列图生成对话框中,确保自动将序列图添加到项目。 |
生成序列图需要花费较长时间。 - 或 - 序列图在重新打开时崩溃。 根据您的计算机配置,序列图可能太大而无法快速生成,并且当您关闭并重新打开序列图时可能会导致 Visual Studio 内存不足而发生崩溃。 例如,具有 390 根生命线和 19,000 条消息的序列图会生成一个 85 MB 以上的序列图文件。 |
可以通过减小调用深度、筛选出不必要的命名空间、删除属性和事件等操作来减小序列图的范围。 |