面向对象(OOP)到底是什么?

前言

本文是对面向对象(OOP)的历史溯源的一个尝试。

一想到面向对象就想到 Java,也有人说 JavaScript 也是面向对象语言,也有人说不是。那么谁说的对呢?争辩是无意义的,那么我就尝试找一下面向对象这个概念最开始的提出者是谁,他又是怎么解释面向对象的。

首先来找到 wiki,这个网站说实话出错的概率还是比较小的。那么为什么是英文wiki呢?那么你要想计算机语言是哪个国家发明的,英文网站相对来说会要权威一些。

image.png

这里呢当然离不开翻译软件,我简单描述一下。

面向和对象这些术语最开始由麻省理工学院在 60 年代提出,Lisp 语言的原子可以表示一个具有属性的东西,这个东西已经可以被称作对象了。艾伦-凯(Alan Kay)受到了这一思想的影响。

Simula 引入了重要的概念,这些概念如今成为已经面向对象编程的重要组成部分,例如类和对象、继承和动态绑定。

在 70 年代,艾伦-凯和一众大佬开发了 Smalltalk 的第一个版本。Smalltalk 由语言级别的面向对象的应用和图形开发环境而闻名。Smalltalk 受到了 Simula 67 的影响,Smalltalk 支持了动态创建和修改类的特性。

后面还有一些面向对象思想的变迁暂不叙述了,这里知道了几个重要的关键词:Simula,Alan Kay

Simula 关键词挖掘

翻 Simula 的 wiki。Simula 被认为是第一个面向对象的编程语言。它为当今面向对象语言的许多特性提供了框架。

wiki 没有对 OOP 的部分进行展开,我通过 google 去搜索关键词 Simula OOP 找到了这样一个页面。

“本文件基于1997年12月5日在马耳他大学举行的名为面向对象编程(OOP)30年的IT研讨会。第一个面向对象语言(OOL)Simula 67是由Ole Johan Dahl和Kristen Nygaard于1967年5月在奥斯陆附近的Lysebu召开的IFIP TC 2模拟语言工作会议上正式推出的。“
image.png
这篇文章讲了 Simula 的一些历史和语法,关于 OOP 的信息我只找到了一小段。

Simula 的 OOP 存在一些缺陷:没有接口,没有多重继承。

继续搜索 ing

image.png

我找到了一个叫 OO History (面向对象的历史)的这么一个PPT,我摘录艾伦-凯的一段话,大意是这样的

我从 Simula 那里学到的是,你现在可以用目标来取代绑定和赋值的目标。你最不想要任何程序员来搞乱内部状态,即使是形象地呈现。相反,应该呈现对象作为更高级别行为的网站更适合用作动态组件

又经过了一段时间的无效检索,发现检索方式不太对,于是转向谷歌学术检索关键词 Simula OOP

image.png

我发现了这样一本书,这本书这样叙述面向对象的三大优点:

对现实世界的理解力、设计的稳定性以及设计和实现的可重用性。

面向对象为什么这么流行?

面向对象的编程变得如此广泛接受的原因之一是:面向对象与我们对现实世界的感知很接近。
面向对象编程的基本理念是使程序尽可能地反映它们要处理的那部分现实。这样一来,往往会更让人容易理解和对程序中所描述的内容并进行概述。原因是人类从一开始就习惯了对于有关现实世界中发生的事情的感知的训练。越是接近在编程中使用这种思维方式的可能性就越大,就越容易编写和理解程序。

艾伦-凯 Alan Kay

翻 Alan Kay 的 wiki,艾伦-凯除了是 OOP 理念的创始人。他还是图形用户界面(GUI)的创始人。

这是艾伦-凯回答有关面向对象问题的一段邮件记录
userpage.fu-berlin.de/~ram/pub/pu…

OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.

OOP对我来说只意味着消息传递、本地保留和保护以及隐藏状态进程,以及对所有事物的极端晚期绑定。

可能翻译的不是很准确,但可以看到艾伦-凯更加强调消息传递而不是当下的类、继承、封装和多态,这其实和当下的以 Java 为主流的 OOP 概念大相径庭。

艾伦-凯理解的 OOP

关于什么是隔离,极端晚期绑定与消息传递,这篇文章有所描述

ovid.github.io/articles/al…

这里摘录一下消息传递的部分:

“在凯的世界里。每个对象几乎就像一台完整的计算机,而不仅仅是一个独特的职责区域,每个对象都可以接收消息并判断它是否知道如何处理它们。

换句话说,您不会通过按名称调用代码来执行代码:您将一些数据(一条消息)发送到一个对象,它会确定要执行哪些代码(如果有)作为响应。事实上,这可以提高你的隔离度,因为接收者可以自由地忽略任何它不理解的消息。这是一个大多数人不熟悉的范式,但它很强大。”

Smalltalk 的早期历史 (The Early History Of Smalltalk)

worrydream.com/EarlyHistor…

以下关于 OOP 的摘录

“尽管 OOP 有很多动机,但有两个是核心。大规模的是为涉及隐藏细节的复杂系统寻找更好的模块方案,小规模的则是寻找更灵活的分配版本,然后尝试完全消除它。与大多数新想法一样,它最初是在断断续续的情况下发生的。”

其他的段落过于学术,能力有限就不摘了,这里还有一个文章,d1b10bmlvqabco.cloudfront.net/attach/i4g9…
感兴趣的可以自己看看。

结束

挖掘工作就到此为止了,其实由于能力问题,能挖到能理解的信息还只是浮于表面。

虽然可能与最开始想要的答案不太一样,但是答案其实不算很重要的东西。

在过程中是不是学到了书上学不到的东西,是不是还可以在这个基础上继续挖掘些东西出来,哪怕是拿来吹水呢?

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享