数据抽象是为了将数据对象的结构与数据对象的使用分离,与程式抽象类似。数据对象的结构依靠一组构造器和查询器表示,但单纯的构造器和查询器并不能表达数据对象的实质,它们还必须完全符合数据对象对应的特定条件。
序对
Scheme 通过序对的方式为我们提供数据抽象的能力,分别通过程式 cons
、car
和 cdr
。cons
接收两个参数,并将这两个参数绑定返回一个数据对象;car
可获取数据对象的前一个参数并作为结果返回,cdr
可获取数据对象的后一个参数并作为结果返回。具体使用方式如下:
(define x (cons 1 2))
(car x)
1
(cdr x)
2
当然 cons
的参数也可以是数据对象,例如:
(define x (cons 1 2))
(define y (cons 3 4))
(define z (cons x y))
(car (car z))
1
(car (cdr z))
3
抽象屏障
如果通过数据抽象的方式构建一个有理数系统,我们可以将有理数设计为一对整数,其中一个为分子,一个为分母。接着使用 make-rat
、numer
和 denom
构建有理数及获取它的分子和分母,对有理数的算术运算在这三个程式的基础上建立,类似 add-rat
、sub-rat
等。整个有理数系统的结构如下图所示:
抽象屏障用于隔离不同层级之间的差异,通过屏障实现对上层程式与下层程式的沟通,这样可以将数据构建的依赖限制在小范围内,有利于对代码进行维护和修改后,整个系统的功能保持一致性。