|
面向对象编程(OOP)是一种编程思维方式和编码架构。
编程语言都提供抽象机制。普遍的说,人在用自然语言描述这个世界的时候,也是一种抽象思维,从某种程度上来说,描述世界的复杂度直接取决于抽象的类型和质量。这里的 “类型” 意思是:抽象的内容是什么?汇编语言是对底层机器的轻微抽象。接着出现的 “命令式” 语言(如 FORTRAN,BASIC 和 C)是对汇编语言的抽象。与汇编相比,这类语言已有了长足的改进,但它们的抽象原理依然要求我们着重考虑计算机的结构,而非问题本身的结构。 程序员必须要在机器模型(“解决方案空间”)和实际解决的问题模型(“问题空间”) 之间建立起一种关联。这个过程既费精力,又脱离编程语言本身的范畴。这使得程序代码很难编写,维护代价高昂。
为机器建模的另一个方法是为要解决的问题制作模型。对一些早期语言来说,如 LISP 和 APL,它们的做法是 “从不同的角度观察世界”——“所有问题都归纳为列表” 或 “所有问题都归纳为算法”。PROLOG 则将所有问题都归纳为决策链。对于这些语言,我 们认为它们一部分是 “基于约束” 的编程,另一部分则是专为处理图形符号设计的(后者被证明限制性太强)。每种方法都有自己特殊的用途,适合解决某一类的问题。只要 超出了它们力所能及的范围,就会显得非常笨拙。
面向对象的程序设计在此基础上跨出了一大步,程序员可利用一些工具表达“问题 空间”内的元素。由于这种表达非常具有普遍性,所以不必受限于特定类型的问题。我们将问题空间中的元素以及它们在解决方案空间的表示称作 “对象”(Object)。当然, 还有一些在问题空间没有对应的对象体。通过添加新的对象类型,程序可进行灵活的调整,以便与特定的问题配合。所以当你在阅读描述解决方案的代码时,也是在阅读问题的表述。与我们以前见过的相比,这无疑是一种更加灵活、更加强大的语言抽象方法。
总之,OOP 允许我们根据问题来描述问题,而不是根据运行解决方案的计算机。然而,它仍然与计算机有联系,每个对象都类似一台小计算机:它们有自己的状态并且可以进行特定的操作。这与现实世界的 “对象” 或者 “物体” 相似:它们都有自己的特征和行 为。 Smalltalk 作为第一个成功的面向对象并影响了 Java 的程序设计语言,Alan Kay 总结了其五大基本特征。通过这些特征,我们可理解“纯粹”的面向对象程序设计方法是什么样的:
1. 万物皆对象。你可以将对象想象成一种特殊的变量。它存储数据,但可 以在你对其 “发出请求” 时执行本身的操作。理论上讲,你总是可以从 要解决的问题身上抽象出概念性的组件,然后在程序中将其表示为一 个对象。
2. 程序是一组对象,通过消息传递来告知彼此该做什么。要请求调用一个 对象的方法,你需要向该对象发送消息。
3. 每个对象都有自己的存储空间,可容纳其他对象。或者说,通过封装现 有对象,可制作出新型对象。所以,尽管对象的概念非常简单,但在程 序中却可达到任意高的复杂程度。
4. 每个对象都有一种类型。根据语法,每个对象都是某个 “类” 的一个 “实 例”。其中,“类”(Class)是 “类型”(Type)的同义词。一个类最重要 的特征就是 “能将什么消息发给它?”。
5. 同一类所有对象都能接收相同的消息。这实际是别有含义的一种说法, 大家不久便能理解。由于类型为 “圆”(Circle)的一个对象也属于类型 为 “形状”(Shape)的一个对象,所以一个圆完全能接收发送给 “形状” 的消息。这意味着可让程序代码统一指挥 “形状”,令其自动控制所有 符合 “形状” 描述的对象,其中自然包括 “圆”。这一特性称为对象的 “可替换性”,是 OOP 最重要的概念之一。
Grady Booch 提供了对对象更简洁的描述:一个对象具有自己的状态,行为和标识。 这意味着对象有自己的内部数据 (提供状态)、方法 (产生行为),并彼此区分(每个对象 在内存中都有唯一的地址)。 |
|