1. 抽象数据类型
-
分类维度一:可变性与不可变性
-
不可变的数据类型举例
基本数据类型:int, long, byte, short, char, float, double, boolean
-
不可变的数据类型举例
对象数据类型:Set集合,List列表,Map映射
-
final的作用
- 不可变数据,值不能被改变,安全!
- 可变数据,引用不能被改变,值能被改变,潜在风险!
-
优缺点分析
-
不可变数据安全,但是通过复制来实现改变值要浪费空间
-
可变数据方便进行改值,但是容易产生危险的不可控修改
-
-
解决方案
- 不可变数据例如String存在可变的版本StringBuilder
- 可变数据返回时进行防御式拷贝避免表示泄露
-
-
分类维度二:静态与动态
- 运行前进行静态类型检查
- 运行时进行动态类型检查
2. spec归约
-
requires前置条件
- 客户端,约束输入数据类型
-
effects后置条件
- 开发端,约束功能实现和返回数据类型
-
写法
- 写在函数签名前
- 框架形式如下,具体说明参数、返回值、可能抛出的异常
/** * @param * @return * @throws */
-
强度
- 前置条件越弱,后置条件越强,规约强度越强(自由度越小)
3. 抽象数据类型设计
-
抽象为四类方法
- creator构造器:无中生有
- producer生产器:旧中生新
- observer观察器
- mutator改变器
-
Representation Independence表示独立性
- 客户端只使用功能,无关注内部实现
- 函数接口不变,内部表示的变化不影响客户端
-
Rep invarian表示不变量与Abstract function抽象函数
- RI 表示R上的合理区间
- 与程序运行无关,任何时候都满足
- 包含对A所有合法的表示值
- AF
- 实现R对A的内部表示
- 满射
- RI 表示R上的合理区间
-
注释
-
描述RI,R的合法表示范围
-
描述AF,每一个R如何解释A
-
若存在可变数据,要自证清白(表示泄漏的安全声明)
-
写法格式
// Rep invarian: // // Abstraction Function: // // Safety from rep exposure //
-
与归约区分
- 注释用//,归约用javadoc
-