## UML 类图准则

在 Visual Studio 旗舰版中,可以使用 UML 类图来描述与实现无关的数据类型以及这些数据类型之间的关系。该关系图主要用来描述类的逻辑方面,而不是它们的实现。若要创建UML选件类图,请在 **体系结构** 菜单上,选择 **新关系图**。

## UML 类图主题内容

使用 UML 类图绘制类图的基本步骤、使用类、接口和枚举特性和操作、绘制和使用关联、Inheritance 模板类型、使用包定义命名空间生成从UML选件类关系图中的代码。

## UML 类图用途

UML 类图有多种用途:可提供对系统中所使用类型以及系统组件间所传递类型的与实现无关的描述;阐明应用程序及其用户之间沟通所用词汇的词汇表,并描述用户需求;与其他关系图的关系。

UML 类图通常与其他建模图一起绘制来描述这些关系图所使用的类型。在任何情况下,类型的物理表示形式都不在任何关系图中表示。如果已绘制:使用 UML 类图来描述活动图、序列图、生命线、组件图、用例图等。绘制类图的基本步骤有关 UML 类图中的元素的参考信息,请参见 UML 类图:参考。创建 UML 类图在体系结构菜单中,选择新关系图。在 **模板** 下,选择 UML 类图选件。命名该关系图。在 **添加元素** 对话框中,添加所需的元素。单击添加以将其添加到图形中。添加所有必需的元素后,保存并关闭新建关系图对话框。

**添加到建模项目**

在解决方案中选择一个现有建模项目或 **创建一个新的建模项目** ,然后选择 **好**。

此时将显示一个新的类图,同时显示**“UML 类图”**工具箱。 该工具箱中包含所需的元素和关系。

绘制 UML 类图

若要创建类型,请选择 **选件类** 、 **接口** 或 **枚举** 工具工具箱中的,然后单击关系图的空白部分。 还可以创建基于的类型您的代码。 您可以从解决方案资源管理器、体系结构资源管理器、依赖项关系图的类型在关系图上。 请参见 如何:从代码创建 UML 类图。

若要向类型添加特性或操作或向枚举添加文本,选择归为在类型的 **属性** 、 **操作** 或 **文本** ,然后按enter。 您可以写入签名,如 f(x:Boolean):Integer。 特性和操作参见。 若要快速添加多个项,请在每一项的最后按两次 Enter。 可以使用箭头键在列表中上下移动。 若要展开或折叠类型,选择V形图标。左上角。 还可以展开以及折叠类或接口的**“特性” 和 “操作”**部分。 若要绘制类型之间的关联、继承或依赖项链接,请单击相应关系工具,再单击源类型,然后单击目标类型。 若要在包中创建类型,请使用**“包”**工具创建一个包,然后在该包中创建新的类型和包。 还可以使用复制命令复制类型,然后将它们粘贴到包中。 每个关系图都是模型中的视图,可在同一项目中的其他关系图之间共享。 若要查看完整模型的树视图中,选择 **视图** , **其他Windows** , **UML模型资源管理器** 。

使用类、接口和枚举

在工具箱上有三种标准分类器可供使用。 在本文档中将这些分类器类型称为“类型”。 在大多数情况下,使用**“类”**(1) 来表示数据或对象类型。 如果在上下文中必须区分纯接口与具有内部实现的具体类,则使用**“接口”**(2)。 这一区别在关系图用于描述软件实现时非常有用。 但当对被动数据进行建模或者定义用于描述用户需求的概念时,这一区别用处不大。 “枚举” (3) 用来表示包含有限数目文本值的类型,例如 Stop 和 Go。 向枚举添加文本值。 为每个文本值指定一个单独的名称。

. 为每个文本值提供数值:您可以根据需要为每个文本值提供一个数值。为此,请打开文本的快捷菜单,选择“属性”,然后在“值”字段中输入数字。完成操作后,点击“属性”窗口中的“确定”按钮。

2. 指定唯一名称:为每个类型指定一个唯一的名称,以便在 UML 类图中进行区分。要命名类型,请在创建类型的步骤中输入一个描述性的名称。

3. 从其他关系图获取类型:如果您希望从其他关系图获取类型并将其显示在 UML 类图中,可以使用“从其他关系图获取类型”的功能。这将帮助您在一个关系图中展示多个关联关系。例如,您可以在一个关系图中显示订餐和餐馆菜单之间的关联,同时在另一个关系图中显示订餐和付款之间的关联。

4. 将组件添加到UML类图:如果您已在组件图中定义了组件,可以将这些组件从“UML 模型资源管理器”拖动到类图中。这样做时,它们将显示为类。有关更多信息,请参阅UML组件图准则。

