关于表示不变量(Rep invariant)和抽象函数(Abstraction function)

关于表示不变量(Rep invariant)和抽象函数(Abstraction function)

(1) 表示空间R:实际实现中内部表示的值

一般情况下ADT的表示比较简单,有些时候需要复杂表示,

抽象空间A:client看到和使用的值

ADT实现者关注R,而用户关注A

因此,我们在R和A可建立一个映射:

这种映射一定是满射(surjective),而不一定是单射(not injective)

(2) 抽象函数:即R和A之间映射关系的函数

(3) 在表示的过程中,就出现了表示不变性RI:

即某个具体的“表示”是否是“合法的”

也可将RI看作:所有表示值的一个子集,包含了所有合法的表示值

也可将RI看作:一个条件,描述了什么是“合法”的表示值

举例:charSet(字符集合)的RI和AF

关于表示不变量(Rep invariant)和抽象函数(Abstraction function)_第1张图片

其为满射,非单射,更非双射

(4)AF和RI与内部表示的设计息息相关,不同的内部标识,需要设计不同的AF和RI:

选择某种特定的表示方式R -> 进而制定某个子集是“合法的”(RI)

-> 并为该子集中的每个值做出“解释”(AF)-即如何映射到抽象空间中的值

(5)同一种表示可能有不同的RI,进而有不同的AF

(6)即使同一种R,同样的RI,也可能有不同的AF,即“解释不同”

(7)随时检查RI是否满足:

自写checkRep()方法,在创造和改变表示的方法中(creators,producers, mutators),进行调用。 Observers正常来说不需调用checkRep(),但这是一种好的防御性措施。

总结一下就是:AF就是你的ADT里面的量到外部人员想要操作的量的映射,
就比如,中国的香蕉就是美国的banana,这个意思。
RI就是控制着你的数据不变性的,比如保证你的banana必须是一根香蕉,而不是许多香蕉。因为bananas才代表许多香蕉。

你可能感兴趣的:(一袋米要扛二楼)