设计ADT:规格Spec–>表示Rep–>实现Impl
四类ADT操作
- Creators
- 实现:构造函数constructor或静态方法(也称factory method)
- Producers
- 需要有“旧对象”
return
新对象- eg.
String.concat()
- Observers
- eg.
List
的.size()
- eg.
- Mutators
- 改变对象属性
- 若返回值为
void
,则必然改变了对象内部状态(必然是mutator)
表示独立性
- client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。
抽象函数AF & 表示不变量RI
- 检查RI:
随时检查RI是否满足
在所有可能改变rep的方法内都要检查
Observer方法可以不用,但建议也要检查,以防止你的“万一”
测试ADT
因为测试相当于client使用ADT,所以它也不能直接访问ADT内部的数据域,所以只能调用其他方法去测试被测试的方法。
以注释的形式撰写AF、RI、 Safety from Rep Exposure
- 抽象值构成的空间(抽象空间):客户端看到和使用的值
- 程序内部用来表示抽象值的空间(表示空间):程序内部的值
-
抽象函数(AF):
- R和A之间映射关系的函数
- 即如何去解释R中的每一个值为A中的每一个值。
- AF : R → A
- R中的部分值并非合法的,在A中无映射值
-
表示不变性(RI):
- 某个具体的“表示”是否是“合法的”
- 所有表示值的一个子集,包含了所有合法的表示值
- 一个条件,描述了什么是“合法”的表示值
-
针对creator:构造对象之后,用observer去观察是否正确
-
针对observer:用其他三类方法构造对象,然后调用被测observer,判断观察结果是否正确
-
针对producer:produce新对象之后,用observer判断结果是否正确
- 在代码中用注释形式记录AF和RI
- 精确的记录RI:rep中的所有fields何为有效
- 精确记录AF:如何解释每一个R值
- 表示泄漏的安全声明
- 给出理由,证明代码并未对外泄露其内部表示——自证清白