类型是对一个元素能够拥有的值的描述。类型可能是一个无限的集合,例如Integers类型(整数),理论上它的值有无限个;也可能是一个有限的集合,例如Boolean类型(布尔),它只有True和False两个值。

定义了属性的类也是类型,因为类的值(即类的实例)也是一个特定的集合,我们自己定义的类可以看作是自定义类型。

1.类 VS 数据类型

有时候我们会难以分清类和数据类型,它们都是类型,但是它们的行为不同,其主要区别在于身份的一致性。

想象一下,你有两本相同的书(同一版次的两册书),它们的所有“属性”都相同,但有两个“实体”,这本和那本,我们会说你有“两本书”。这两本书内在的属性都完全相同,但在现实世界中,你有两本书,而不是一本,在计算机世界中,有两个书的实例,而不是一个。这是类的情况。

而两个数据类型的“实例”如果相同,即数值相同,那它们就是同一个。对于简单的基本数据类型尤为如此。例如“一个”整数99与“另一个”整数99,它们是相等的,整数的集合里并不存在两个99;“一个”2024年和“另一个”2024年也是相同的,年份中也只有一个2024年。对于复杂类型,比如自定义的数据类型,情况是类似的。

2.基本类型

在UML中定义了为数不多的几个基本类型,它们分别是Integer、String、Boolean和Real,部分UML工具中提供的基本类型还包括Date和Time。



UML中的类型不与任何实际的编程语言相匹配。例如,Integer类型的存储长度,在编程语言中可能是2字节、4字节或者8字节,而在UML中它是任意长度;Boolean类型的长度不是1、4或8位,值不是0或者1,它就是True或False;String也是任意长度,不需要用null(0)表示字符串结束。

当然,如果在UML工具中使用了自动生成程序代码的功能,那么通常工具会提供相应编程语言的基本数据类型供使用,或者我们先完成模型设计再选择编程语言,那么UML工具将选择最接近编程语言中定义的数据类型完成代码生成。

3.枚举(Enumeration)

枚举是有限定值的数据类型,这些限定值是一个预先定义好的字面值,它与大多数编程语言中的枚举非常相似。定义枚举时,在图形上部区域需使用《enumeration》表明版型,并指定枚举名称;然后在其下的区域(标准名称为“literals”)中定义枚举中的各个成员。

例如我们定义一个名为VisibilityKind的枚举用于表示UML中相关对象的属性和操作的可见性,如下图所示,它有四个被允许的值Public、Private、Protected和Package,同时我们使用注释说明了这四个值在UML中的符号表示。



再如我们定义一个名为TrafficLightColorKind的枚举用于表示交通信号灯的颜色,如下图所示,它的值的限定范围则是交通信号灯的绿、黄、红三个颜色。



注:在UML规范中,枚举名称应以“Kind”作为后缀,通常我们应遵循这些规范,除非您有充足的理由使用自己定义的规则。

枚举值仅在其所属的枚举类型中有唯一标识且可被识别,不同枚举类型之间的值不具有可比性。例如有一个名为PrimaryColorKind的枚举,如下图所示,它定义了三个值:Red、Green和Blue。尽管PrimaryColorKind和TrafficLightColorKind中都定义了Green和Red,但它们并不相等(即PrimaryColorKind.Green ≠ TrafficLightColorKind.Green),甚至它们不能进行比较,因为它们是不同的类型,故而不具有可比性。



枚举也可以被继承或者泛化,就像类的继承与泛化一样。例如以下枚举DirectionalTrafficLightColorKind继承于前面定义的枚举TrafficLightColorKind。



枚举DirectionalTrafficLightColorKind定义了三个允许的值,而它又继承于定义了三个值的枚举TrafficLightColorKind,因而枚举DirectionalTrafficLightColorKind类型可用的值一共有六个。

枚举中定义的值在使用中应当被视为常量,即它不可以被改变。我们不应将其放在表达式的左侧为其赋值来改变它的值。

在UML中,我们无需关注枚举值的内部表示,它可以是字符串,由0、1或者其他值开始的整数。在代码生成工具中,一般会允许你指定这些值,但是这些并不是UML规约中的内容。

4.自定义类型(DataTypes)

前面我们介绍了基本数据类型和枚举,正如在面向对象的编程中仅使用基本数据类型和枚举是很难体现“面向对象”的,所以我们可以根据需要定义自定义类型。UML提供了这种能力与支持。

自定义类型使用版型《dataType》定义,例如下图表示我们定义表示日期的Date类型。



在Date类型中,我们指定了三个public的字段year、month、day分别用于表示年、月、日,并且通过“{}”给出了这三个字段的取值约束。为了方便Date类型的运算,也同时定义了四个public的操作。

关于自定义类型中字段的约束,更正式的表示是在一个独立的区域中说明,例如Date类型的定义如下图所示。



注:在UML规范中,每个约束用一对“{}”包含,其中“..”表示中间省略的一个区间。

