抽象数据类型是软件工程中一般原则的一个实例,它有许多名称,其含义略有不同。以下是用于此想法的一些名称:
- 抽象。用更简单、更高级的想法省略或隐藏低级细节。
- 模块化。将系统划分为组件或模块,每个组件或模块都可以与系统的其余部分分开设计,实现,测试,推理和重用。
- 封装。在模块周围构建一堵墙,以便模块对自己的内部行为负责,系统其他部分的错误不会破坏其完整性。
- 信息隐藏。向系统的其余部分隐藏模块实现的细节,以便以后可以在不更改系统其余部分的情况下更改这些细节。
- 关注点分离。使功能(或“关注”)成为单个模块的责任,而不是将其分散到多个模块中。
作为一名软件工程师,你应该知道这些术语,因为你会经常遇到它们。所有这些想法的根本目的是帮助实现我们在6.031中关心的三个重要属性:安全性免受错误,易于理解以及为更改做好准备。
事实上,我们已经在以前的类中遇到过一些这样的想法,在编写接受输入并产生输出的函数的上下文中:
- 抽象:规范是一种抽象,因为客户端只需要了解其前提条件和后置条件即可使用它,而不是实现的完整内部行为。
- 模块化:单元测试和规范有助于将功能转换为模块。
- 封装:函数的局部变量被封装,因为只有函数本身可以使用或修改它们。与全局变量(截然相反)或指向具有别名的可变对象的局部变量(也威胁到封装)形成对比。
- 信息隐藏:规范使用信息隐藏来让实现者在如何实现函数方面有一定的自由度。
- 关注点分离:一个好的函数规范是连贯的,这意味着它只负责一个关注点。
从今天的类开始,我们将超越函数的抽象,并查看数据的抽象。但我们将看到,函数在我们如何描述数据抽象方面仍将发挥关键作用。
用户定义类型
在计算的早期,编程语言带有内置类型(如整数,布尔值,字符串等)和内置函数,例如,用于输入和输出。用户可以定义自己的功能:这就是构建大型程序的方式。
软件开发的一个主要进步是抽象类型的概念:人们可以设计一种编程语言来允许用户定义的类型。这个想法来自许多研究人员的工作,特别是达尔,他发明了Simula语言;Hoare,他开发了许多我们现在用来推理抽象类型的技术;还有Parnas,他创造了“信息隐藏”一词,并首先阐明了围绕它们封装的秘密组织程序模块的想法。
在麻省理工学院,Barbara Liskov和John Guttag在抽象类型的规范和对它们的编程语言支持方面做了开创性的工作 - 并开发了原始的6.170,6.005的前身,6.031的前身。芭芭拉·利斯科夫(Barbara Liskov)因其在抽象类型方面的工作而获得了图灵奖,相当于计算机科学的诺贝尔奖。
数据抽象的关键思想是,类型的特点是可以对其执行的操作。数字是你可以加和乘的东西;字符串是您可以连接并获取子字符串的东西;布尔值是你可以否定的东西,依此类推。从某种意义上说,用户已经可以在早期的编程语言中定义自己的类型:例如,您可以创建一个记录类型日期,例如,使用日,月和年的整数字段。但是,使抽象类型变得新颖和不同的是专注于操作:该类型的用户不需要担心其值的实际存储方式,就像程序员可以忽略编译器实际存储整数的方式一样。重要的是操作。