编程那点事编程那点事

专注编程入门及提高
探究程序员职业规划之道!

对象导论:抽象过程

汇编语言是对底层机器的轻微抽象,“命令式”语言(如CBASIC)是对汇编语言的抽象。虽然“命令式”语言在汇编语言的基础上有了大幅度改进,但他们所作的主要抽象仍然是基于计算机的结构,而不是基于所要解决的问题的结构。程序员必须建立起在机器模型和实际待解决问题的模型之间的关联。建立这种映射是费力的,而且这不属于编程语言所固有的功能,这使得程序难以编写,并且维护代价高昂。机器模型位于“解空间”内,这是你对问题建模的地方,实际待解决问题的模型位于“问题空间”内。

另一种对机器建模的方式就是只针对待解决问题建模。比如LISPPROLOG则将所有问题都转换成决策链。此处还产生了基于约束条件编程的语言和专门通过对图形符号操作来实现编程的语言(后者被证明限制性过强)。这些方式对于他们所要解决的特定类型的问题都是不错的解决方案,但是一旦超过其特定的领域,它们就力不从心了。

面向对象方式通过向程序员提供表示问题空间中的元素的工具而是抽象更近了一步。这种表示方式非常通用,使得程序员不会受限于任何类型的问题。我们将问题空间中的元素及其在解空间中的表示称为“对象”。这种思想的实现是:程序可以通过添加新类型的对象使自身适用于某个特定的问题。因此,当你在阅读描述解决方案的代码的同时也是在阅读问题的表述。相比以前我们所使用的语言,这是一种更灵活和更强有力的语言抽象。所以,OOP允许根据问题来描述问题,而不是根据运行解决方案的计算机来解决问题。但是他仍然与计算机有联系:每个对象看起来都有点像一台微型计算机----它具有状态、操作,用户可以要求对象执行这些操作。如果要对现实世界中的对象做类比,那么说他们都具有特性和行为似乎不错。

Alan Kay总结了面向对象语言Smalltalk(Java所基于的语言之一)的五个基本特性:

1)万物皆对象。将对象视为奇特的变量,它可以存储数据,还可以要求它在自身上执行操作。理论上讲,你可以抽取待求解问题的任何概念化构件(狗、建筑物、服务等),将其表示为程序中的对象。

2)程序是对象的集合,他们通过发送消息来告知彼此所要做的。要想请求一个对象,就必须对该对象发送一条消息。可以把消息想象为对某个特定对象的方法的调用请求。

3)每个对象都有自己的有其他对象所构成的存储。换句话说,可以通过创建包含现有对象的包的方式来创建新类型的对象。因此,可以在程序中构建复杂的体系,同时将其复杂性隐藏在对象的简单性背后。

4)每个对象都拥有其类型。按照通用的说法,“每个对象都是某个类(class)的一个实例(instance)”,这里“类”就是“类型”的同义词。每个类最重要的区别于其他类的特性就是“可以发送什么样的消息给它”。

5)某一特定类型的所有对象都可以接受同样的消息。这是一句意味深长的表述,你在稍后便会看到。因为“圆形”类型的对象同时也是“几何形”类型的对象,所以一个“圆形”对象必定能够接受发送给“几何形”对象的消息。这意味着可以编写与“几何形”交互并自动处理所有与几何形性质相关的事物的代码。这种可替代性(substituability)是OOP中最强有力的概念之一。

Booch对对象提出了一个更加简洁的描述:对象具有状态、行为和标识。这意味着每一个对象都可以拥有内部数据(它们给出了该对象的状态)和方法(它们产生行为),并且每一个对象都可以唯一地与其他对象区分开来,具体说来,就是每一个对象在内存中都有一个唯一的地址。


未经允许不得转载: 技术文章 » Java编程 » 对象导论:抽象过程