抽象数据类型 (ADT)
ADT与传统数据类型之间的差异:
传统数据类型更加关注的是数据的具体表示,而ADT更关注数据的抽象(由一组操作所刻画的数据类型)。
ADT是由操作定义的,与其内部如何实现无关。在设计ADT时,程序员和client无需关心数据如何具体存储的,只需设计/使用操作即可。
定义抽象类型的操作:
ADT例子
ADT的特性:
表示泄露、抽象函数AF、表示不变量RI
表示泄露:
表示泄露就是指用户不通过我们ADT提供的方法,就可以修改ADT的内容,出现不必要的麻烦。例如public的属性是一种表示泄露,mutable类型的数据直接传输是一种表示泄露。
防御措施:采用包括但不限于使用private、 final关键字、防御式拷贝等方式来避免表示泄露。
AF:
表示空间到抽象空间的映射。
其中A:抽象值构成的空间,也即client看到和使用的值
R:表示空间,也即开发者所关注的空间。
性质:满射,未必单射,未必双射。原因是R中的部分值并非合法的, 在A中无映射值。
如下图:
这里的AF是从s中取出所有的字符,构成集合,即为 client所需的抽象值
RI:表示独立性(Representation Independence)
Client在使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应该影响外部spec和客户端。
例子如下:
如何设计ADT:
(1)选择R和A;
(2) RI — 合法的表示值;
(3) 如何解释合法的表示值 —对映射AF 做出具体的解释:每个rep value如何映射到abstract value,而且要把这种选择和解释明确写到代码当中。(原因是即便是相同的R和RI,也可能有不同的AF,即解释不同。)
(4)随时检查RI是否满足
(5)给出表示泄露的安全声明,给出理由,证明代码并未对外泄露其内部表示,即自证清白。
可参考Lab2: