程序原本(五十四):程序设计的核心思想——对象系统:表达、使用与模式(抽象本质上的一致性)

阅读数:40 2019 年 10 月 1 日 16:07

程序原本(五十四):程序设计的核心思想——对象系统:表达、使用与模式(抽象本质上的一致性)

所有被计算的数据,我们要么看做是顺序存储的值,要么看成是散列存储的“名 / 值”。但这只是对数据全体的一个认识。针对其中一个局部,例如某几个地址上的连续数据,或某几个“名 / 值”数据,我们又如何认识它呢?它们在数据概念上又是什么?

在顺序存储中,我们已经为这样的数据找到了一个“看起来合理”的名字:结构类型 / 结构体。基于这一存储方式的特点,我们对结构体中的“字段名”并不敏感,例如说:

复制代码
// C Syntax
struct info {
char first[10];
int age;
};

这个结构有firstage两个字段名,但忽视这两个字段名,我们以下面的结构体来操作它:

复制代码
struct info {
char data[14];
};

也没有什么不同。更进一步,它与一个字节数组也没有什么不同1

1 在一个语言的具体执行环境中,还涉及边界对齐问题。

复制代码
byte info[14];

但是散列存储中的某几个“名 / 值”数据就不可能这样消化掉了。例如:

复制代码
// JavaScript Syntax
info = {
name: 'Tom',
age: '32'
};

其中nameage这两个名值对,其内部是有依存关系的——它们分别是info的不同性质;也有其外延,即可以作为其他的数据的性质,例如:

复制代码
aMan = {
baseinfo: info,
snsinfo: ...
};

如我们此前讨论的,nameage(以及更多个)这样的名 / 值构成了一个数据系列,并满足了我们对数据的内涵与外延的定义,因此它必然可以被理解为数据。而其作为数据,其何种系列的抽象,亦必将为一种数据结构。

这种系列的抽象,我们称为对象。对象是一种数据结构,其每一个分量数据为一个属性,属性可以是对象、索引数组、关联数组,或它们基础的、延伸的数据类型之任一。

对象可以看成是关联数组的一个自然延伸。我们知道,关联数组在概念上与“去除存储限制的”索引数组可作类比;与此相似,对象与“去掉存储限制的”结构体也可作类比,图 18 表明了这样的关系。

图 18 “结构”与“对象”在抽象本质上的一致性

程序原本(五十四):程序设计的核心思想——对象系统:表达、使用与模式(抽象本质上的一致性)

可见,数据的最终抽象,究竟是“结构体”还是“对象”,只是缘于我们在“如何找到数据”这个问题上的不同选择2而已。除开这一点,二者殊途同归,在其抽象本质上是一样的3

2 通过地址或名字来找到数据,这是目前计算机发展中对这个问题的两个答案,但并非只有这两个可能答案。

3 所以我们看到最新的 Go 语言只支持所谓结构,而.NET 中的结构与对象之间的界线也相当模糊。

评论

发布