UML之类型的更多相关文章

  1. UML建模类型(转载)

    区分UML模型, UML建模用于不同类型的不同的图.有三个重要类型的UML建模: 结构建模: 系统结构建模捕捉静态功能.它们包括下列各项: 类图 对象图 部署图 包图 复合结构图 组件图 结构模型代表 ...

  2. UML的类型

    分类 UML从考虑系统的不同角度出发,定义了用例图.类图.对象图.包图.状态图.活动图.序列图.协作图.构件图.部署图等10种图. 常见的UML图有用例图(Use Case Diagram).类图(C ...

  3. 使用Visio进行UML建模

    http://www.qdgw.edu.cn/zhuantiweb/jpkc/2009/rjkf/xmwd/Visio_UmlModel.htm#_Toc80417837 内容提纲: 1.VISIO中 ...

  4. UML 教程

    UML 教程 关键词:部署图, 组件图, 包图, 类图, 复合结构图, 对象图, 活动图, 状态机图, 用例图, 通信图, 交互概述图, 时序图, 时间图 简介 部署图 组件图 包图 类图 复合结构图 ...

  5. 使用包图 (UML Package Diagram) 构建模型架构

    包图用于以包包含层次结构的形式显示模型的组织方式.包图还可以显示包包含的模型元素以及包与其包含的模型元素之间的依赖关系. 在项目开发中,模型元素可能会很快达到大量数量,因此需要以某种方式构建它们,即使 ...

  6. DataUml Design 教程5-代码模板介绍(甚于T4模板技术)

    DataUml Design 代码模板全然基于C#语言来编写的. 不懂写模板的能够请教作者,随时欢迎. 以下是一段模板代码,这段代码能够获取一个类结构的全部信息.             <#@ ...

  7. IntelliJ IDEA 还能画思维导图,果然最强 IDE!

    最近栈长发现 IntelliJ IDEA 居然还能画思维导图,太牛逼了! 当然这得借助 IDEA 的 UML 插件,因为它本身也是一个 UML 图,所以这篇就从 UML 图开撕,看 IDEA 怎么画思 ...

  8. 类图示例-订单系统 / Class Diagram - Order System

    类图示例-订单系统 / Class Diagram - Order System 什么是类图? 类图通过显示它的类和它们之间的关系来概述系统.类图是静态的 - 它们显示交互的内容,但不显示交互时会发生 ...

  9. UML图基本类型

    use case model用例模型 analysiss model分析模型 design model设计模型 implementation model实现模型 deployment model部署模 ...

  10. UML课程复习重点

    第一章 一.UML图示建模工具 二.UML--统一建模语言,以图形符号为基础,描述软件模型既简洁又清晰.它不是开发方法,是独立于任何开发方法之外的语言.它用于描述软件系统分析.设计和实施中的各种模型. ...

随机推荐

  1. Android复习(四)-->权限汇总

    官方地址: https://developer.android.google.cn/reference/android/Manifest.permission#public-constructors ...

  2. ABP VNext 系列:框架启动流程以及依赖注入原理和源码分析

    简单介绍 ABP VNext Github 地址:https://github.com/abpframework/abp 官网文档地址:https://abp.io/docs/latest 官网:ht ...

  3. 云原生周刊:Score 成为 CNCF 沙箱项目|2024.7.15

    开源项目 Trident Trident 是由 NetApp 维护的全面支持的开源项目.它从头开始设计,旨在通过行业标准接口(如容器存储接口 CSI)帮助您满足容器化应用程序对持久性存储的需求. Mo ...

  4. K8s GPU 资源管理探索:在 KubeSphere 上部署 AI 大模型 Ollama

    作者:运维有术星主 随着人工智能.机器学习.AI 大模型技术的迅猛发展,我们对计算资源的需求也在不断攀升.特别是对于需要处理大规模数据和复杂算法的 AI 大模型,GPU 资源的使用变得至关重要.对于运 ...

  5. Readme 《Machine Learning by Andrew NG》

    本文系列内容是吴恩达老师的机器学习公开课的文本对应.需要具备英文,微积分,线性代数,程序设计的基础.从第二周开始有编程作业,到第九周.总共8个作业.感谢吴恩达老师⸜₍๑•⌔•๑ ₎⸝ 2021年9月1 ...

  6. 蓝屏攻击 MS12-020

    目录 1.蓝屏攻击 MS12-020 搜索对应活跃主机win7蓝屏漏洞端口 Nessus 执行漏洞扫描 Metasploit 漏洞利用 msfconsole Armitage 1.蓝屏攻击 MS12- ...

  7. 《HelloGitHub》第 103 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. github.com/521xueweihan/HelloG ...

  8. 一文解秘Rust如何与Java互操作

    本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议.转载请注明来自 唯你 使用场景 JAVA 与 Rust 互操作让 Rust 可以背靠 Java 大生态来做更多事情,而 Jav ...

  9. 机器学习框架推理流程简述(以一项部署在windows上的MNN框架大模型部署过程为例子)

    一.写在前面 公司正好有这个需求,故我这边简单接受进行模型的部署和demo程序的编写,顺便学习了解整个大模型的部署全流程.这篇博客会简单提到大模型部署的全流程,侧重点在推理这里.并且这篇博客也是结合之 ...

  10. MagicQuill,AI动态图像元素修改,AI绘图,需要40G的本地硬盘空间,12G显存可玩,Win11本地部署

    最近由 magic-quill 团队开源的 MagicQuill 项目十分引人瞩目,这个项目可以通过定制的 gradio 客户端针对不同的图像元素通过提示词进行修改,从而生成新的图像.值得一提的是,这 ...