文章目录
ADT的特性:表示泄露、抽象函数AF、表示不变量AF;
基于数学的特性对ADT的这些特性进行描述并应用于设计中;
1.Abstract and User-Defined Types
抽象对规约意味着什么?
抽象;模块化;封装;信息隐藏;关注点分散(Separation of concerns);
传统的数据类型,关注数据的具体表达;
抽象类型:强调“作用于数据上的操作”,程序员和用户无需关心数据如何具体存储,只需设计/使用操作即可;
ADT是由操作定义的,与其内部如何实现无关;
2.Classifying Types and Operations
Mutable and immutable types
类型可分为可变和不可变数据类型;
可变类型的对象,提供了可改变其内部数据的值的操作;
不变数据类型,其操作不改变内部值,而是构造新的对象;
Classifying the operations of an abstract type
- Creators (构造器):建立该类型+新的对象;
- Producers (生产器):从已经存在的该类型的基础上,生成新的类型,例如String中的
concat()
方法; - Observers(观察器):获取抽象类型的对象,返回一个不同类型的对象;例如:
List
中的size()
方法; - Mutators (变值器):改变对象属性的方法;例如:
List
中的add()
方法;
举个栗子:
构造器的标志
构造器:可能实现为构造函数或静态方法;
一个构造器实现为静态方法为工厂方法;
变值器的标志
变值器通常返回void;如果返回值为void,则必然意味着它改变了对象的某些内部状态;
变值器也可能返回非空类型;
3.抽象数据类型例子
对于不可变的数据类型没有mutators;
注意:BufferReader.readLine()
是Mutator;
Integer.valueOf()是Creator(将int包装为Integer);
4.Designing an Abstract Type
“经验法则”:
- 设计简洁、一致的操作
- 要足以支持client对数据所做的所有操作需要,且用操作满足client需要的难度要低;
- 要么抽象,要么具体,不要混合;
Representation Independence(表示独立性)
表示独立性:client使用ADT时,无需考虑其内部如何实现。ADT内部表示的变化不应影响外部spec和客户端。
除非ADT的操作指明了具体的pre-和post-condition,否则不能改变ADT的内部表示 -- spec规定了client和implementer之间的契约