6 抽象数据类型

抽象数据类型与表示独立性:设计良好的抽象数据结构,通过封装来避免客户端获取数据的内部表示(即“表示泄露”),避免潜在的bug——在client和implementer之间建立“防火墙”

ADT的特性:表示泄露、抽象函数(AF)和表示不变量(RI)
–通过抽象函数和rep不变量的概念,对类实现ADT意味着什么给出更正式的数学概念。
–这些数学概念在软件设计中非常实用。
–抽象函数将为我们提供一种清晰定义抽象数据类型上的相等操作的方法。
–rep不变量将更容易捕获由损坏的数据结构引起的错误。

1 抽象和用户定义类型

除了编程语言所提供的基本数据类型和对象数据类型,程序员可定义自己的数据类型

数据抽象:由一组操作所刻画的数据类型

传统的类型定义:关注数据的具体表示

抽象类型:强调“作用于数据上的操作”,程序员和client无需关心数据如何具体存储的,只需设计/使用操作即可。也就是说,ADT是由操作定义的,与其内部如何实现无关!

例如:

抽象数据类型Bool,操作本身(及其规范)完全定义了数据类型,从数据结构、内存存储或实现的细节中抽象出来。有许多可能的方法可以实现Bool,并且仍然能够满足操作规范:
–作为单个 位bit,其中1表示真,0表示假。
–作为int值,其中5表示true,8表示false。
–作为对字符串对象的引用,其中“false”表示true和“true”
表示错误。
–作为大于1的int值,其中素数表示真,复合数表示假。

在这里插入图片描述

类型T的操作集及其规范充分描述了我们所指的T。
当我们谈论List类型时,我们的意思不是链表、数组或任何其他表示列表的特定数据结构。
相反,我们指的是一组不透明的值–可能具有满足List:get(),size()所有操作规范的列表类型的可能对象。

2 分类类型和操作

I.类型可以分类为可变的或不可变的

->可变类型的对象可以更改:也就是说,它们提供的操作在执行时会导致同一对象上其他操作的结果产生不同的结果。
比如Date是可变的,因为可以调用setMonth()并使用getMonth()操作观察更改。
但String是不可变的,因为它的操作会创建新的String对象,而不是更改现有的对象。
->有时类型将以两种形式提供,一种是可变形式,另一种是不可变形式。例如,StringBuilder是字符串的可变版本。

II.对抽象类型的操作进行分类

①creators 构造器 t → T*(由其他类型对象产生该类型新对象)

构造器创建该类型的新对象,可以将对象作为参数,但不能将其作为正在构造的类型的对象

②producers 生产器 T+, t → T* (由该类型对象,其他类型对象,产生该类型新对象)

生产器从该类型的旧对象创建新对象。
例如,String的concat()方法是一个生产器,它接受两个字符串并生成一个表示其串联的新字符串。

③observers 观察器 T+, t → t*(由该类型对象,其他类型对象,产生其他类型对象)

获取抽象类型的对象并返回不同类型的对象
例如,List的size()方法返回一个int。

④mutators 变值器 T+, t → void | t | T*(由该类型对象,其他类型对象,修改该类型对象,并得到其他类型对象或该类型对象或无返回)

改变对象属性的方法

例如,List的add()方法通过在列表末尾添加元素来改变列表

符号说明:

每个T都是抽象类型本身;
每个t都是其他类型。
+表示该类型可能在函数签名(名字+参数+返回值)的该部分出现一次或多次
*表示它出现零次或多次
|表示或。

III.对构造器、变值器的额外说明

构造器要么实现为构造函数,比如new ArrayList()(->T) 或者只是一个静态方法,如
Arrays.asList(),List.of()(t->T)。作为静态方法实现的构造器通常称为工厂方法
各种String.valueOf(Object Obj)方法是作为工厂方法实现的构造器的其他示例。与

Object.toString()正好是相对的(这个是 ->T)。

变值器通常返回void,如果返回值为void,则必然意味着它改变了对象的某些内部状态。

当然,变值器也可能返回非空类型 。

例如,set.add()返回一个bool值,指示集合是否已实际更改

Component.add()返回对象本身,以便将多个add()调用链接在一起(链式编程)

3 抽象数据类型示例

①int

构造器:数字常量0、1、2、…
生产器:算术运算符+,-,*,/
观察器:比较运算符==,&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值