文章目录

  • 前言
  • 一、抽象数据类型概念
  • 二、设计ADT
  • 1.ADT中的操作
  • 2.设计要点
  • 3.泛型化
  • 总结



前言

抽象数据类型是面向对象编程中十分常用的概念,使用起来十分方便,提高了代码可移植性和复用性。


一、抽象数据类型概念

抽象数据类型(Abstract Data Type,ADT)是计算机科学中具有类似行为的特定类别的数据结构的数学模型;或者具有类似语义的一种或多种程序设计语言的数据类型。抽象数据类型是描述数据结构的一种理论工具,其目的是使人们能够独立于程序的实现细节来理解数据结构的特性。抽象数据类型的定义取决于它的一组逻辑特性,而与计算机内部如何表示无关。

抽象数据类型一般因解决一系列类似问题而诞生,它由程序员设计,是高度概括了一类问题中数据和方法的共性的数据结构,使用抽象数据类型意味着一类问题可以全部复用一个抽象数据型来解决,十分方便。通过ADT,一类问题的逻辑特性被清晰地展现出来,不用纠结于具体的细节实现。

定义一个ADT包括数据属性和实现方法,数据属性即该数据类型体现的数值;实现方法就是对这些数据属性的操作。在具体问题中使用时需要实例化一个对象,例如在Java中Integer就是一个ADT,它具有操作ValueOf。在实际使用时应按照如下过程来使用。

int a;
Integer integer = new Integer(value);
a = integer.ValueOf();

二、设计ADT

1.ADT中的操作

ADT中的操作包括以下四类:

  1. Creators 构造器
  2. Producers 生产器
  3. Observers 观察器
  4. Mutators 变值器

这四类操作顾名思义,其中一个immutable类型的ADT中含有Mutators 变值器,而一个mutable类型的ADT中是没有的。以Java为例,下图描述了这四种操作类型的示例:

python抽象数据类型 抽象数据类型定义代码_抽象数据类型

2.设计要点

1)设计规约,设计好的ADT,靠“经验法则”,提供一组操作,设计其行为规约(spec),需要注意:(1)设计简洁、一致的操作(2)要足以支持用户对数据所做的所有操作需要,且用操作满足用户需要的难度要低

2)表示独立性:用户使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。操作按照规约设计,无论操作的具体实现如何变化都要符合规约,在用户看来都应该是一致的。

3)保持不变量:任何时候都保持不变的, 由ADT来负责其不变量,与客户端的任何行为无关

4)防止表示泄露,表示泄露 不仅影响不变性,也影响了表示独立性:无法在不影响客户端的情况下改变其内部表示。解决此问题的方法是使外部代码无法访问和直接改变数据类型中的属性,如使用类似private final int numbers;这样的方式来保护属性值。

3.泛型化

在设计ADT时,往往还采用泛型化的方式来增强ADT的复用性。泛型化是指不使用某个或某些具体的数据类型Integer, String 等来定义属性,而是采用一个字母来代替,标识待定义的数据类型,等到实际使用时再用具体的数据类型对ADT进行复用。例如,编写Java中一个泛型化的类ConcreteVerticesGraph<L> {…}如下所示。

public class ConcreteVerticesGraph<L>
{
	…
}

在复用时,可以把L替换为实际的数据类型,比如String。这样,就不用担心客户会使用什么样的数据类型来定义属性了。

ConcreteVerticesGraph<String> graph = new ConcreteVerticesGraph<String>();

总结

本篇文章概述了ADT,根据课堂所学总结了ADT的设计原则以及泛型化以增强复用性。