3.3 Abstract Data Type (ADT)
抽象数据类型 (ADT)
-
ADT的特性:表示泄露,抽象函数AF,表示不变量RI。
ADT是由操作定义的,与其内部如何实现无关。
设计ADT的三个rules:
设计简洁、一致的操作。
要足以支持client对数据所做的所有操作需要,且用操作满足client需要的难度要低。
要么抽象、要么具体,不要混合——要么针对抽象设计,要么针对具体应用设计。ADT操作:
构造器、生产器、观察器、变值器。RI:表示独立性——ADT内部表示的变化不影响外部spec与客户端。除非ADT的操作具体指明了具体的前周后置条件,否则不能改变ADT的内部表示。
用观察器观察构造器、生产器、变值器的结果是否满足spec。
保持不变量来保持程序的正确性。
返回immutable类型的值或用防御式拷贝来返回一个mutable类来避免表示泄露。
AF:
A为抽象值构成的空间:client看到和使用的值。
R为表示值的空间。
必定满射,未必双射。
Abstraction Function:抽象函数:R和A之间映射关系的函数,即如何去解释R中的每一个值为A中的每一个值。
RI:某个具体的表示是否合法。
即使是同样的R、同样的RI,也可能有不同的AF,即“解释不同”。
CheckRep 检查RI 是否满足。
对immutable的ADT来说,它在A空间的abstract value应是不变的。但其内部表示的R空间中的取值则可以是变化的
ADT的规约里只能使用client可见的内容来撰写,包括参数、返回值、异常等。
如果规约里需要提及“值”,只能使用A空间中的“值”
ADT的规约里也不应谈及任何内部表示的细节,以及R空间中的任何值
故在代码中以注释的形式写出AF和RI而不能在Javadoc文档中,防止被外部看到而破坏表示独立性/信息隐藏 -
基于数学的形式对ADT的这些核心特征进行描述并应用与设计中。
3.4 Object-Oriented Programming (OOP)
面向对象的编程 -
面向对象的标准:
a) 泛型
b) 继承
c) 多态
d) 多态分派/绑定。 -
接口——易于理解,方便改动。
接口确定ADT规约,类实现ADT,也可以不需要接口直接使用类作为ADT,既
有ADT定义也有ADT实现,实际中更倾向于使用接口来定义变量 -
多态:特殊多态(如功能重载),参数化多态,子类型多态/包含多态。
-
重载:多个方法具有同样的名字,但是由不同的参数列表或返回值类型。
-
重载为静态多态:根据参数列表进行最佳匹配,静态类型检查。
-
重写在run-time进行动态检查。
-
-
子类型的规约不能弱化超类的规约