几个概念
在ADT的设计过程中有几个值域是需要我们格外关注的,那就是表示域和抽象域。
表示域(以下简称R) 包含的是值具体的实现实体。
抽象域(以下简称A) 包含类型设计时支持使用的值。这些值是由表示域“抽象/想象”出来的。
ADT的设计者需要实现R到A的映射,ADT的使用者只需要关注抽象域即可。
有了上边的两个值域的定义我们就引申出下面的概念。
表示独立性RI
ADT的表示独立性,要求客户在使用ADT时无需考虑ADT的内部实现,只需要根据ADT的规约进行使用即可。即ADT的内部实现变化不应该影响用户在客户端的使用。表示独立性的关键在于将数据结构的使用和数据结构自身的形式分离。防止因为用户在使用过程中假设ADT内部的实现,在假设的基础上形成依赖。
抽象函数AF
抽象函数即是描述从R到A的映射关系的函数,即如何将表示空间中的一个值解释为抽象空间中的一个值。AF通常是满足以下关系的一个映射:
- AF是一个满射,即用户所看到或使用的任意一个值都是由一个表示值映射而来的。
- AF未必是一个单射,即用户户所看到或使用的任意一个值可能由不止一个表示值映射而来。
- AF未必是一个双射,即开发人员所面对的表示值中,会存在不满足前置条件的表示值,对于这类表示值不存在对于的抽象值。
如何理解
我个人理解而言,A空间内的值即为我们所写的ADT实际所表示的意义,比如说
1 | public class MyDate{ |
在这个类中,A空间内所表示的就是每天的时间,不同的对象表示的就是具体的日子,这是客户端所感受到的。R空间中表示的就仅仅是三个int
变量year
、month
、day
的组合,仅仅停留在表面,而没有更深层的意义。
那么AF就是将三个int
变量的组合赋予了实际的每一天的意义,比如R空间内当year=2020
,month=10
,day=29
时,在A空间内表示的就是2020年10月29日这一天,客户端所需要的A空间的所有日期都可以在R空间内找到对应的表示,甚至不止一个(上边的例子只有一个)。
那么RI我们可以理解为对于R空间内的元素的一个限制,还用上边的例子来说,month
范围显然是 $1 \leq month \leq 12$,而day
的范围为 $1 \leq day \leq Days_{month}$.这样我们就会对可行的、有意义的R空间元素进行了一些限制。
联系
在构建ADT时,我们需要有以下步骤:选定表示空间(R),进而找出其中满足条件的子集(RI),并为子集中的每个元素做出对应的解释(AF),最终将其映射到抽象空间(A)中。