什么是类图?

在软件工程中,一个统一建模语言(UML)类图是一种静态结构图通过展示系统的类、它们的属性、操作(或方法)以及对象之间的关系来描述系统的结构。

Class diagram in UML diagram hierarchy

类图的目的

  1. 展示系统中分类器的静态结构
  2. 为其他UML结构图提供基础符号
  3. 对开发人员和其他团队成员非常有用
  4. 业务分析师可以使用类图从业务角度建模系统

UML类图由以下部分组成:

  • 一组类
  • 类之间的关系集合

什么是类?

一组具有相似角色的对象的描述,包括:

  • 结构特征(属性):定义类的对象“知道”什么
    • 表示对象的状态
    • 描述类的结构或静态特征
  • 行为特征(操作):定义类的对象“能做什么”
    • 定义对象之间的交互方式
    • 描述类的行为或动态特征

类的表示法

类的表示法由三个部分组成:

  1. 类名
    • 类名出现在第一个部分中。
  2. 类属性
    • 属性显示在第二个部分中。
    • 类型显示在冒号之后。
    • 属性映射到代码中的成员变量(数据成员)。
  3. 类操作(方法)
    • 操作显示在第三个分隔区中。它们表示类提供的服务。
    • 返回类型出现在方法签名末尾的冒号之后。
    • 参数类型出现在参数名称后的冒号之后。
    • 操作映射到代码中的类方法。

Simple class

类的图形表示MyClass如上所示:

  • MyClass 有 3 个属性和 3 个操作
  • op2 的参数 p3 类型为 int
  • op2 返回一个 float
  • op3 返回指向 Class6 的指针(由 * 表示)

类关系

一个类可能与其他类存在一种或多种关系。关系可以有以下类型:(请参考右侧图像以获取图形表示)。

关系类型 图示
继承(或泛化):

  • 表示“是一个”关系。
  • 抽象类名称以斜体显示。
  • SubClass1 和 SubClass2 是 SuperClass 的特化。
  • 实线,箭头为空心,从子类指向父类。
Inheritance
简单关联:

  • 两个等价类之间的结构连接。
  • Class1 和 Class2 之间存在关联。
  • 连接两个类的实线。
Simple association
聚合:

  • 一种特殊类型的关联,表示“部分-整体”关系。
  • Class2 是 Class1 的一部分。
  • Class2 的多个实例(用 * 表示)可以与 Class1 关联。
  • Class1 和 Class2 对象具有独立的生命周期。
  • 复合类一端使用空心菱形。
Aggregation
组合:

  • 一种特殊的聚合,当整体被销毁时,其部分也会被销毁。
  • Class2 对象与 Class1 同生共死。
  • Class2 无法独立存在。
  • 复合类一端使用实心菱形。
Composition
依赖:

  • 如果一个类的定义发生变化可能引起另一个类的变化(但反之不成立),则两个类之间存在依赖关系。
  • Class1 依赖于 Class2。
  • 带空心箭头的虚线。
Dependency

关系名称

  • 关系名称写在关联线的中间。
  • 良好的关系名称在朗读时具有意义:
      • “每个电子表格 包含 一些单元格”

    <li>表达式 求值为 一个值”

  • 它们通常有一个 小箭头表示读取方向,例如:表达式求值为值,但值不会求值为表达式。小箭头表示读取方向,例如:表达式求值为值,但值不会求值为表达式。

Relationship name

关系 – 角色

  • 角色定义了关联方向的目的。
  • 角色写在关联线的末端,描述了类在该关系中所扮演的角色。
    • 例如,单元格与表达式相关。这种关系的本质是表达式是单元格的公式

类成员的可见性

在面向对象设计中,属性和操作的可见性被表示出来。UML定义了四种可见性类型:公共, 受保护, – 表示私有属性或操作,以及.

属性和操作名称前的符号 +、-、# 和 ~ 表示可见性:

  • + 表示公共属性或操作
  • – 表示私有属性或操作
  • # 表示受保护的属性或操作
  • ~ 表示包级别的属性或操作

