》》所有编程语言都提供抽象机制。
》》汇编语言是对底层机器的轻微抽象。接着,出现的许多所谓“命令式”语言(如FORTRAN 、 BASIC 、C 等)都是对汇编语言的抽象。这些语言在汇编语言基
础上有了大幅的改进,但是它们所作的主要抽象仍要求在解决问题时要基于计算机的结构,而不是基于要解决的问题的结构来考虑。
》》程序员必须建立起在机器模型(位于“解空间”内,这是你对问题建模的地方,例如计算机)和实际待解决问题的模型(位于“问题空间”内,这是问题存在的
地方,例如一项业务)之间的关联。
》》另一种对机器建模的方式就是只针对待解问题建模。早期的编程语言,如 LISP 和 APL ,都选择考虑世界的某些特定视图(分别对应于“所有问题最终都
是列表”或者“所有问题都是算法形式的”)。
PROLOG 则将所有问题都转换成决策链。此外还产生了基于约束条件编程的语言和专门通过图形符号操作来实现编程的语言(后者被证明限制性过强)。
这些方式对于它们所要解决的特定类型的问题都是不错的解决方案,但是一旦超出其特定领域,它们就力不从心了。
》》面向对象方式通过向程序员提供表示问题空间中的元素的工具而更进了一步。这种表示方式非常通用,使得程序员不会受限于任何特定类型的问题。我们将问
题空间中的元素及其在解空间中的表示称为“对象”。
这种思想的实质是:程序可以通过添加新类型的对象使自身适用于某个特定的问题。所以,当你在阅读描述解决方案的代码的同时,也是在阅读问题的表述。》》OOP(面向对象)允许根据问题来描述问题,而不是根据运行解决方案的计算机来描述问题。但是它仍然与计算机有联系:每个对象看起来都有点像一台微
型计算机---它有状态,还具有操作,用户可以要求对象执行这些操作。
》》面向对象语言的五个基本特性:(这些特性表现了一种纯粹的面向对象程序设计方式)(1)万物皆对象。将对象视为奇特的变量,它可以存储数据,除此之外,你还可以要求它在自身上执行操作。理论上讲,你可以抽取待求解问题的任何概念化
构件(狗、建筑物、服务等),将其表示为程序中的对象。
(2)程序是对象的集合,它们通过发送消息来告知彼此所要做的。要想请求一个对象,就必须对该对象发送一条消息。更具体的说,可以把消息想象为对某个特
定对象的方法的调用请求。
(3)每个对象都有自己的由其他对象所构成的存储。换句话说,可以通过创建包含现有对象的包的方式来创建新类型的对象。因此,可以在程序中构建复杂的体系, 同时将其复杂性隐藏在对象的简单性背后。
(4)每个对象都拥有其类型。按照通用的说法,“每个对象都是某个类(class)的一个实例(instance)”,这里“类”就是“类型”的同义词。每个类最重要的
区别于其他类的特性就是“可以发送什么样的消息给它”。
(5)某一特定类型的所有对象都可以接收同样的消息。这是一句意味深长的表述,例如,“圆形”类型的对象同时也是“几何形”类型的对象,所以一个“圆形”
对象必定能 够接受发送给“几何形”对象的消息。这意味着可以编写与“几何形”交互并自动处理所有与几何形性质相关的事物的代码。这种可替代性是OOP
中最强有力的概念之一。
对象具有状态、行为和标识。这意味着每一个对象都可以拥有内部数据(它们给出了该对象的状态)和方法(它们产生行为),并且每一个对象都可以唯一地与其他 对象区分开来,具体说来,就是每一个对象在内存中都有一个唯一的地址。