抽象数据类型(ADT)
ADT的特性:
- 表示泄露
- 抽象函数AF
- 表示不变量RI
ADT四种操作类型
- 构造器(Creator):创建一个该类型的新对象(可能实现为构造函数或静态函数)
- 生产器(Producer):从一个类型的旧对象创建一个新对象(如String中concat方法)
- 观察器(Observer):返回一个不同类型的对象(如List中的size方法)
- 变值器(Mutator):改变对象属性的方法(如List中的add方法)
举例说明如下
RI 表示独立性:client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应该影响外部spec和客户端。
不变性(Invariants)由ADT来负责其不变量,与client端的任何行为无关
表示泄露:表示泄露就是指用户不通过我们ADT提供的方法,就可以修改ADT的内容,出现不必要的麻烦。这种情况下,内部的数据结构就被泄露出去了,外部client可以看到或直接对我们的数据进行操作。
避免表示泄露的方法:
- 使用防御式拷贝
- 属性前加final
- 使用private变量
最好的办法就是使用immutable的类型,彻底避免表示泄露。
AF抽象函数:R和A之间映射关系的函数,即如何去解 释R中的每一个值为A中的每一个值。
AF: 满射、非单射、 未必双射➡️ R中的部分值并非合法的, 在A中无映射值
表示不变性RI:某个具体的“表示”是否是“合法的”
也可将RI看作:所有表示值的一个子集,包含了所有合法的表示值或者一个条件,描述了什么是“合法”的表示值
选择某种特定的表示方式R,进而指定某个子集是“合法”的(RI),并为该子集中的每个值做出“解释”(AF)----即如何映射到抽象空间中的值。
checkRep 在所有可能改变rep的方法内都要检查
有益的可变性
当且仅当类型的值在创建后永远不会更改时,类型是不可变的。根据我们对抽象空间 A 和 rep 空间 R 的新理解,我们可以完善这个定义:抽象值不应该更改但是,只要 rep 值继续映射到相同的抽象值,实现就可以自由地改变它,以便客户端看不到更改。这种变化被称为有益的可变性(有益的可变性)。