5. 基于序列图创建类和接口:如果您需要根据序列图中的生命线创建类和接口,可以使用此功能。然后将从“UML 模型资源管理器”拖动的类或接口放入UML类图中。序列图中的每个生命线表示对象、组件或参与者的一个实例。若要创建选件类或接口,请打开相应生命线的快捷菜单,选择“创建选件类”或“创建接口”。有关更多信息,请参阅UML序列图准则。

6. 表示代码中的类型设计:如果您需要表示从您的代码的类型,可以先从体系结构资源管理器或依赖项关系图中拖动选件类、接口或枚举。然后将其放到UML类图上。拖动的类型将显示在关系图上。相关类型还将添加到模型中。如果在UML类型中创建了类型,可以双击其名称以打开源代码。有关如何使用代码创建UML类图的详细说明,请参阅相应的指南。

7. 注意代码与设计的同步问题:请注意,代码与设计之间不会保持同步。当您更新关系图以讨论更改建议时,这些更改不会影响您的代码。除非您再次将类型拖动回关系图上,否则该类型的后续更改不会自动反映在关系图中。

8. 特性和操作:特性是类型的每个实例可具有的命名值。访问特性不会更改实例的状态。操作是类型的实例可执行的方法或函数,它可以返回一个值。如果操作的“isQuery”属性为True,则不会更改实例的状态。要向类型添加特性或操作,请打开该类型的快捷菜单,选择“添加”,然后选择“属性”或“操作”。要查看其属性或方法的详细信息,请打开特性或操作的快捷菜单,然后选择“属性”或“操作”。这些信息将在“属性”或“操作”窗口中显示。

要查看操作参数的属性,请选择“*** 参数 *** 属性”。此时将显示一个新的属性对话框。

有关可以设置的所有属性的详细信息,请参考特性和操作的类型。特性或操作的每个类型以及每个参数类型都可以是以下值之一:

- 通过省略冒号 (:) 及其后类型而不在签名中指定类型。

- 标准基元类型之一:Boolean、Integer、String。

- 模型中定义的类型。

- 模板类型的参数化值,写入 Template<Parameter>。请参见模板类型。还可以写入尚未在模型中定义的类型的名称。此名称将在 UML 模型资源管理器中的“未指定的类型”下方列出。

- 可以设置任何特性、操作或参数类型的重数。允许的值如下所示:

- 重数为 1:给定类型的一个值。这是默认设置。

- 重数为 0..1:`Null` 或给定类型的一个值。

- 重数为 *:`一个集合`,其中包含任意数目的给定类型实例。

- 重数为 1..*:`一个集合`,其中包含至少一个给定类型实例。

- 重数为 n..m:`一个集合`,其中包含数目介于 n 和 m 之间的给定类型实例。

如果重数大于 1,还可以设置以下属性:

- 是有序的(Ordered):如果为 True,则集合具有定义的顺序。

- 是唯一的(Unique):如果为 True,则集合中没有重复值。

- 可见性(Visibility):指示是否可在类定义之外访问特性或操作。允许的值如下所示:

- Public:可从所有其他类型访问。

- Private:只能由此类型的内部定义访问。

- Package:只能在包含此类型的包以及显式导入此类型的所有包中访问。请参见定义命名空间和包。

- Protected:只能由此类型以及从其继承的类型访问。请参见继承。

AddItem(item: MenuItem, quantity: Integer): Boolean

使用可见性的缩写形式。默认值为`+ (public)`。每个类型都可为模型中已定义的类型、诸如Integer或String之类的标准类型或者尚未定义的新类型的名称。若要在签名中设置类型的重数,请将重数写入方括号,放在类型名称之后,例如:`+ AddItems(items: MenuItem[1..*]) + MenuContent: MenuItem[*]`。如果特性或操作是静态的,则其名称将在签名中显示为带有下划线。如果特性或操作是抽象的,则其名称将显示为斜体。但是,只能在“属性”窗口中设置“Is Static”和“Is Abstract”属性。

完全签名:编辑特性或操作的签名时,可能会在行尾所有参数之后出现某些附加属性。它们显示在一对大括号{...}内。可以编辑或添加这些属性。例如:`+ AddItems(items: MenuItem[1..*] {unique, ordered}) + GetItems(filter: String) : MenuItem[*] {ordered, query}`。这些属性如下所示:

```arduino

/TotalPrice: Integer

```

通常,完全签名仅在您对其进行编辑时才显示在关系图上。完成编辑后,会隐藏附加属性。如果希望始终显示完全签名,请打开该类型的快捷菜单,然后选择“显示完全签名”。

绘制和使用关联:关联用于表示两个元素间任何类型的链接,而与该链接在软件中的实现方式无关。例如,可以使用关联来表示C#中的指针、数据库中的关系或XML文件中从一部分到另一部分的交叉引用。它还可以表示现实世界中对象间的关联,如地球和太阳。关联并不定义链接的表示方式,而仅表示存在信息交流。

