2.4抽象数据的多种表示

2.4抽象数据的多种表示
我们已经介绍了数据抽象,结构化系统的在这方面的方法学是
程序要能够独立于对程序所操作的数据对象的具体实现的选择。
例如,我们在2.1.1中看到的,如何分离出 设计一个使用有理数的程序
的任务与通过计算机语言的原生的组合复合数据的机制实现有理数的任务。
重要的思想是消除抽象的障碍--在这个例子中,是有理数的选择子与组装子
(make-rat,numer,denom)--它隔离出了有理数的使用方式与
它们的表现方式(使用列表结构) 一个相似的抽象障碍隔离出了
执行有理数运算的程序细节(add-rat,sub-rat,mul-rat,div-rat)
与使用有理数的高层次程序。最终的程序有如图2.1的结构。

这些数据抽象的障碍是控制复杂度的强有力的工具。通过隔离出数据对象的
表示方式,我们能够把一个大的程序的设计任务分解成单独执行的小的任务。
但是这种类型的数据抽象,是不足够的,因为它并不是总能够机智地知道
数据对象的表示方式。

一方面,数据对象可能有好几种有用的表示方式,我们可能需要设计系统来
处理数据对象的多种表示方式。举一个简单的例子,复数能够表示两种几乎
等价的方式,平面坐标与极坐标。有时候是平面坐标适合,有时是极坐标更合适。
事实上,假定一个系统中的复数被同时地表示成这两种方式是极其完美的。
处理复数的程序能处理任何一种表示方式。

更重要的是,编程系统常常是由一批批的人分阶段设计的,随着时间的流逝,
需求的主题也在改变。在这样的环境中,在数据表示方式上,大家达成一致是
不太可能的。除了数据抽象层分离表示方法与使用方法外,我们需要抽象层来
分离不同的设计策略,允许不同的设计策略在一个单独的程序中共存。
进而,由于大的程序系统常常由组装已存在的被单独设计的模块的方式创建,
我们需要一个规范来允许程序员集成模块到大的程序系统中,也就是没必要
重设计或者重实现这些模块。

在这一部分中,我们将学会如何应对被程序的不同部分表示成不同方式的数据。
这需要组装通用性的程序,这个程序能操作有多种表示形式的数据。为了构建
通用性的程序的主要的技术 是应用有类型标签的数据对象来起作用的,也就是
数据对象包括关于如何处理这些数据的显式的信息。我们也将讨论数据驱动编程
的方面,这是对于具有通用性的操作的累进的汇编系统的一种强有力的方便的实现策略。

我们用一个简单的复数的例子开头。我们将看到类型标签和数据驱动的编程风格如何让我们
能够单独地设计复数的平面坐标和极坐标表示方式。这其中的复数维护着一个抽象的
复杂的数据对象的概念。我们将完成这个任务,通过定义复数的算术程序(add-complex,
sub-complex,mul-complex,div-complex)使用通用的选择子程序来读取一个复数的部分,
来独立出复数是如何表示的细节部分。这个复数系统的结果,如图2.19,它包括了
两个不同的抽象隔离。水平的抽象隔离与图2.1中的扮演着相同的角色。它们都隔离了
高层次的操作与低层次的表示法。此外,还有一个垂直的隔离,让我们有能力独立地设计
并且安装可选的表示法。

               使用复数的程序
      __________________________________________________   
------|add-complex sub-complex mul-complex div-complex |------------
      |________________________________________________|
               复数算术程序包
 ____________________________________________
 
      平面坐标表示    |  极坐标表示
                      |
______________________|______________________________________                
          列表结构和原生的机器算术

图2.19 在复数系统中的数据抽象的隔离

在2.5部分中,我们将显示如何使用类型标签和面向数据的风格,来开发一个通用的算术程序包。
这提供了程序(add,mul,等等)能用来操作各种数据,当有一种新的类型的数需要时,能很容易地扩展。
在2.5.3部分中,我们显示如何使用系统中的通用的算术,来执行符号代数。

猜你喜欢

转载自blog.csdn.net/gggwfn1982/article/details/81477236