抽象的进步
所有编程语言的最终目标都是提供一种“抽象”要领。一种较有争议的说法是:办理问题的庞洪水平直接取决于抽象的种类及质量。这儿的“种类”是指筹备对什么举办“抽象”?汇编语言是对基本呆板的少量抽象。厥后的很多“呼吁式”语言(如FORTRAN,BASIC和C)是对汇编语言的一种抽象。与汇编语言对比,这些语言已有了长足的进步,但它们的抽象道理依然要求我们着重思量计较机的布局,而非思量问题自己的布局。在呆板模子(位于“方案空间”)与实际办理的问题模子(位于“问题空间”)之间,措施员必需成立起一种接洽。这个进程要求人们支付较大的精神,并且由于它离开了编程语言自己的范畴,造成措施代码很难编写,并且要花较大的价钱举办维护。由此造成的副浸染即是一门完善的“编程要领”学科。
为呆板建模的另一个要领是为要办理的问题建造模子。对一些早期语言来说,如LISP和APL,它们的做法是“从差异的角度调查世界”——“所有问题都归纳为列表”或“所有问题都归纳为算法”。PROLOG则将所有问题都归纳为决定链。对付这些语言,我们认为它们一部门是面向基于“强制”的编程,另一部门则是专为处理惩罚图形标记设计的。每种要领都有本身非凡的用途,适合办理某一类的问题。但只要超出了它们力所能及的范畴,就会显得很是鸠拙。
面向工具的措施设计在此基本上则跨出了一大步,措施员可操作一些东西表达问题空间内的元素。由于这种表达很是普遍,所以不必受限于特定范例的问题。我们将问题空间中的元素以及它们在方案空间的暗示物称作“工具”(Object)。虽然,尚有一些在问题空间没有对应体的其他工具。通过添加新的工具范例,措施可举办机动的调解,以便与特定的问题共同。所以在阅读方案的描写代码时,会读到对问题举办表达的话语。与我们以前见过的对比,这无疑是一种越发机动、越发强大的语言抽象要领。总之,OOP答允我们按照问题来描写问题,而不是按照方案。然而,仍有一个接洽途径回到计较机。每个工具都雷同一台小计较机;它们有本身的状态,并且可要求它们举办特定的操纵。与现实世界的“工具”可能“物体”对比,编程“工具”与它们也存在共通的处所:它们都有本身的特征和行为。
Alan Kay总结了Smalltalk的五大根基特征。这是第一种乐成的面向工具措施设计语言,也是Java的基本语言。通过这些特征,我们可领略“纯粹”的面向工具措施设计要领是什么样的:
(1) 所有对象都是工具。可将工具想象成一种新型变量;它生存着数据,但可要求它对自身举办操纵。理论上讲,可从要办理的问题身上提出所有观念性的组件,然后在措施中将其表达为一个工具。
(2) 措施是一大堆工具的组合;通过动静通报,各工具知道本身该做些什么。为了向工具发出请求,需向谁人工具“发送一条动静”。更详细地讲,可将动静想象为一个挪用请求,它挪用的是从属于方针工具的一个子例程或函数。
(3) 每个工具都有本身的存储空间,可容纳其他工具。可能说,通过封装现有工具,可建造出新型工具。所以,尽量工具的观念很是简朴,但在措施中却可到达任意高的庞洪水平。
(4) 每个工具都有一种范例。按照语法,每个工具都是某个“类”的一个“实例”。个中,“类”(Class)是“范例”(Type)的同义词。一个类最重要的特征就是“能将什么动静发给它?”。
(5) 同一类所有工具都能吸收沟通的动静。这实际是别有寄义的一种说法,各人不久便能领略。由于范例为“圆”(Circle)的一个工具也属于范例为“形状”(Shape)的一个工具,所以一个圆完全能吸收形状动静。这意味着可让措施代码统一批示“形状”,令其自动节制所有切合“形状”描写的工具,个中自然包罗“圆”。这一特性称为工具的“可替换性”,是OOP最重要的观念之一。
一些语言设计者认为面向工具的措施设计自己并不敷以利便办理所有形式的措施问题,倡导将差异的要领组合成“多形措施设计语言”(注释②)。
②:拜见Timothy Budd编著的《Multiparadigm Programming in Leda》,Addison-Wesley 1995年出书。