类型是对一个元素能够拥有的值的描述。类型可能是一个无限的集合,例如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. 现代化 React UI 库:Material-UI 详解!

    随着 React 在前端开发中的流行,越来越多的 UI 框架和库开始涌现,以帮助开发者更高效地构建现代化.响应式的用户界面.其中,Material-UI 是基于 Google Material Des ...

  2. 记录一次edu的小通杀

    记录一次edu的小通杀 fofa查询随便点的一个虚拟仿真实训系统,存在多处未授权.逻辑漏洞,并且存在文件上传漏洞导致getshell,检索下来差不多十几个学校在用 从虚拟仿真系统入手感觉容易一些,一个 ...

  3. 自建互联网档案馆「GitHub 热点速览」

    这两天北京的气温骤降,仿佛在提醒我们冬日的脚步已悄然而至,让人不禁感叹时间的飞逝,一年的时间"转瞬即逝". 如果你想留下互联网上的珍贵瞬间,避免它们消失在 404 错误中.这款开源 ...

  4. Go语言学习 _基础03 _数组和切片

    Go语言学习 _基础03 _数组和切片 1.数组 package array_test import "testing" func TestArrayInit(t *testing ...

  5. Java基础完结

    花费了大概一周的时间,看完了韩顺平的Java基础课,不得不说韩老师讲的java基础还是相当仔细的,细节满满,我认为这既是优点也是缺点吧23333333-- 接下来准备看老杜的MySQL,因为没有配套的 ...

  6. 别再被多线程搞晕了!一篇文章轻松搞懂 Linux 多线程同步!

    前言 大家有没有遇到过,代码跑着跑着,线程突然抢资源抢疯了?其实,这都是"多线程同步"在作怪.多线程同步是个老生常谈的话题,可每次真正要处理时还是让人头疼.这篇文章,带你从头到尾掌 ...

  7. openEuler搭建k8s(1.28.2版本)

    目录 k8s搭建(1.28.2版本) 1. 安装containerd 1.1 下载tar包 1.2 编写服务单元文件 2. 安装runc 3. 安装cni插件 3.1 下载文件 3.2 设置crict ...

  8. J2eefast页面调试状态下自动进入debugger断点

    将fastJS.min.js 替换为 fastJs.js 将所使用到的模块的min.js 替换为js文件

  9. How to disable ipv6 in ubuntu

    To disable ipv6, you have to open /etc/sysctl.conf using any text editor and insert the following li ...

  10. java——棋牌类游戏斗地主(singleddz3.0)

    这是本人最近一段时间写的斗地主的java代码,大体框架都实现了,主要缺少,AI的智能算法. 下载地址http://download.csdn.net/detail/novelly/5695445 im ...