- 内容提要
- 序 1:程序里的世界
- 序 2:最后一层表象
- 关于本书
- 致谢
- 引言:简单的本源
- 篇一:计算系统
- 第 1 章 数,以及对数据的性质的思考
- 第 2 章 逻辑
- 第 3 章 抽象
- 篇二:语言及其面临的系统
- 第 4 章 语言
- 第 5 章 从功能到系统
- 篇三:程序设计的核心思想
- 第 6 章 数据结构:顺序存储
- 第 7 章 数据结构:散列存储
- 第 8 章 执行体与它在执行过程中的环境
- 第 9 章 语法树及其执行过程
- 第 10 章 对象系统:表达、使用与模式
- 篇四:应用开发基础
- 第 11 章 应用开发的背景与成因
- 第 12 章 应用开发技术
- 第 13 章 开发视角下的工程问题
- 第 14 章 应用程序设计语言的复杂性
- 篇五:系统的基础部件
- 第 15 章 分布
- 第 16 章 依赖
- 第 17 章 消息
- 第 18 章 系统
- 篇六:系统的基本组织方法与原理
- 第 19 章 行为的组织及其抽象
- 第 20 章 领域间的组织
- 附一:主要编程范式 及其语言特性关系
- 附二:继承与混合,略谈系统的构建方式
- 附三:像大师们一样思考——从 UML 何时死掉 谈起
- 附四:VCL 已死,RAD 已死
10.1 抽象本质上的一致性
所有被计算的数据,我们要么看做是顺序存储的值,要么看成是散列存储的“名/值”。但这只是对数据全体的一个认识。针对其中一个局部,例如某几个地址上的连续数据,或某几个“名/值”数据,我们又如何认识它呢?它们在数据概念上又是什么?
在顺序存储中,我们已经为这样的数据找到了一个“看起来合理”的名字:结构类型/结构体。基于这一存储方式的特点,我们对结构体中的“字段名”并不敏感,例如说:
1 2 3 4 5 |
|
这个结构有 first
和 age
两个字段名,但忽视这两个字段名,我们以下面的结构体来操作它:
1 2 3 |
|
也没有什么不同。更进一步,它与一个字节数组也没有什么不同 1 :
1 |
|
但是散列存储中的 某几个“名/值”数据 就不可能这样消化掉了。例如:
1 2 3 4 5 |
|
其中 name
与 age
这两个名值对,其内部是有依存关系的——它们分别是 info
的不同性质;也有其外延,即可以作为其他的数据的性质,例如:
1 2 3 4 |
|
如我们此前讨论的, name
、 age
(以及更多个)这样的名/值构成了一个数据系列,并满足了我们对数据的内涵与外延的定义,因此它必然可以被理解为数据。而其作为数据,其 何种系列的抽象 ,亦必将为一种数据结构。
这种系列的抽象,我们称为 对象 。对象是一种数据结构,其每一个分量数据为一个 属性 ,属性可以是对象、索引数组、关联数组,或它们基础的、延伸的数据类型之任一。
对象可以看成是关联数组的一个自然延伸。我们知道,关联数组在概念上与“去除存储限制的”索引数组可作类比;与此相似,对象与“去掉存储限制的”结构体也可作类比,图 18 表明了这样的关系。
图 18 “结构”与“对象”在抽象本质上的一致性
可见,数据的最终抽象,究竟是“结构体”还是“对象”,只是缘于我们在“如何找到数据”这个问题上的不同选择 2 而已。除开这一点,二者殊途同归,在其抽象本质上是一样的 3 。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论