OPP的起源
计算机革命起源于机器,编程语言的产生也始于对机器的模仿。
计算机是头脑延伸的工具,同时还是一直不同类型的表达媒体。
面向对象程序设计(Object-oriented Programming,OOP)便是这种以计算机作为表达媒体的大趋势中的组成部分。
1.1 抽象过程
抽象的普遍性
所有编程语言都提供抽象机制。
抽象的重要性
人们所能解决问题的复杂性直接取决于抽象的类型和质量。所谓的“类型”是指“所抽象的是什么?”
早期语言抽象及其不足
汇编语言是对底层机器的轻微抽象,“命令式”语言(FORTRAN、BASIC、C)都是对汇编语言的抽象。这两个层次所做的抽象仍要求在解决问题时要基于计算机的结构,而不是基于所要解决的问题的结构来考虑。
使用这种语言的程序员必须建立起在机器模型(位于“解空间”,这是你对问题建模的地方,例如计算机)和实际待解问题的模型(位于“问题空间”内,这是你对问题建模的地方,例如一项业务)之间的关联。建立这种映射是费力的,而且这不属于编程语言所固有的功能,这使得程序难以编写,并且维护代价高昂,同时也产生了作为副产物的整个“编程方法”行业。
中间时期语言的抽象及其不足
LISP、APL和PROLOG,是只针对待解决问题建模。
这些语言一旦超出特定领域,它们就力不从心了。
面向对象编程的抽象及其优点
通过向程序员提供表示问题空间中的元素的工具而更进了一步。这种表达方式非常通用,使得程序员不会受限于任何特定类型的问题。OOP允许根据问题来描述问题,而不是根据运行解决方案的计算机来描述问题。
我们将问题空间中的元素及其在解空间中的表示称为“对象”(你还需要一些无法类比为问题空间元素的对象)。(注:程序语言通过分解一个个小的元素,封装了机器模型和实际待解问题模型之间的关联,隐藏了映射细节。具体问题很难复用,但元素具有很强的复用性)这种思想的实质是:程序可以通过添加新类型的对象使自身适用于某个特定问题。(注:增加了灵活性和扩展性)。
注:具体问题在机器模型和实际待解问题模型之间的关联很难复用,但是把具体问题拆分成一个个小的通用元素,而在每个小的元素内部封装了机器模型和实际待解问题模型之间的关联,这样既隐藏了映射细节,有增强了复用性,有效降低了开发难度,并提高了编程的速度。使用元素编程就像搭积木,进而增加了灵活性和扩展性,增大了解决问题的范围。
Alan Kay曾经总结了第一个成功的面向对象语言(Smalltalk)的五个基本特性:
1. 万物皆有对象;
2. 程序是对象的集合,它们通过发送消息来告诉彼此所要做的;
3. 每个对象都有自己的由其他对象所构成的存储。换句话说,可以通过创建包含现有对象的包的方式来创建新类型的对象;
4. 每个对象都拥有其类型。每个类最重要的区别于其他类的特性就是“可以发送什么样的消息给它”;
5. 某一特定类型的所有对象都可以接收同样的消息。
Booch对对象提出了一个更加简洁的描述:对象具有状态(内部数据)、行为(方法)和标识(唯一地与其他对象区分开来,具体来说,就是每一个对象在内存中都有一个唯一的地址)。
说明:
这些笔记和思考,有助于我在课堂讲授,也有助于我了解编程语言演变的来龙去脉,对我解决问题的思路扩展有帮助。
我为精神分裂症群体而战!