0%

什么是类图

该篇文章是UML知识的扩充。

什么是类图

源文链接:https://www.visual-paradigm.com/guide/uml-unified-modeling-language/what-is-class-diagram/

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

img

一、类图的目的

  1. 显示系统中分类器的静态结构。
  2. 图为UML规定的其他结构图提供了基本的表示法。
  3. 对开发人员和其他团队成员也有帮助。
  4. 业务分析师可以使用类图从业务角度对系统建模。

UML类图由以下部分组成:一组类和一组类之间的关系。

二、什么是Class

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

  • 结构特征(属性)定义了类的对象”知道什么”
    • 表示类的对象的状态
    • 是对类的结构或静态特征的描述
  • 行为特征(操作)定义类的对象”可以做什么”
    • 定义对象交互的方式
    • 操作时对类的行为或动态特征的描述

三、Class的符号

一个Class的符号由三部分组成:

  1. Class的名称:Class的名称出现在第一个分区中
  2. Class的属性:属性显示在第二个分区中,属性类型显示在冒号之后,
  3. Class的操作(方法):操作显示在第三个分区中,它们是类提供的服务。方法的返回值类型显示在冒号之后,方法的参数类型显示在参数冒号之后。

img

Class的图形表示-MyClass如上图:

  • MyClass有3个属性和2个操作
  • 操作(方法)op1:in 表示输入参数,冒号后面表示输入参数的类型,最外层冒号表示方法返回值类型 为String。
  • 操作(方法)op2: inout 表示输入输出型参数,冒号后int表示参数类型,最外层冒号表示方法返回值类型为float。

四、Class之间的关系

一个类(Class)可能与其他类(Class)的有一种或多种关系。关系可以是一下类型之一:

4.1 关系类型

4.1.1 继承(或泛化)

img

  • 表示”is-a”关系,比如:”狗是不是动物”。
  • 抽象类名称以斜体显示。
  • SubClass1 和 SubClass2 是 SuperClass 的子类。
  • 带有空心箭头的实线,从子类指向父类。

4.1.2 简单关联

img

  • 两个对等类之间的结构链接。
  • Class1 和 Class2 之间存在关联。
  • 链接两个类的实线。

4.1.3 聚合

一种特殊类型的关联。它代表”一部分”关系。

img

  • Class2 是 Class1 的一部分。
  • Class2 的许多实例(用 * 表示)可以与 Class1 相关联。
  • Class1 和 Class2 的对象具体不同的声明周期。
  • 在关联端带有未填充菱形的实线连接到组合材料类。

4.1.4 合成

一种特殊类型的聚合,其中部分被破坏,整体被破坏。

img

  • Class2 的对象与 Class2 一起生存和死亡。
  • Class2 不能独立存在。
  • 在关联端带有实心菱形的实线连接到组合材料类。

4.1.5 依赖

img

  • 如果对一个类的定义的更改可能会导致另一个类的更改(但相反情况不适用),则依赖关系存在于两个类之间。
  • Class1 依赖于 Class2。
  • 带空心箭头的虚线相连接。

4.2 关系名称

img

  • 关系名称写在关联线的中间。

  • 当你看到UML图时,好的关系名称才有意义。

    • “每个电子表格都包含一定数量的单元格”
    • “一个表达式的计算结果是一个值”
  • 它们通常有一个小箭头来表示读取关系的方向,例如:表达式计算为值,但值不计算为表达式。

4.3 关系-角色

  • 角色是关联的定向目的。
  • 角色写在关联线的末端,描述了该类在关联关系中的作用。
  • 例如:单元格和表达式相关,这个关联关系的本质是表达式是单元格的公式。

4.4 适航性

箭头表示,给定一个关联关系的实例,是否可以确定与其相关的另一个类的实例。

上图表面:

  • 给定义一个电子表格,我们可以找到它所包含的所有单元格,但是如果给定一个单元格,我们无法确定哪个电子表格中包含它。
  • 给定一个单元格,我们可以获得相关的表达式和值,但是给定一个值(或表达式),我们无法找到具有这些属性的单元格。

