AF,RI,Rep exposure相关知识

发布时间 2023-04-03 20:47:02作者: Jayhawk

  在做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的本质吧。