关联的属性:创建关联后可设置其属性。打开关联的快捷菜单,然后选择“属性”。每个角色(即关联的每一端)除了具有关联的共有属性之外还具有自己的一些属性。要查看这些属性,请展开“第一个角色”和“第二个角色”属性。每个角色的某些属性会直接显示在关系图上。具体如下:

角色名称。它显示在关系图中相应的关联端处。在关系图或**“属性”**窗口中可以设置该名称。

重数。默认值为**“1”**。它也显示在关系图中相应关联端附近。

聚合。它在连接线一端以菱形显示。可以使用聚合来指示实例属于聚合角色自身还是包含另一角色的实例。

是可导航的。如果只对一个角色为 True,则箭头将朝向可导航方向。可用于指示软件中链接和数据库关系的可导航性。有关这些属性以及其他属性的所有详细信息,请参见 UML 类图中关联的属性。

可导航性。在绘制关联时,其一端为箭头,表明关联可沿该方向导航。这在类图表示软件类且关联表示指针或引用的情况下很有用。但当您使用类图表示实体和关系或业务概念时,它与可导航性不太相关。在此情况下,您可能更愿意绘制不带箭头的关联。可通过将关联两端的**“可导航”**属性设置为 True 来做到这一点。为了使此过程更加简单,您可以下载代码示例 UML域建模。

特性和关联。关联是特性的图形化显示形式。例如,您可以在“餐馆”与“菜单”之间绘制一个关联,而不是创建具有 Menu 类型特性的 Restaurant 类。每个特性名称成为一个角色名称。它显示在关联中与所属类型相对的一端。通常,最好只对不会在关系图中绘制的类型(如基元类型)使用特性。

Inheritance.使用**“继承”**工具创建以下关系:专用类型和通用类型之间的“泛化”关系;类和接口之间实现的“实现”关系。不能在继承关系中创建循环。

Generalization.泛化意味着专用类型或派生类型继承通用类型或基类型的特性、操作和关联。通用类型显示在关系的箭头端。继承的操作和特性通常不在专用类型中显示。但是可将继承的操作添加到专用类型的操作列表中。这对希望在专用类型中重写某些操作的属性或希望指示实现代码应这样做时是非常有用的。

在专用类型中重写操作的定义:单击泛化关系。显示显示,并且,附近会出现一个操作标记它。单击该操作标记,然后单击**“重写操作”**。此时将显示**“重写操作”**对话框。选择要在专用类型中显示的操作,然后单击**“确定”**。您选中的操作将出现在专用类型中。

Realization.实现意味着类将实现由接口指定的特性和操作。接口位于连接线的箭头端。

在创建实现连接线时,系统会自动在实现类中复制接口的操作。如果向接口添加新操作,这些操作也会被复制到该接口的实现类中。

创建实现关系后,可以将该关系转换为棒糖形表示法。为此,只需右击该关系,然后选择“显示为棒糖形”。这样就可以在不干扰具有实现链接的类图的情况下,显示类所实现的接口。此外,还可以在其他关系图中显示实现的接口和类。

模板类型是一种可由其他类型或值参数化的泛型类型或模板类型。例如,可以创建一个由键类型和值类型参数化的泛型字典:创建模板类型,首先创建一个类或接口作为模板类型,并为其命名,如 Dictionary。接下来,打开“属性”窗口,单击“模板参数”字段中的“[...]”,此时将显示“模板参数集合编辑器”对话框。在此对话框中,单击“添加”,将名称属性设置为模板类型的参数名称(例如 Key),并设置“参数种类”。如果希望参数只接受特定基类的派生类,请将“Constrained Value”设置为此基类。然后,添加多个参数,按需选择“好”。最后,将特性和操作添加到模板类型中。在特性和操作的定义中,可以使用种类为“类”、“接口”或“枚举”的参数。

创建模板类型后,可以使用它们来定义模板绑定。例如,要创建一个名为 AddressTable 的新类型,请选择属性,然后在“Template Binding”属性中从下拉列表中选择模板类型(例如 Dictionary)。展开“Template Binding”属性后,该模板类型的每个参数都将显示一行。将每个参数都设置为合适的值,例如将 Key 参数设置为名为 Name 的类。

包是一种 UML 类图中的元素,它是其他模型元素的容器。可以在包中创建任何元素。在关系图中,当您移动包时,包内的元素也将随之移动。

您好,您可以使用Doxygen和Graphviz工具生成C++工程的UML类图和类集成关系图。这些工具可以是专门的软件、IDE插件或在线服务,比如 Doxygen、Enterprise Architect、Visual Paradigm 等。其中,最常见的方法是使用 Doxygen 结合 Graphviz 来生成UML类图 。