2020.03.25软件构造听课笔记

抽象数据类型(ADT)

ADT的特性:不变量、表示泄露、抽象函数AF、表示不变量RI

数据抽象:有一组操作所刻画的数据类型
传统的类型定义:关注数据的具体表示
抽象类型:强调“作用于数据上的操作”,程序员和client无需关心数据如何具体存储的,只需设计/使用操作即可

可变类型的对象:提供了可改变其内部数据的值的操作
不可变数据类型:其操作不可改变内部值,而是构造新的对象

良好的ADT的设计:靠“经验法则”,提供一组操作,设计其行为规约spec
1、设计简洁、一致的操作
2、要足以支持client对数据所做的所有操作需要,且用操作满足client需求的难度要低
3、要么抽象、要么具体,不要混合——要么针对抽象设计、要么针对具体应用的设计

表示独立性:client使用ADT时,无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端

测试ADT的方法:
测试creators,producers,and mutators:调用observers来观察者这些operations的结果是否满足spec;
测试observers:调用creators,producers,and mutators等方法产生或改变对象,来看结果是否正确
风险:如果被依赖的其他方法有错误,可能导致被测试方法的测试结果失败

ADT需要始终保持其不变量
不变量:程序在任何时候总是true的性质
有ADT来负责其不变量,与client端的任何行为无关

为什么需要不变量:保持程序的“正确性”,容易发现错误

防御式拷贝会有大量的内存浪费,但是不得不这么做
除非迫不得已,否则不要把希望寄托于客户端上,ADT有责任保证自己的invariants,并避免“表示泄露”
最好的办法就是使用immutable的类型,彻底避免表示泄露

保持不变性和避免表示泄露,是ADT最重要的一个Invariant(不变量)

表示值构成的空间:实现这看到和使用的值
一般情况下ADT的表示比较简单,有些时候需要复杂表示
抽象值构成的空间:client看到和使用的值

表示不变性RI(rep invariant):某个具体的“表示”是否是“合法的”
也可将RI看作:所有表示值的一个子集,包含了所有合法的表示值
也可将RI看作:一个条件,描述 了什么是“合法”的表示值

AF(abstract function)

不同的内部表示需要设计不同的AF和RI
选择某种特定的表示方式R,进而指定某个子集是“合法的”RI,并为该子集中的每个值做出“解释”(AF)——即如何映射到抽象空间中的值

同样的表示空间R,也可以有不同的RI
即使是同样的R、RI,也可以有不同的AF,即“解释不同”

设计ADT:
(1)选择R和A
(2)RI——合法的表示值
(3)如何解释合法的表示值——映射AF
做出具体的解释:每个rep value如何映射到abstract value

 

发布了7 篇原创文章 · 获赞 1 · 访问量 69
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览