代码改变世界

了解抽象数据类型

2018-06-17 22:36  userrrr  阅读(849)  评论(0编辑  收藏  举报

 

  抽象数据类型(Abstract Data Type 简称ADT)是指一个数学模型以及定义在此数学模型上的一组操作。抽象数据类型需要通过固有数据类型(高级编程语言中已实现的数据类型)来实现。抽象数据类型是与表示无关的数据类型,是一个数据模型及定义在该模型上的一组运算。对一个抽象数据类型进行定义时,必须给出它的名字及各运算的运算符名,即函数名,并且规定这些函数的参数性质。一旦定义了一个抽象数据类型及具体实现,程序设计中就可以像使用基本数据类型那样,十分方便地使用抽象数据类型。

在早期的编程语⾔中,⽤户只能⾃⼰定义⽅法,⽽所有的类型都是规定好的(例如int、boolean、String等等)。 ⽽现代编程语⾔允许⽤户⾃⼰定义类型对数据进⾏抽象,这是软件开发中的⼀个巨⼤进步。

对数据进⾏抽象的核⼼思想就是类型是通过其对应的操作来区分的:⼀个整型就是你能对它进⾏加法和乘法的东 ⻄;⼀个布尔型就是你能对它进⾏取反的东⻄;⼀个字符串就是你能对它进⾏链接或者取⼦字符串的东⻄,等等。 在⼀定意义上,⽤户在以前的编程语⾔上似乎已经能够定义⾃⼰的类型了,例如定义⼀个名叫Date的结构体,⾥⾯ ⽤int表⽰天数和年份。但是真正使得抽象类型变得新颖不同的是对操作的强调:⽤户不⽤管这个类型⾥⾯的数据是 怎么保存表⽰的,就好像是程序员不⽤管编译器是怎么存储整数⼀样。起作⽤的只是类型对应的操作。

和很多现代语⾔⼀样,在Java中内置类型和⽤户定义类型之间的关系很模糊。例如在 java.lang 中的类 Integer 和 Boolean 就是内置的——Java标准中规定它们必须存在,但是它们的定义⼜是和⽤户定义类型的⽅ 式⼀样的。另外,Java中还保留了原始类型,它们不是类和对象,例如 int 和 boolean ,⽤户⽆法对它们进⾏ 继承。

对于类型,不管是内置的还是⽤户定义的,都可以被分为可改变 和 不可变两种。其中可改变类型的对象能够被改 变:它们提供了改变对象内容的操作,这样的操作执⾏后可以改变其他对该对象操作的返回值。所以 Date 就是 可改变的,因为你可以通过调⽤ setMonth 操作改变 getMonth 操作的返回值。但 String 就是不可改变的, 因为它的操作符都是创建⼀个新的 String 对象⽽不是改变现有的这个。有时候⼀个类型会提供两种形式,⼀种是可改变的⼀种是不可改变的。例如 StringBuilder 就是⼀种可改变的字符串类型。

 抽象类型是通过它的操作定义的. 对于类型T来说,它的操作集合和规格说明完全定义和构造了它的特性。例如,当我们谈到 List 类型时,我们并 没有特指⼀个数组或者链接链表,⽽是⼀系列模糊的值——哪些对象可以是 List 类型——满⾜该类型的规格说明 和操作规定,例如 get() , size() , 等等。

  那么,如何设计抽象类型呢?

  设计⼀个抽象类型包括选择合适的操作以及它们对应的⾏为,有⼏个重要的规则。

1.设计少量,简单,可以组合实现强⼤功能的操作⽽⾮设计很多复杂的操作。

2.每个操作都应该有⼀个被明确定义的⽬的,并且应该设计为对不同的数据结构有⼀致的⾏为,⽽不是针对某些特殊 情况。例如,或许我们不应该为 List 类型添加⼀个 sum 操作。因为这虽然可能对想要操作⼀个整数列表的⽤户 有帮助,但是如果⽤户想要操作⼀个字符串列表呢?或者⼀个嵌套的列表? 所有这些特殊情况都将会使得 sum 成为 ⼀个难以理解和使⽤的操作。

3.操作集合应该充分地考虑到⽤户的需求,也就是说,⽤户可以⽤这个操作集合做他们可能想做的计算。⼀个较好测 试⽅法是检查抽象类型的每个属性是否都能被操作集提取出来。例如,如果没有 get 操作,我们就不能提取列表 中的元素。抽象类型的基本信息的提取也不应该特别困难。例如, size ⽅法对于 List 并不是必须的,因为我们 可以⽤ get 增序遍历整个列表,直到 get 执⾏失败,但是这既不⾼效,也不⽅便。

4.抽象类型可以是通⽤的:例如,列表、集合,或者图。或者它可以是适⽤于特定领域的:⼀个街道的地图,⼀个员 ⼯数据库,⼀个电话簿等等。但是⼀个抽象类型不能兼有上述⼆者的特性。被设计⽤来代表⼀个纸牌序列的 Deck 类型不应该有⼀个通⽤的 add ⽅法来向类型实例中添加任意对象,⽐如整型和字符串类型。反过来说,对于像 dealCards 这样的只对特定领域(译者注:纸牌游戏)有效的⽅法,把它加⼊ List 这样的通⽤类型中也是没有意义的。

 

 

毫无疑问,抽象数据类型大大的扩大了我们所能操做的变量的范围。通过抽象数据类型,我们拥有了定义属于自己的变量的机会,并能根据我们的所需向其中添加任何的属性以及函数。抽象数据类型毫无疑问地大大降低了我们地编程难度,能够更自由简单地使用各种功能,仅仅只需要通过变量本身便能实现很多操做。抽象数据类型让我们地编程更加得心应手,也更加地有趣。