J02 统一建模语言 UML
J02 统一建模语言 UML
简介
概述
统一建模语言(Unified Modeling Language, UML
)是一种计算机建模语言
- 以图形化的符号表示系统的结构与行为
- 由对象管理组织(
OMG
)制定的标准语言,支持多种建模工具,同时具备良好的可扩展性
语言的定义
UML 作为一种语言,由以下部分组成:
- 基本元素:包括词汇和构造元素,是语言的基本构建块。
- 抽象语法:定义如何从现有元素中构造新元素的规则。
- 具体语法:定义元素的呈现方式(例如符号或标记)。
- 语义:为基本元素和构造元素赋予意义,这些语义可以是正式的或非正式的。
模型与图表
- 模型:一个包含建模元素的集合,用于描述系统的特定方面。
- 图表:模型的子集,通过图形表示选定的建模元素。图表聚焦于模型的某一特定视角,但并不完整表示模型本身。
- 建模元素的关系:建模元素可以出现在零个、一个或多个图表中。删除图表中的元素不等于从模型中移除该元素。
建模元素的组织
- 包(
Paquetage
):一种管理建模元素的组织机制,适用于结构实体、行为实体及其他包的管理。 - 包之间的依赖关系:用于描述包之间的联系。
- 相互依赖:不良的建模实践,建议尽量消除包之间的相互依赖。
UML类图
类图是UML标准图示中的一种结构图。类图不仅用于可视化,描述和记录一个系统的不同方面,而且还用于构建软件应用程序的可执行代码。
类图显示了类的集合、接口、关联、协作和约束
简介
结构化建模
- 对象图
diagramme d’objets
描述某个系统在某一特定时刻的状态,包含:- 对象
- 它们的特性
caractéristiques
- 它们的连接 ****
liens
- 类图
diagramme de classes
显示系统的抽象(概念描述),包含:- 类(潜在的对象)及其特性
- 它们的关联
associations
(潜在的链接)
对象图&连接 VS 类图&关联
类
类使用矩形表示,矩形可以包括区块(通常为1个或3个)。
- 第一部分:类名(Nom de la classe)
- 第二部分:属性(Attributs)
- 第三部分:操作(Opérations)
- 可以附加注释(Note/Commentaire)以提供补充说明。
属性
基本形式:\(可见性名称(类型,默认值)\)
- 示例:
+niveau : String = "cp"
可见性(Visibilité
)
+public
:公有privé
:私有#protégé
:受保护~paquetage
:包级别
属性类型(Types en UML)
- 基本类型:如
Integer
,String
,Boolean
,Real
,UnlimitedNatural
- 数据类型(DataType):值的集合(无身份)。
- 枚举类型(Enumérations):名称或文字的集合。
- 类(Classes):可以包含身份的复杂类型。
连接Lien和关联association
连接(Lien)
- 连接是两个对象之间的关系,用于实现对象间的交互,例如消息的发送。
关联(Association)
- 关联是两个类之间的关系,表示这些类的对象之间可能存在的连接
- 双向性:关联默认是双向
bidirectionnelle
的,即使文本描述有方向性,也可表示出具体的导航性navigabilité
(作为设计细节)。
由于关联和属性都能表示两个类的关系,不应重复使用
一般在分析阶段使用关联,在设计阶段使用属性。
角色 Rôle
- 角色是关联(Association)的一端,用于描述关联两端的具体特性。
- 一个关联可以有两个或多个角色(n 元关联),但实际建模中通常只考虑两个角色的关联。
- 每个角色都提供关联的核心信息,如:
- 名称(用于“导航”)。
- 相关对象的数量(即多重性或基数)。
- 基数(Cardinalité)表示某个角色一端可能涉及的对象数量。
- 多重性(Multiplicité)表示角色之间的潜在数量关系,(min..max,用*表示不限)
特性
- 可见性
- 支持
+public
(公有)、privé
(私有)、#protégé
(受保护)和~paquetage
(包级别)。
- 支持
- 类角色(
de classe
)- 角色可以是静态的,与类关联而非实例关联。
- 派生角色(
dérivé
)- 角色可以从其他角色或关联中派生,用
/
符号标记。
- 角色可以从其他角色或关联中派生,用
- 约束(
Contraintes
){ordered}
:如果某个角色涉及多个链接,则这些链接是有序的。{readonly}
:角色的关联不可修改。{unique}
:角色的关联对象无重复项,即每个对象唯一。
复合关系(Composition)和聚合关系(Agrégation)
复合关系(Composition)
- 复合关系是一种“整体-部分”的强关联,表示一个对象是另一个对象的组成部分,并且具有严格的归属关系。
- 如果整体被销毁,部分对象也随之被销毁
- 如
École
(学校)和Classe
(班级)之间的关系:- 每所学校包含多个班级(
*
)。 - 一个班级属于且仅属于一所学校(
1
)。 - 班级的概念依赖于学校,如果学校被销毁,则班级被销毁
- 每所学校包含多个班级(
聚合关系(Agrégation)
- 定义:
- 聚合关系也是一种“整体-部分”的关联,但语义较弱,表示一个对象是另一个对象的一部分,但部分对象的生命周期与整体对象无关。
- 示例:
Classe
(班级)和Enfant
(学生)之间的关系:- 每个班级包含多个学生(**
***
)。 - 每个学生属于一个班级(
1
)。 - 如果班级被销毁,学生不会被销毁
- 每个班级包含多个学生(**
- 聚合或复合关系的作用对象是具体对象而非类本身。
Professeur
(教授)和Enfant
(学生)不可以是Personne
(人)类的部分。- 这种关系表示一个对象(如
Professeur
)可能由多个具体对象(如多个Enfant
)构成,而不是类的关系。
关联类(Classe d'association)
关联类是一种特殊的类,用于为两个类之间的链接赋予额外的特性或属性。
Niveau
是一个关联类,连接了Professeur
和Enfant
,并扩展了他们之间的关系。
- 实线表示
Niveau
与Professeur
和Enfant
的直接关系。 - 虚线表示
Niveau
与Matière
的扩展性关联。
泛化/专化(Généralisation/Spécialisation)
泛化是一种继承关系,表示一种“是(is-a)”的关系。子类继承父类的所有属性和操作。
实例化≠专化(Instanciation ≠ Spécialisation)
- 实例化:指的是基于类创建具体对象的过程。
Yvain
和Gauvain
是Enfant
类的具体实例。
状态≠专化(État ≠ Spécialisation)
- 类的状态变化与专化无关。
Enfant
可以根据状态分为EnfantAttentif
(专注的孩子)和EnfantEndormi
(睡着的孩子),但这些状态不等同于类的专化。- 状态表示对象的动态属性,而专化是类之间的静态关系。
接口(Interface)
- 接口是一组公开特性(public characteristics)的集合,表示服务的抽象描述。
- 接口由一个或多个类“实现(réalisée)”。
对象约束语言(Object Constraint Language, OCL)
- OCL用于为UML模型添加约束,描述类的行为或状态。
- 常用于表达复杂逻辑,如类之间的关系、属性约束等。
- 示例约束:
约束
Client
类的规则:1
2
3
4
5ocl
复制代码
context Client inv:
self.comptes->forAll(c : Compte | self.banques->includes(c.banque))含义:
Client
的每个账户(compte
)必须关联到属于客户的银行(banque
)。
一个例子
- 一所小学位于一个市镇(名称、邮政编码)内,由多个班级组成。
- 一个班级包含同一年级的学生:CP、CE1、CE2、CM1、CM2。
- 每个班级都有一位负责的教师。
- 在该校任教的教师中,有一位担任校长或校长助理的角色。
- 每位学生有一位或两位指定的监护人。
- 班级的课程内容由其年级确定;课程内容包括一组具体的能力要求。
- 在学年结束时,每个班级的教师会根据该年级的能力要求,为班级中每位学生的每项能力评定成绩。
UML序列图
泳道(Lifelines):
- 每个垂直虚线代表一个对象或类的实例,包括:
- contrôleur : Controleur(控制器)
- plateau : Plateau(棋盘/游戏板)
- l0c0 : Case(棋盘上的格子)
- e_rouge_1 : Extremite(红色端点)
- rouge : Couleur(颜色:红色)
- l_rouge : Ligne(红色线条)
它们代表了在该场景中参与交互的主要实体。
- 每个垂直虚线代表一个对象或类的实例,包括:
消息(Messages):
- 箭头表示对象之间发送的消息。
- 消息描述:
- 控制器通过
getLigne(ligne=0, colonne=0)
调用棋盘对象的getLigne
方法以获取某行信息。 - 棋盘对象将请求传递给其格子对象(
l0c0
),调用其getLigne
方法。 - 格子对象进一步调用端点对象(
e_rouge_1
)的getLigneDepart
方法,以获取起始线的信息。 - 端点对象通过
setDepart
方法,将起始点信息设置到颜色对象(rouge
)。 - 最终返回线条对象(
l_rouge
),并通过消息逐级传递返回到控制器。
- 控制器通过