软件构造博客2 ADT课程随笔
本周即将提交的Lab2就是有关ADT的实验。于是在此针对自己总结一些ADT的易忘知识点。
良好的ADT:通过封装来避免客户端获取数据的内部表示(即“表示泄露”),避免潜在的bug。
ADT的特性:表示泄露,AF,RI。需要对这些核心特征进行描述并应用。
可变类型的对象:提供了可改变其内部数据的值的操作。
不变数据类型:其操作不改变内部值,而是构造新的对象。
设计好的ADT,靠“经验法则”,提供一组操作,设计其行为规约spec
如何测试ADT:
测试creators, producers, and mutators:调用observers来观察这些
operations的结果是否满足spec;
测试observers:调用creators, producers, and mutators等方法产生或
改变对象,来看结果是否正确。
风险:如果被依赖的其他方法有错误,可能导致被测试方法的测试结
果失效。
在了解AF,RI之前:R:表示空间,实际操作空间,由实际实现实体的值构成。A:抽象空间,由该类型设计支持的值组
成。ADT开发者关注表示空间R,client关注抽象空间A。
AF:满足满射,未必双射和非单射。R中可能存在不映射至A的非法值。
RI:可以看作一个包含所有合法表示值的R子集。
AF和RI是对ADT的“合法”范围的阐述和合法值的“解释”。
在设计ADT的时候,可需要checkRep所有可能改变Rep的方法,保证RI随时满足。
R空间的取值不同于A空间,是可以变化的。(有益的可变性)
在撰写代码时,用注释形式精确记录 AF 和RI。表示泄露的安全声明:给出未对外泄露内部表示的理由。也要写出泄露的风险。
构造器和生产期在创建对象时确保不变量为true,变值器和观察器具在执行时必须保持不变性。
总体来说,ADT设计应该遵循safe from bugs,easy to understand,ready for change.