Chapter3:抽象数据类型(ADT)和面向对象的编程(OOP)
3.3Abstract Data Type(ADT)抽象数据类型
1.用户自己定义的类型(User-defined Types)
- 数据抽象:由一组操作所刻画的数据类型。
- 传统的类型定义:关注数据具体表示。
ADT是由操作定义的,与其内部如何实现无关。
2.不同的数据类型和操作(operations)
不同的数据类型:
- 可变类型的对象:提供了可改变其内部数据的值的操作。
- 不可变数据类型:操作不可改变内部值,而是构造新的对象。
- 一些类型提供两种形式:如String,StringBuilder。
不同的操作:
- 构造器(Creators):从无到有(new)
- 生产器(Producers):从旧到新(如concat)
- 观察器(Observers):输出某些特性(如size(),boolean)
- 变值器(Mutators):改变对象属性(如add())
3.抽象数据类型的例子
List是java中一种可变的数据类型。(Mutable)
例子:判断一些操作。
- Integer.valueOf() Creator
- BigInteger.mod() Producer
- List.addAll() Mutator
- String.toUpperCase() Producer
- Set.contains() Observer
- Map.keySet() Observer
- Collections.unmodifiableList() Producer
- BufferedReader.readLine() Mutator
4.抽象数据类型的设计
- 设计简洁,一致的操作。
- 满足client需求,操作难度要低。
- 要么抽象,要么具体。
- 面向具体应用的类型不应包含通用方法。
- 面向通用的类型不应包含面向具体应用的方法。
5.表示独立性(Representation Independence)
表示独立性: client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。
6.不变量(Invariants)
防止表示泄露(representation exposure)的方法:
- public->private
- final
- return new DataType() (防御式拷贝Defensive copying)
7.表示不变性和抽象函数(Rep Invariant and Abstraction Function)
表示空间和抽象空间:
R(表示空间)表示值构成的空间:实现者看到和使用的值。
A(抽象空间)抽象值构成的空间:client看到和实用的值。
ADT开发者关注表示空间R,client关注抽象空间A。
R->A集合的关系:
- 满射(A中所有值必须被表示)
- 不一定单射(R中可能有未用的值)
- 不一定双射
抽象函数: R和A之间映射关系的函数,即如何将R中的每个值解释为A中的每一个值。
AF : R -> A
R中可能存在不合法值。
RI : 判断某个具体的"表示"是否是“合法的”。
RI :R -> Boolean
- 同样的表示空间R,可以有不同的RI。
- 同样的R,同样的RI,可能有不同的AF,即“解释不同”。
问题:
答案:134
Que:What about developer?
Ans:All.