ADT由操作定义likeString and SB
adt操作的四种类型
构造器、生产器create new objects from old objects of the type,like String.concat()
observers、mutator变值器改变对象的属性
4设计抽象类型
良好ADT的设计:靠“经验法则”,提供一组操作,设计其行为规约 spec
设计规则
1、设计简洁、一致的操作
设计一组简单操作,通过简单操作的组合实现复杂的操作。操作的行为应该
是内聚的。
2、 要足以支持client对数据所做的所有操作需要,且用操作满足client需要的难度要低
3要么抽象、要么具体,不要混合 — 要么针对抽象设计,要么针对具体应用的设计
/**
*
*
*/
五、表示独立性
表示独立性:client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。
通过前提条件和后置条件充分刻画了ADT的操作,spec规定了client和implementer之间的契约,明确了client知道可以依赖哪些内容,implementer知道可以安全更改的内容。
六、测试ADT
▪ 测试creators, producers, and mutators:调用observers来观察这些
operations的结果是否满足spec; ▪ 测试observers:调用creators, producers, and mutators等方法产生或
改变对象,来看结果是否正确。
▪ 风险:如果被依赖的其他方法有错误,可能导致被测试方法的测试结
果失效。
七、不变量
为什么需要不变量:保持程序的“正确性”,容易发现错误
有可能出现表示泄露
:所以防御式编程
1、防御式拷贝8RI和AF
ADT开发者关注表示空间R,client关注抽象空间A
抽象函数:R和A之间映射关系的函数,即如何将R中的每一个值解释为A中的每一个值。
RI和AF的关系
AF是对RI上映射的解释
9有益变化
▪ 对immutable的ADT来说,它在A空间的abstract value应是不变的。
▪ 但其内部表示的R空间中的取值则可以是变化的。
adt spec的实现
十一、 ADT invariants replace preconditions
避免用户操作失误违反规约,自己处理就行了
易于理解 易于修改 易于防止bug