五、类属性和操作的可见性

在面向对象的设计中,属性和操作的可见性表示法。在UML标识了四种类型的可见性:公共、受保护、私有和包。类中属性和操作名称前面的+-#~符号标识属性和操作的可见性。

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

类的可见性示例:

img

在上图中:

  • MyClass类中 attribute1 和 op1 是公开的,即public修饰的。
  • attribute3 是受到保护的,即protected修饰的。
  • attribute2 和 op2 是私有的,即private修饰的。

下面显示了不同类的成员对每种可见性类型的访问权限:

访问权限 公共(+) 私有(-) 受保护的(#) 包装(~)
同一类的成员 是的 是的 是的 是的
派生类的成员 是的 是的 是的
任何其他类的成员 是的 在同一包中

六、多重性

每个类中有多少个对象参与关联的多重性可以表示为:

正好一 零或一 许多 一个或多个 确切数字 或复杂关系
1 0..1 0..* 或 * 1..* 3..4 或 6 0..1、3..4、6.*
表示除了2或5以外任意数量的对象

多重性示例:

  • 要求:一个学生可以参加多门课程,一个课程又可以被许学生选择。
  • 在下面的示例中,类图(左侧)描述了上述静态模型要求的语句,而对象图(右侧)分别显示了软件工程和数据库管理课程的选择情况。

img

七、类图示例

7.1 聚合示例-计算机和部件

  • 聚合是表示”由”层次结构组成关联的特殊情况。
  • 聚合是父类,组件是子类。

img

7.2 继承示例-细胞分类

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

img

7.3 类图-关系图工具示例

类图还可以添加类或关系的注释。

img

在上面的示例中:我们可以通过阅读一下几点来解释上述类图的含义。

  1. Shape形状是一个抽象类。它以斜体显示。
  2. Shape形状是一个父类。圆形、矩形、和多边形继承自Shape。换句话说,圆形就是形状,这是一种泛化/继承关系。
  3. DialogBox 和 DataController之间存在关联。
  4. Shape形状是Window窗口的一部分。这是一种聚合关系。Shape形状可以在没有窗口的情况下存在。
  5. Point点是Circle圆的一部分。这是一种组合关系。没有圆,点就不能存在。
  6. Window窗口依赖于Event事件。但是,事件不依赖于窗口。
  7. 圆的属性是半径和中心。这是一个实体类。
  8. Circle的方法名称是area()、circum()、setCenter()、setRadius()。
  9. Circle中的参数半径是float类型的in(输入)参数。
  10. 类Circle的方法area()返回一个双精度类型的值。
  11. Rectangle的属性和方法名称处于隐藏状态。关系图中的其他一些类也隐藏了其属性和方法名称。

7.4 复杂系统的处理

不可避免地,如果您正在对大型系统或大型业务区域进行建模,则必须考虑许多实体。我们应该使用多个还是单个类图来问题进行建模?答案是:

  • 与其在单个类图上对每个实体及其关系进行建模,不如使用多个类图。
  • 将一个系统划分为多个类图可以使系统更易于理解,特别是如果每个关系图都是系统特定部分的图形表示。

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

我们可以在软件开发生命周期的不同开发阶段使用类图,并且通常通过在三个不同的角度(详细级别)中逐步建模类图:

概念视角:图表被解释为描述显示世界中的事物。因此,如果您采用概念视角,则可以绘制一个表示所研究领域中概念的图表。这些概念自然会与实现它们的类相关。概念视角被认为是与语言无关的。

规范视角:这些图被解释为描述软件抽象或具有规范和接口的组件,但没有对特定实现的承诺。因此,如果您从规范的角度来看,我们关注的是软件的接口,而不是实现。

实现视角:图表被解释为描述特定技术和语言中的软件实现。因此,如果您从实现的角度来看,我们正在他研究软件实现。

-------- The End Thanks For Reading --------