第二章 构造数据抽象 ===================== 程序设计为了模拟真实世界中的复杂现象, 需要构造远比数值数据复杂的计算对象, 与将基本过程组合形成复合过程相对应, 也可以将数据对象组合起来形成复合数据。 与复合过程类似, 复合数据同样是为了提升设计程序时的抽象层次, 提高设计的模块性, 增强程序的表达能力, 使得我们可以在比编程语言所提供的基本数据对象更高的概念层次上, 处理与数据有关的各种问题。 举例说明, 有理数可以看做两个整数相除, 假设存在一个计算两个有理数之和的过程 `add-rat`, 如果我们设计程序时分别用两个过程来生成两个有理数和数的分子及分母, 那么在执行大量有理数操作时, 记录分子分母的对应关系将会加重程序的复杂性, 然后这些繁琐的有理数相加的操作又与业务无关, 因此如果能将有理数的分子分母封装成一个序对, 即一个复合数据对象, 那么对于有理数的基本操作就可以基于一个数据对象来进行操作, 而与有理数的如何表示隔离开。这样形成的 **数据抽象** 技术将使程序更容易设计、维护与修改。 再次举例, 对于形如“线性组合” :math:`ax + by`, 可以立刻给出其过程的实现 .. code-block:: scheme (define (linear-combination a b x y) (+ (* a x) (* b y))) 但是如果我们针对的是有理数、复数、多项式或者其它数据对象基于加和乘形成线性组合的思想, 则可以给出抽象层次更高的实现 .. code-block:: scheme (define (linear-combination a b x y) (add (mul a x) (mul b y))) 这样对于不同的数据类型, 只要其具体表示中实现了加和乘的接口, 那么对于 `linear-combination` 过程并不关心它接收的参数具体是什么类型, 它只是实现了线性组合这个过程。 .. toctree:: :maxdepth: 2 ch2-1 ch2-2 ch2-3 ch2-4 ch2-5