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)

  1. 定义
    • 聚合关系也是一种“整体-部分”的关联,但语义较弱,表示一个对象是另一个对象的一部分,但部分对象的生命周期与整体对象无关。
  2. 示例
    • Classe(班级)和Enfant(学生)之间的关系:
      • 每个班级包含多个学生(*****)。
      • 每个学生属于一个班级(1)。
      • 如果班级被销毁,学生不会被销毁


  • 聚合或复合关系的作用对象是具体对象而非类本身。
    • Professeur(教授)和Enfant(学生)不可以是Personne(人)类的部分。
    • 这种关系表示一个对象(如Professeur)可能由多个具体对象(如多个Enfant)构成,而不是类的关系。

关联类(Classe d'association)

关联类是一种特殊的类,用于为两个类之间的链接赋予额外的特性或属性。

Niveau 是一个关联类,连接了ProfesseurEnfant,并扩展了他们之间的关系。

  • 实线表示NiveauProfesseurEnfant的直接关系。
  • 虚线表示NiveauMatière的扩展性关联。

泛化/专化(Généralisation/Spécialisation)


泛化是一种继承关系,表示一种“是(is-a)”的关系。子类继承父类的所有属性和操作。


实例化≠专化(Instanciation ≠ Spécialisation)

  • 实例化:指的是基于类创建具体对象的过程。
    • YvainGauvainEnfant类的具体实例。

状态≠专化(État ≠ Spécialisation)

  • 类的状态变化与专化无关。
    • Enfant可以根据状态分为EnfantAttentif(专注的孩子)和EnfantEndormi(睡着的孩子),但这些状态不等同于类的专化。
    • 状态表示对象的动态属性,而专化是类之间的静态关系。

接口(Interface)


  • 接口是一组公开特性(public characteristics)的集合,表示服务的抽象描述。
  • 接口由一个或多个类“实现(réalisée)”。

对象约束语言(Object Constraint Language, OCL)


  • OCL用于为UML模型添加约束,描述类的行为或状态。
  • 常用于表达复杂逻辑,如类之间的关系、属性约束等。
  1. 示例约束
    • 约束Client类的规则:

      1
      2
      3
      4
      5
      ocl
      复制代码
      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):

    • 箭头表示对象之间发送的消息。
    • 消息描述
      1. 控制器通过 getLigne(ligne=0, colonne=0) 调用棋盘对象的 getLigne 方法以获取某行信息。
      2. 棋盘对象将请求传递给其格子对象(l0c0),调用其 getLigne 方法。
      3. 格子对象进一步调用端点对象(e_rouge_1)的 getLigneDepart 方法,以获取起始线的信息。
      4. 端点对象通过 setDepart 方法,将起始点信息设置到颜色对象(rouge)。
      5. 最终返回线条对象(l_rouge),并通过消息逐级传递返回到控制器。