该篇文章是UML知识的扩充。
什么是类图
源文链接:https://www.visual-paradigm.com/guide/uml-unified-modeling-language/what-is-class-diagram/
在软件工程中,统一建模语言(UML)中的类图是一种静态结构图,它通过显示系统的类、它们的属性、操作(或方法)以及对象之间的关系来描述系统的结构。
一、类图的目的
- 显示系统中分类器的静态结构。
- 图为UML规定的其他结构图提供了基本的表示法。
- 对开发人员和其他团队成员也有帮助。
- 业务分析师可以使用类图从业务角度对系统建模。
UML类图由以下部分组成:一组类和一组类之间的关系。
二、什么是Class
对系统中具有相似角色的一组对象的描述,包括:
- 结构特征(属性)定义了类的对象”知道什么”
- 表示类的对象的状态
- 是对类的结构或静态特征的描述
- 行为特征(操作)定义类的对象”可以做什么”
- 定义对象交互的方式
- 操作时对类的行为或动态特征的描述
三、Class的符号
一个Class的符号由三部分组成:
- Class的名称:Class的名称出现在第一个分区中
- Class的属性:属性显示在第二个分区中,属性类型显示在冒号之后,
- Class的操作(方法):操作显示在第三个分区中,它们是类提供的服务。方法的返回值类型显示在冒号之后,方法的参数类型显示在参数冒号之后。
Class的图形表示-MyClass如上图:
- MyClass有3个属性和2个操作
- 操作(方法)op1:in 表示输入参数,冒号后面表示输入参数的类型,最外层冒号表示方法返回值类型 为String。
- 操作(方法)op2: inout 表示输入输出型参数,冒号后int表示参数类型,最外层冒号表示方法返回值类型为float。
四、Class之间的关系
一个类(Class)可能与其他类(Class)的有一种或多种关系。关系可以是一下类型之一:
4.1 关系类型
4.1.1 继承(或泛化)
- 表示”is-a”关系,比如:”狗是不是动物”。
- 抽象类名称以斜体显示。
- SubClass1 和 SubClass2 是 SuperClass 的子类。
- 带有空心箭头的实线,从子类指向父类。
4.1.2 简单关联
- 两个对等类之间的结构链接。
- Class1 和 Class2 之间存在关联。
- 链接两个类的实线。
4.1.3 聚合
一种特殊类型的关联。它代表”一部分”关系。
- Class2 是 Class1 的一部分。
- Class2 的许多实例(用 * 表示)可以与 Class1 相关联。
- Class1 和 Class2 的对象具体不同的声明周期。
- 在关联端带有未填充菱形的实线连接到组合材料类。
4.1.4 合成
一种特殊类型的聚合,其中部分被破坏,整体被破坏。
- Class2 的对象与 Class2 一起生存和死亡。
- Class2 不能独立存在。
- 在关联端带有实心菱形的实线连接到组合材料类。
4.1.5 依赖
- 如果对一个类的定义的更改可能会导致另一个类的更改(但相反情况不适用),则依赖关系存在于两个类之间。
- Class1 依赖于 Class2。
- 带空心箭头的虚线相连接。
4.2 关系名称
关系名称写在关联线的中间。
当你看到UML图时,好的关系名称才有意义。
- “每个电子表格都包含一定数量的单元格”
- “一个表达式的计算结果是一个值”
它们通常有一个小箭头来表示读取关系的方向,例如:表达式计算为值,但值不计算为表达式。
4.3 关系-角色
- 角色是关联的定向目的。
- 角色写在关联线的末端,描述了该类在关联关系中的作用。
- 例如:单元格和表达式相关,这个关联关系的本质是表达式是单元格的公式。
4.4 适航性
箭头表示,给定一个关联关系的实例,是否可以确定与其相关的另一个类的实例。
上图表面:
- 给定义一个电子表格,我们可以找到它所包含的所有单元格,但是如果给定一个单元格,我们无法确定哪个电子表格中包含它。
- 给定一个单元格,我们可以获得相关的表达式和值,但是给定一个值(或表达式),我们无法找到具有这些属性的单元格。
五、类属性和操作的可见性
在面向对象的设计中,属性和操作的可见性表示法。在UML标识了四种类型的可见性:公共、受保护、私有和包。类中属性和操作名称前面的+
、-
、#
、~
符号标识属性和操作的可见性。
+
表示公共属性或操作-
表示私有属性或操作#
表示受保护的属性或操作~
表示包属性或操作
类的可见性示例:
在上图中:
- MyClass类中 attribute1 和 op1 是公开的,即public修饰的。
- attribute3 是受到保护的,即protected修饰的。
- attribute2 和 op2 是私有的,即private修饰的。
下面显示了不同类的成员对每种可见性类型的访问权限:
访问权限 | 公共(+) | 私有(-) | 受保护的(#) | 包装(~) |
---|---|---|---|---|
同一类的成员 | 是的 | 是的 | 是的 | 是的 |
派生类的成员 | 是的 | 否 | 是的 | 是的 |
任何其他类的成员 | 是的 | 否 | 否 | 在同一包中 |
六、多重性
每个类中有多少个对象参与关联的多重性可以表示为:
正好一 | 零或一 | 许多 | 一个或多个 | 确切数字 | 或复杂关系 |
---|---|---|---|---|---|
1 | 0..1 | 0..* 或 * | 1..* | 3..4 或 6 | 0..1、3..4、6.* 表示除了2或5以外任意数量的对象 |
多重性示例:
- 要求:一个学生可以参加多门课程,一个课程又可以被许学生选择。
- 在下面的示例中,类图(左侧)描述了上述静态模型要求的语句,而对象图(右侧)分别显示了软件工程和数据库管理课程的选择情况。
七、类图示例
7.1 聚合示例-计算机和部件
- 聚合是表示”由”层次结构组成关联的特殊情况。
- 聚合是父类,组件是子类。
7.2 继承示例-细胞分类
- 继承是表示”某种”层次结构的关联的另一个特殊情况。
- 继承通过引入分类法简化了分析模型。
- 子类继承父类的属性和操作。
7.3 类图-关系图工具示例
类图还可以添加类或关系的注释。
在上面的示例中:我们可以通过阅读一下几点来解释上述类图的含义。
- Shape形状是一个抽象类。它以斜体显示。
- Shape形状是一个父类。圆形、矩形、和多边形继承自Shape。换句话说,圆形就是形状,这是一种泛化/继承关系。
- DialogBox 和 DataController之间存在关联。
- Shape形状是Window窗口的一部分。这是一种聚合关系。Shape形状可以在没有窗口的情况下存在。
- Point点是Circle圆的一部分。这是一种组合关系。没有圆,点就不能存在。
- Window窗口依赖于Event事件。但是,事件不依赖于窗口。
- 圆的属性是半径和中心。这是一个实体类。
- Circle的方法名称是area()、circum()、setCenter()、setRadius()。
- Circle中的参数半径是float类型的in(输入)参数。
- 类Circle的方法area()返回一个双精度类型的值。
- Rectangle的属性和方法名称处于隐藏状态。关系图中的其他一些类也隐藏了其属性和方法名称。
7.4 复杂系统的处理
不可避免地,如果您正在对大型系统或大型业务区域进行建模,则必须考虑许多实体。我们应该使用多个还是单个类图来问题进行建模?答案是:
- 与其在单个类图上对每个实体及其关系进行建模,不如使用多个类图。
- 将一个系统划分为多个类图可以使系统更易于理解,特别是如果每个关系图都是系统特定部分的图形表示。
7.5 软件开发生命周期中类图的视角
我们可以在软件开发生命周期的不同开发阶段使用类图,并且通常通过在三个不同的角度(详细级别)中逐步建模类图:
概念视角:图表被解释为描述显示世界中的事物。因此,如果您采用概念视角,则可以绘制一个表示所研究领域中概念的图表。这些概念自然会与实现它们的类相关。概念视角被认为是与语言无关的。
规范视角:这些图被解释为描述软件抽象或具有规范和接口的组件,但没有对特定实现的承诺。因此,如果您从规范的角度来看,我们关注的是软件的接口,而不是实现。
实现视角:图表被解释为描述特定技术和语言中的软件实现。因此,如果您从实现的角度来看,我们正在他研究软件实现。