在做Lab2的时候,开始试着去写每个类的Abstraction function,Representation invariant,Safety from rep exposure,即抽象函数AF,表示不变量RI和防止表示暴露。但感觉对它们的认知还不是很明确,因此,我将在这详细复习记录下它们都表示什么,记录下对它们的理解。
1、AF
抽象函数(AF):R和A之间映射关系的函数,即如何去解释R中的每一个值为A中的每一个值。
AF:R -> A
AF存在以下性质:
满射:每个抽象值被映射到一些rep值 未必单射:一些抽象值被映射到多个rep值 未必双射:并非所有的rep值都被映射
ADT开发者关注表示空间R,client关注抽象空间A
2、RI
表示不变性RI:某个具体的“表示”是否是“合法的”
也可将RI看作:所有表示值的一个子集,包含了所有合法的表示值
也可将RI看作:一个条件,描述了什么是“合法”的表示值
左侧R中白色圆圈内的即为合法地值,可以映射到右侧client看到使用的A中。
同时,在实现函数的过程中,需要调用checkRep()函数在每个方法的调用使进行检查是否符合RI。
在了解AF和RI后,设计ADT的过程大致分为三步:
(1) 选择R和A;
(2) RI- --合法的表示值;
(3) 如何解释合法的表示值---映射AF做出具体的解释:每个rep value如何映射到abstract value
3、Rep exposure:
在代码中需要写出表示泄漏的安全声明,要写出理由,表示代码并未对外泄露其内部表示,以保证代码的安全性。
java中数据类型分为mutable和immutable的,对前者进行的操作可能会改变其内部数据;而对后者的操作不改变其内部值,而是构造新的对象。因此,对于mutable的数据,如果没有良好的保护,意味着client对其的调用可以直接修改内部数据。
推荐采用了防御式拷贝的方法,创建可变对象的“副本”以充当返回值,避免暴露
4、总结
AF、RI、RE可能是ADT类型中最为重要的几个概念了,在实现ADT的过程中,我们要明确R、A、RI、AF等概念,并据此进行方法的实现,在写代码的过程中我也能感受到写这些“注释”的好处,可以增加代码的可读性,可以使代码更加安全,还可以使代码实现起来思路更加清晰。在此之前我也有过少许对代码安全性的考虑,但都是简单的类似只检查数据大小在一定范围或数据类型之类的,也从来没有从开发者和客户端两个角度来看待一个ADT类型。经过本门课程的学习,我更加具体详细的了解了ADT的实现过程,以及如何保证ADT的安全性,如何在客户端的角度来观察ADT。从这个角度来看ADT,感觉也就是从外部来观测或者使用ADT不会改变其内部的数据,也不会知道其内部实现,而是通过AF来的到相应的数据,这也就是ADT的本质吧。
标签:代码,ADT,映射,AF,rep,RI,Rep From: https://www.cnblogs.com/JayLv/p/17284365.html