笔记
软件构造课程Chapter 6 Abstract Data Type (ADT)中的第5节为Representation Independence,译为“表示独立性”。该节提出了一些概念如RI、AF、Rep等,在学习过程中觉得理解的不够深刻,所以决定重写一下各个概念以及认识过程以加深理解。
基本概念
以PPT为依据整理一下主要概念:
表示独立性(Representation independent):client使用ADT时无需考虑其内部如何实现,ADT内部的变化不应影响外部spec和客户端。
表示域(R):包含的是值具体的实现实体的空间。一般情况下ADT的表示比较简单,有些时候需要复杂表示。
抽象域(A):包含的是类型设计时支持使用的值的空间。这些值是由表示域“抽象/想象”出来的,也是使用者关注的。
抽象函数(Abstraction function):R和A之间映射关系的函数。AF:R→A
表示不变量(Rep invariant):将表示空间的值映射到布尔值。RI : R → boolean
理解
ADT实现者关注R,而用户关注A, AF就是我们因此在R和A之间建立的一个映射,用户关注的A必须均能实现,而我们实现的空间中的内容并不需要所有都体现到A中去,所以该映射一定是满射,而不一定是单射。
R为表示值构成的空间,包含实现者看到和使用的值。A为抽象值构成的空间,包含client看到和使用的值。
在表示的过程中,就出现了表示不变性RI,即某个具体的“表示”是否是“合法的”。
也可将RI看作:所有表示值的一个子集,包含了所有合法的表示值 。
也可将RI看作:一个条件,描述了什么是“合法”的表示值。
RI和AF的一个实例:
这里RI强调合法,即只要满足不包含重复字符的字符串这一条件,就可以出现在表示空间里。
而AF作为一个映射,将s中的所有字符从表示空间对应到抽象空间中去。
同一个ADT,可以有多种表示;不同的内部表示,需要设计不同的AF和RI。选择某种特定的表示方式R,进而指定某个子集是“合法”的(RI),并为该子集中的每个值做出“解释”(AF)——即如何映射到抽象空间中的值。
设计ADT时需要执行的相关步骤:
(1) 选择R和A;
(2) RI——合法的表示值;
(3) 如何解释合法的表示值——映射AF。
而且要做出具体的解释:每个rep value如何映射到abstract value。
表示空间相同,但RI不同:
表示空间和RI相同,但AF不同:
总之,一个ADT的实现不仅是选择表示域(规格说明)和抽象域(具体实现),同时也要决定哪一些表示值是合法的(表示不变量),合法表示会被怎么解释/映射(抽象函数)。