抽象数据类型(Abstract Data Type,ADT)是计算机科学中具有类似行为的特定类别的数据结构的数学模型;或者具有类似语义的一种或多种程序设计语言的数据类型。抽象数据类型是描述数据结构的一种理论工具,其目的是使人们能够独立于程序的实现细节来理解数据结构的特性。抽象数据类型的定义取决于它的一组逻辑特性,而与计算机内部如何表示无关。
抽象数据类型与表示独立性:
能够分离程序中数据结构的形式和对其使用的方式,如何设计良好的抽象数据结构,通过封装来避免客户端获取数据的内部表示(即“表示泄露”),避免潜在的bug—— 在client 和implementer 之间建立“防火墙”。
而ADT也具有一定的特性:ADT 的特性:不变量、表示泄漏、抽象函数AF 、表示不变量RI
表示空间R:实现者看到和使用的值。
抽象空间A:client看到和使用的值。
抽象函数AF:R和A之间映射关系的函数,即如何将R中的每一个值解释为A中的每一个值。
注意,AF必定是一个满射,但不一定是单射。
表示不变性RI:所有表示值的一个子集,包含了所有合法的表示值。也可以将其看作一个条件,描述了什么是“合法”的表示值。
注意:
同样的表示空间R,可以有不同的RI。
Abstraction and User-Defined Types 用户自己设计数据类型
除了编程语言所提供的基本数据类型和对象数据类型,程序员可定义
自己的数据类型。
以数据抽象为例:数据抽象:由一组操作所刻画的数据类型。
– A number is something you can add and multiply;
数字就是可以用于加法和乘法操作的对象。
– A string is something you can concatenate and take substrings of;
字符串就是可以用于连接和截取的对象。
程序员在定义自己的数据类型的时候只关心设计、操作:抽象类型:强调“作用于数据上的操作”,程序员和client无需关心数据如何具体存储的,只需设计/使用操作即可。
抽象类型操作的分类
构造器:创建该类的新对象。creator : t* → T
生产器:从该类型的旧对象中创建新对象。producer : T+, t*→T
观察器:获取抽象类型的对象,并返回不同类型的对象。observer : T+, t*→t
变值器:改变对象属性的方法。mutator : T+, t*→void | t | T
其中T是抽象数据类型本身,t是别的类型,+表示该类型可能在签名的该部分中出现一次或多次,*表示它发生了零次或更多次,|表示或。
不变量:程序在任何时候总是true的性质。
为什么需要不变量:保持程序的“正确性”,容易发现错误。
表示泄露: 不仅影响不变量,也影响了表示独立性:无法在不影响客户
端的情况下改变其内部表示。
防止表示泄露:
例如:
1.确保不会返回任何可变对象的直接引用,可以防御拷贝。
2.使用关键字private让rep对外不可见。