3-3 抽象数据类型ADT

本次课程的目的▪ 抽象数据类型和表示独立性:使我们能够将如何在程序中使用数据结构与数据结构本身的特定形式区分开来。抽象数据类型解决了一个特别危险的问题:客户对类型的内部表示进行假设。–我们将了解为什么这是危险的,以及如何避免。–我们还将讨论操作的分类,以及抽象数据类型的一些良好设计原则。▪ 不变量、rep暴露、抽象函数(AF)和表示不变量(RI)–通过抽象函数和表示不变量的概念,对类实...
摘要由CSDN通过智能技术生成

本次课程的目的
▪ 抽象数据类型和表示独立性:使我们能够将如何在程序中使用数据结构与数据结构本身的特定形式区分开来。
抽象数据类型解决了一个特别危险的问题:客户对类型的内部表示进行假设。
–我们将了解为什么这是危险的,以及如何避免。
–我们还将讨论操作的分类,以及抽象数据类型的一些良好设计原则。

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

1抽象和用户定义类型
用户定义的类型
▪ 一种编程语言带有内置类型(如整数、布尔值、字符串等)和内置过程(如输入和输出)。
▪ 用户可以定义自己的数据类型和过程-用户定义的类型。

数据抽象
▪ 数据抽象:类型的特征是可以对其执行的操作。
–一个数字是可以加和乘的;
–一个字符串是可以连接并取的子字符串;
▪ 传统上,程序员用早期的编程语言定义自己的类型,例如:创建记录类型date,其中包含日期、月份和年份的整数字段。
▪ 抽象类型专注于操作——该类型的用户不必担心它的值实际上是如何存储的,程序员可以忽略编译器实际上是如何存储整数的。重要的是操作。

抽象数据类型Bool有以下操作:
–true:Bool
–false:Bool
–and:Bool×Bool→Bool
–or:Bool×Bool→Bool
–not:Bool→Bool
▪ Bool有很多可能的实现方式,并且仍然能够满足操作规范,例如:–作为一个位,1表示true,0表示false。–作为int值,其中5表示真,8表示假。
–作为对字符串对象的引用,其中“false”表示true,“true”表示false。
–当int值大于1时,质数表示真,复合数表示假。

操作本身(及其规范)完全定义了数据类型,从数据结构、内存存储或实现的细节中抽象出来。

抽象类型由其操作定义
▪ 记住——抽象数据类型是由其操作定义的。
–T类型的操作集及其规范完全描述了T的含义。
▪ 当我们讨论列表类型时,我们指的不是链表、数组或任何其他用于表示列表的特定数据结构。
▪ 相反,我们指的是一组不透明的对象(可能是具有列表类型的对象),它们满足List:get()、size()等所有操作的规范。

在这里插入图片描述

2分类类型和操作

可变和不可变类型
▪ 无论是内置的还是用户定义的Type,都可以分为可变的或不可变的。
–可变类型的对象可以更改:也就是说,它们提供的操作在执行时会导致同一对象上其他操作的结果产生不同的结果。
–日期是可变的,因为可以调用setMonth()并使用getMonth()操作观察更改。
–但是字符串是不可变的,因为它的操作创建了新的字符串对象,而不是更改现有的对象。
–有时类型将以两种形式提供,一种是可变的,另一种是不可变的。例如,StringBuilder是String的可变版本.

对抽象类型的操作进行分类
▪ 创建者创建该类型的新对象。
–创建者可以将对象作为参数,但不能将其作为正在构造的类型的对象。
▪ 生产者从该类型的旧对象创建新对象。
–例如,String的concat()方法是一个生产者:它接受两个字符串并生成一个表示它们的连接的新字符串。
▪ Observerstake抽象类型的对象并返回不同类型的对象。
–例如,List的size()方法返回一个int。
▪ 变换器更改对象。
–例如,List的add()方法通过在末尾添加元素来改变列表。

▪ 创建者:t→t
▪ 生产者:T+,T
→T
▪ 观察者:T+,T→T
▪ 改变者:T+,T
→void| T | T
▪ 每个T都是抽象类型本身;
▪ 每个t都是另一种类型。
▪ +标记表示该类型可能在签名的该部分出现一次或多次。
▪ *标记表示它出现零次或多次。
▪ |表示或。
在这里插入图片描述

创造者
▪ creator要么像new ArrayList()一样实现为构造函数,要么只是一个静态方法,像Arrays.as List(),List.of()。
构造器:可能实现为构造函数或静态 函数
▪ 作为静态方法实现的创建者通常称为工厂方法
▪ Java中的各种String.valueOf(Object Obj)方法是作为工厂方法实现的创建者的其他示例。

▪ mutator通常由void返回类型发出信号。
–如果返回值为void,则必然意 味着它改变了对象的某些内部状态
▪ 但并不是所有的变异都返回无效。
–例如,Set.add()返回一个布尔值,该布尔值指示集是否已实际更改。
–在Java的图形用户界面工具包中,Component.add()返回对象本身,以便可以将多个add()调用链接在一起。

3抽象数据类型示例
int和String
▪ int是不可变的,所以它没有mutator
–创建者:数字文本0,1,2,…
–生产者:算术运算符+,-,*,/
–观察者:比较运算符=!=,<,>
-mutator:无(不可变)
▪ String是Java的字符串类型。字符串是不可变的。
–创建者:字符串构造函数
–生产者:concat、substring、toUpperCase
–观察者:length、charAt
–mutators:none

列表
▪ List是Java的列表类型,并且是可变的。
▪ List也是一个接口,这意味着其他类提供数据类型的实际实现,例如ArrayList和LinkedList。
–创建者:ArrayList和LinkedList构造函数,Collections.singletonList
–生产者:Collections.unmodifiableList
–观察者:size,get
–mutators:add,remove,addAll,Collections.sort
在这里插入图片描述
4设计抽象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值