类可见性示例

Simple class

在上面的例子中:

  • MyClassName 的 attribute1 和 op1 是公共的
  • attribute3 和 op3 是受保护的
  • attribute2 和 op2 是私有的

不同类成员的访问权限如下所示:

访问级别 公共 (+) 私有 (-) 受保护 (#) 包 (~)
同一类的成员
派生类的成员
任何其他类的成员 仅限同一包

多重性

多重性表示一个类的多少个对象参与关系。它可以表示为:

  • 恰好 1 – 1
  • 零个或一个 – 0..1
  • 多个 – 0..* 或 *
  • 一个或多个 – 1..*
  • 精确数量——例如,3..4 或 6
  • 复杂关系——例如,0..1、3..4、6* 表示除2或5以外的任意数量

多重性示例

  • 需求:一个学生可以注册多门课程,而一门课程也可以有多个学生注册。
  • 在下面的示例中,类图(左)描述了上述需求的静态模型,而对象图(右)展示了软件工程和数据库管理课程注册情况的快照(类图的实例)。

Object diagram

聚合示例——计算机与组件

  • 聚合是关联的一种特殊情况,表示“包含”层次结构。
  • 聚合是父类,组件是子类。

Aggregation example

继承示例——细胞分类

  • 继承是关联的另一种特殊情况,表示“种类”层次结构。
  • 通过引入分类法,继承简化了分析模型。
  • 子类从父类继承属性和操作。

Inheritance example

类图——图示工具示例

类图可以包含附加到类或关系上的注释。注释以灰色显示。

Class diagram example

从上面的示例中,我们可以将该图解释如下:

  1. Shape 是一个抽象类。它以斜体显示。
  2. Shape 是一个父类。Circle、Rectangle 和 Polygon 都从 Shape 继承。换句话说,一个 Circle 是一个 Shape。这是一种泛化/继承关系。
  3. DialogBox 和 DataController 之间存在关联。
  4. Shape 是 Window 的一部分。这是一种聚合关系。Shape 可以独立于 Window 存在。
  5. Point 是 Circle 的一部分。这是一种组合关系。Point 不能脱离 Circle 存在。
  6. Window 依赖于 Event。但 Event 不依赖于 Window。
  7. Circle 的属性是半径和中心点。它是一个具体类。
  8. Circle 的方法包括 area()、circum()、setCenter() 和 setRadius()。
  9. Circle 中的参数 radius 类型为 float。
  10. Circle 中的 method area() 返回一个 double 值。
  11. Rectangle 的属性和方法被隐藏。图中其他一些类也隐藏了它们的属性和方法。

处理复杂系统——使用多个还是单个类图?

在建模大型系统或大型业务领域时,必须考虑许多实体。我们应该使用多个类图还是单个类图?答案是:

  • 使用多个类图比在单一图中建模每个实体及其关系要好。
  • 将系统分解为多个类图会使理解变得更加容易,尤其是当每个图都是系统特定部分的视觉表示时。

类图在软件开发生命周期中的视角

类图可以在软件开发的各个阶段使用,软件开发生命周期(SDLC)通常会逐步建模三种不同层次的细节(视角):

概念视角:该图被解释为描述现实世界中的事物。因此,如果你从概念视角出发,你会绘制一个表示所研究领域中概念的图。这些概念自然与实现它们的类相关联。这种视角是被视为与语言无关.
规范视角:该图被解释为描述具有规范和接口的软件抽象或组件,而不承诺具体的实现。因此,如果你从规范视角出发,你是在研究软件接口而非实现.
实现视角:该图被解释为描述特定技术及语言的软件实现。因此,如果你从实现视角出发,你是在研究软件实现.

现在尝试绘制一个UML类图

你已经了解了类图是什么以及如何绘制它。是时候自己动手绘制了。获取 Visual Paradigm 社区版,这是一款免费的UML工具,使用免费的类图工具创建你的类图。它易于使用且直观。
免费下载

 

Leave a Reply