(在app上图片看不清的话可以复制链接到浏览器里,就可以看清了,电脑端也可以看清)
尝试根据上课的PPT整理出了一份不是很全的思维导图,省略了一些东西,如果有不对的地方或者困惑的地方请多多指正。下附xmind导出大纲,希望能对大家的学习有所帮助.
抽象数据类型(二)
一、设计抽象类型
1. 良好的ADT设计
- 需要经验法则
- 选择好的操作
- 设计行为规约spec
2. 经验法则
设计简洁、一致的操作
- 操作的意图应当良好定义
- 行为应当连贯 不要添加为了某个type设计的多余操作
要满足用户对数据所有的操作需要,难度简单
- 测试方法:检查object每个可访问属性
- 基本信息不应当过度难于获取
- 使用遍历元素获得listsize--提供size方法
要么普适,要么具体–不要混合
- 面向具体应用的类型不应当包含任意类型均可使用的方法
- 面向通用的类型不应包含限制具体类型的方法
二、Representation Independence
1. 定义
用户使用ADT时无需考虑内部如何实现–内部变化不影响规约和客户端
- 不能改变ADT的表示,除非操作被前提条件和后置条件充分限制,从而可以安全更改内容
2. 测试优先编程
按照规约的要求先进行测试的设计
三、测试抽象数据类型
1. 测试creators, producers, mutators
- 调用observers来观察结果是否满足spec
2. 测试observers
- 调用其他三种方法,观察结果是否正确
3. risk
被依赖的其他方法有错误–被测试方法结果失效
4. 输入空间划分
测试覆盖所有划分
四、不变量
1. ADT始终需要保持其不变量
- 程序在任何时候总是保持true的性质
- 例:immutability - ADT负责不变量,与客户端无关
2. 为什么?
- 需要保持程序的正确性
- without不变量–需要随时检查是否改变
3. 防御性编程
- 假设用户存在破坏ADT不变量的恶意
- public->private, 增加final属性, 或使用immutable类型的对象
- 或:将责任留给用户:
- 当防御性拷贝的太假太高时不得已的举措
- 将存在潜在bug
五、RI和AF
1. 概括
-
表示值构成的空间: implementor空间–RI
-
抽象值构成的空间: client空间–AF
-
R->A的映射
满射:抽象value至少对应1个repvalue(未必单射,未必双射
不是所有的R内变量都可以有映射
2. AF
- R和A之间映射关系的函数:将R解释为一个A中的一个值
3. RI
- 某个具体表示是否合法
如何确定AF和RI
- ADT本身不能决定
- 可以有多种内部实现方式–对应不同的AF,RI
- 对于任意种RI, 必然需要对应的AF进行映射
- ADT+R(+RI)均不能
- 映射方式不同&解释方式不同