《计算机程序的构造与解释》(五)

来源:互联网 发布:数据库存储过程教程 编辑:程序博客网 时间:2024/05/22 13:58

数据抽象

    前面四篇都是关于过程抽象,从这篇开始学习数据抽象。与过程抽象一样,数据抽象的目的是为提升编程的概念层次,使得程序员在写程序的时候更多关注想要表达的概念及其对它们的操作。要达到这个必须使得抽象数据的实现与使用分离。就像你在装修房子,要在墙上钻个洞,必须借助电钻。你最终的目的是钻个洞、安装螺丝,然后根据自己的需要选择合适的钻头。至于这个钻头是如何实现的并不需要知道,你只要保证这个钻头能很好的工作以及如何使用它们。过程抽象和数据抽象就如同这里的电钻类型和大小不同的钻头以及如何操控这些电钻的步骤。如果没有这个电钻及其配套的工具,那么装修就很麻烦了。
    抽象的数据是由基本数据类型组合而成。这显然需要程序语言提供“粘合剂”,使得能够方便的构造抽象数据。

序对

    是包含两个元素的复合数据对象。这个元素既可以是基本元素如数字、字母,也可以是另一个序对。scheme语言中基本过程cons取两个参数,返回一个包含这两个参数作为其成分的复合数据对象;如果给了一个序对,可以通过基本过程car和cdr取出各个部分:
;cons car and cdr(define x (cons 1 2))(car x)         ;return 1(cdr x)         ;return 2
还可以通过cons参数为序对去构造序对的序对:
;序对作为cons的参数(define x (cons 1 2))(define y (cons 3 4))(define z (cons x y))(car (car z))    ;return 1(cdr (cdr z))    ;return 3
通过基本过程cons、car和cdr实现复合数据。由序对构造的数据对象称为表结构(list)数据。

有理数运算

    有理数不是基本数据类型,它包含两部分,分别是分子和分母。假设通过有理数的构造和选择函数,可以将两个整数构造成一个有理数,和从有理数中分别选择分子和分母。就是make-rat、numer和denom。
    现在假设有两个有理数分别为x、y,要实现有理数加法add-rat,n1、d1是x的分子和分母,n2、d2是y的分子和分母,根据前面的假设可以通过numer和denom分别获取x、y的分子和分母。根据有理数的加法规则得到有理数和:n1/d1 + n2/d2 = (n1*d2 + n2*d2)/d1*d2。因此可以定义:
;有理数求和(define (add-rat x y)    (make-rat  (+ (* (numer x) (denom y)                      (* (numer y) (denom x)                  (* (denom x) (denom y))))
同样可以给予make-rat、numer和denom和基本算术运算规则可以实现更多的有理数运算如:sub-rat、mul-rat、div-rat、equal-rat等等。
    一般而言,数据抽象的基本思想就是为每一类数据对象标识出一组操作,使得对这类数据对象的操作都可以基于他们表述,而且在操作这些数据对象时也只使用它们。
下图表明有理数系统的结构:其中水平线表示抽象屏障,它们隔离了系统中的不同层次。在每一层数据抽象的使用与实现相分离。


数据抽象和OOP的关系

    面向对象编程就是要构造各种数据类型,然后将对这个类型的某些方法给其他对象调用,如同有理数操作的add-rat、sub-rat。通过建立对象,然后给该对象发送消息,实现对象之间的调用。面向对象编程的本质就是数据抽象,暴露出来的接口作为抽象层,其实现细节对数据的使用程序而言是屏蔽的。至于继承和多态,只能算是面向对象编程的小技巧,给程序员带来些便利性,同时也带来很多麻烦和负担。

0 0
原创粉丝点击