Loading

第六章 抽象数据类型

Reading Sources

Objectives

ADT 表示独立性
如何设计,避免表示泄露

ADT的特性:抽象函数 表示不变量 表示泄露
AF,RI-->A more formal mathematical idea of what it means for a class to implement an ADT

抽象和用户定义数据类型

数据抽象
用一组操作刻画的数据类型
传统的类型更加关注具体的用什么数据类型来表示,来存储
抽象类型:强调数据上的操作 不关心数据的具体存储

总结:an abstract data type is defined by its operations.

实例:
当我们谈论 List 类型时,我们的意思不是链表或数组或任何其他用于表示列表的特定数据结构。我们指的是一组不透明的值——可能具有 List 类型的对象——它们满足 List 的所有操作的规范:get()、size() 等。

ADT中的操作分类

类型:可变与不可变数据类型
-->对于抽象数据类型,中的可变与不可变就是看它提供的操作,能否改变其内部数据的值

实例:
-Date is mutable, because you can call setMonth() and observe the change with the getMonth() operation.
– But String is immutable, because its operations create new String objects rather than changing existing ones.

抽象类型中的操作分类
构造器:可能是实现为构造函数或静态函数-->factory method(实现为静态函数的构造器)
生产器
观察器
变值器:
如果返回值为 void,则必然意味着它改变了对象的某些内部状态
变值器也可能返回非空类型

ADT实例

ADT的设计原则

设计好的ADT,提供一组操作,设计其行为规约 spec

经验法则:
1.简洁,一致的操作
实例:

2.要足以支持client对数据所做的所有操作需要,且 用操作满足client需要的难度要低
实例:

表示独立性(Representation Independence)

RI:client使用ADT时无需考虑其内部如何实 现,ADT内部表示的变化不应影响外部spec和客户端。

实例:
1.For example, the operations offered by List are independent of whether the list is represented as a linked list or as an array.

理解Java中的ADT

测试

如何测试:为ADT的每一个操作设计测试

具体的测试方法:

步骤:
划分ADT的输入空间
测试覆盖每一个划分

不变性

一个好的ADT的最重要的属性:保持不变量

不变性的性质:
1.在任何时候总是true

2.由ADT 来负责其不变量,与client端的任何行为无关
– It doesn’t depend on good behavior from its clients. – Correctness doesn’t depend on other modules.

Immutability as a type of Invariants

Immutability的威胁:客户端能够直接访问ADT的字段

表示泄露:不仅影响不变性,也影响了表示独立性:无法在不影响客户端的情况下改变其内部表示

保证immutable的措施:
private限制访问权限
final保证immutable

在一些特殊情况下可以将责任留给客户端:

总结

对于可变对象,注意使用防御性副本

或者返回不可变视图

或者直接使用immutable的组件

表示不变性和抽象函数

两种值的空间

表示空间:有实际实现值构成的空间
抽象空间:客户端看到的和使用的值构成的空间

两个空间的映射:
满射

未必单射

未必双射

抽象函数

AF:R -> A

表示不变性:ADT的另外一种重要的不变性

表示不变性RI:某个具体的“表示”是否是“合法的”
RI : R → boolean

也可将RI看作:所有表示值的一个子集,包含了所有合法的表示值
也可将RI看作:一个条件,描述了什么是“合法”的表示值

什么决定AF和RI?
相同的抽象空间可以有不同的表示

不同的表示空间需要不同的抽象函数

-->所以,不同的内部表示,需要设计不同的AF和RI

-->选择某种特定的表示方式R,进而指定某个子集是“合 法”的(RI),并为该子集中的每个值做出“解释”(AF)——即如何映射到抽象空间中的值。

实例:
1.相同的表示空间 不同的表示不变性

2..相同的表示空间 相同的表示不变性 相同的抽象空间 不同的抽象函数

有益的可变性

对immutable的ADT来说,它在A空间的abstract value应是不变的。

但其内部表示的R空间中的取值则可以是变化的
-->这种类型的改变就是有益的可变性

记录AF,RI 表示泄露的安全性

在代码中用注释形式记录AF和RI

要精确的记录RI:rep中的所有fields何为有效

要精确记录AF:如何解释每一个R值

表示泄漏的安全声明

给出理由,证明代码并未对外泄露其内部表示——自证清白

ADT不变性代替前置条件

posted @ 2022-06-17 19:32  hiaGeng  阅读(30)  评论(0编辑  收藏  举报