那么,“艾伦·凯”这个真正的“面向对象”是什么意思?


95

据报道,艾伦·凯(Alan Kay)是“面向对象”一词的发明者。人们经常引用他所说的话,今天我们所说的面向对象不是他的意思。

例如,我刚刚在Google上找到了这个:

我用“面向对象”这个词来形容,我可以告诉你我没有C ++

-艾伦·凯(Alan Kay),OOPSLA '97

我依稀记得听到一些非常有见地的关于他没有意思。类似于“消息传递”的东西。

你知道他的意思吗?您能否详细说明他的意思以及它与当今常见的OO有何不同?如果有的话,请分享一些参考。

谢谢。


您可能会发现我的博客文章对此主题很感兴趣:yegor256.com/tag/oop.html
yegor256 '16

请查看此博客文章的评论部分,艾伦·凯自己回答了以下问题:艾伦
yegor256

Answers:


82

http://www.purl.org/stefan_ram/pub/doc_kay_oop_en


日期:2003年7月23日,星期三09:33:31 -0800收件人:Stefan Ram [出于保密目的而删除]发件人:Alan Kay [出于隐私目的而删除]主题:Re:澄清“面向对象”

您好Stefan-

抱歉耽搁了,但我正在休假。

在6:27 PM +0200 7/17/03,Stefan Ram写道:

亲爱的凯博士,

我想在有关该主题的教程页面上对“面向对象编程”一词有一个权威性的词。我认为唯一具有“权威性”的两个来源是国际标准组织,该组织在“ ISO / IEC 2382-15”中定义了“面向对象”,而正如您所说的那样,您就是您创造的。

我敢肯定我做到了。

不幸的是,很难找到包含您对该术语的定义或描述的网页或资源。关于您在这方面可能要说的内容,有几份报告(例如“继承,多态性和封装”),但这不是第一手资料。我也知道,稍后您将更多的重点放在“消息传递”上,但是我仍然想了解“面向对象”。

有关记录,请参见我的教程页面以及进一步的发行和发布,请您说明:

首先在何时何地使用“面向对象”一词?

66年11月之后的某个时候,在犹他州的某个时候,受Sketchpad,Simula,ARPAnet,Burroughs B5000的设计以及我在生物学和数学领域的影响,我想到了一种编程架构。大概是在1967年,有人问我在做什么,我说:“这是面向对象的编程”。

它的原始概念包括以下部分。

  • 我想到的对象就像是生物细胞和/或网络上的单个计算机,只能与消息进行通信(因此消息传递从一开始就出现了,花了一段时间才能看到如何以编程语言足够有效地进行消息传递,有用)。

  • 我想摆脱数据。B5000几乎通过其令人难以置信的硬件架构来做到这一点。我意识到,单元格/整个计算机的隐喻将摆脱数据,而“ <-”将只是另一个消息标记(我花了相当长的时间才想到这一点,因为我真的把所有这些符号都认为是功能和程序。

  • 我的数学背景使我意识到,每个对象都可以具有与其关联的多个代数,并且可以包含这些代数,并且它们将非常有用。“多态性”一词是在很晚以后才提出的(我认为是由Peter Wegner提出的),它并不是很有效,因为它确实来自功能的术语,我所需要的不仅仅是功能。我用“代数”的形式组成了“通用性”一词来处理通用行为。

  • 我不喜欢Simula I或Simula 67做继承的方式(尽管我认为Nygaard和Dahl只是伟大的思想家和设计师)。因此,我决定将继承作为内置功能保留下来,直到更好地理解它为止。

我最初使用该架构进行的实验是使用我改编自van Wijngaarten和Wirth的“ Algol的通用化”以及Wirth的Euler的模型完成的。两者都相当像LISP,但具有更常规的可读语法。那时我还不理解LISP的有形元语言的想法,但与包括可从Irons的IMP在内的各种来源得到的可扩展语言的想法有点接近。

第二阶段是最终了解LISP,然后使用这种了解使LISP变得更好,更小,功能更强大,后期绑定更多。Dave Fisher的论文以“ McCarthy”风格完成,他有关可扩展控制结构的想法非常有帮助。这时的另一个重大影响是卡尔·休伊特(Carl Hewitt)的PLANNER(鉴于能够预见Prolog的程度和时间,它从未得到应有的认可)。

以上是施乐PARC的原始Smalltalk。在“历史记录”一章的末尾,抱怨了后来的Smalltalk:它们向Simula倒退,并且没有用更有用的安全机制代替扩展机制。

“面向对象的[编程]”对您意味着什么?(如果可能的话,不需要其他类似教程的介绍,只需对熟悉它们的读者进行其他概念的简短说明(例如“使用继承,多态性和封装进行编程”)。而且,也不必解释“对象”。 ”,因为我已经有“ Smalltalk的早期历史”中有关“对象”的解释的来源。)

(我不反对类型,但是我不知道任何类型的系统都不是完全可行的,所以我仍然喜欢动态类型。)

对我而言,OOP意味着仅消息传递,本地保留和保护以及状态过程的隐藏以及所有事物的极端后期绑定。可以在Smalltalk和LISP中完成。可能还有其他系统可以做到这一点,但我不知道它们。

[另外,]我应该提到的一件事是Simula催化了两条主要路径。早期的(偶然地)是我采用的生物/网络非数据过程路线。另一个作为研究对象而出现的稍后是抽象数据类型,这发挥了更大的作用。

如果纵观整个历史,我们会发现原始OOP始于ADT,对我所谓的“对象”有一点分叉(导致Smalltalk等),但是在那之后, CS部门几乎完成了ADT,并希望坚持使用数据过程范式。从历史上看,值得一看的是USAF Burroughs 220文件系统(我在Smalltalk历史中描述过),Doug Ross在MIT(AED和更早的时期)的早期工作,他提倡将过程指针嵌入数据结构中,Sketchpad(完全多态性-例如,其数据结构中的相同偏移量表示“显示”,并且将有一个指向该结构所代表的对象类型的适当例程的指针,等等,还有Burroughs B5000,它的程序引用表是真正的“大对象”,并且包含指向“数据”和“过程”的指针,但是如果它试图获取数据并找到过程指针,则通常可以做正确的事情。我用犹他州早期的东西解决的第一个问题是仅使用方法和对象的“数据消失”。在60年代末(我认为),鲍勃·巴尔泽(Bob Balzer)撰写了一篇非常漂亮的论文,称为“无数据编程”,此后不久,约翰·雷诺兹(John Reynolds)撰写了同样出色的论文“ Gedanken”(我认为是1970年),其中他证明了使用lamda正确的表达方式将允许过程抽象数据。但是如果它试图获取数据并找到过程指针,通常可以做正确的事情。我用犹他州早期的东西解决的第一个问题是仅使用方法和对象的“数据消失”。在60年代末(我认为),鲍勃·巴尔泽(Bob Balzer)撰写了一篇非常漂亮的论文,称为“无数据编程”,此后不久,约翰·雷诺兹(John Reynolds)撰写了同样出色的论文“ Gedanken”(我认为是1970年),其中他证明了使用lamda正确的表达方式将允许过程抽象数据。但是如果它试图获取数据并找到过程指针,通常可以做正确的事情。我用犹他州早期的东西解决的第一个问题是仅使用方法和对象的“数据消失”。在60年代末(我认为),鲍勃·巴尔泽(Bob Balzer)撰写了一篇非常漂亮的论文,称为“无数据编程”,此后不久,约翰·雷诺兹(John Reynolds)撰写了同样出色的论文“ Gedanken”(我认为是1970年),其中他证明了使用lamda正确的表达方式将允许过程抽象数据。

将对象作为非数据的对象的人数较少,包括我自己,卡尔·休伊特,戴夫·里德和其他一些人-几乎所有这些人都来自ARPA社区,并以一种或另一种方式与ARPAnet→Internet的设计,其中计算的基本单位是一台完整的计算机。但是,只是为了表明一个想法可以顽固地坚持到整个七十年代和八十年代,有很多人试图通过“远程过程调用”来解决问题,而不是考虑对象和消息。Sic运输gloria mundi。

干杯,

艾伦·凯


1
HTTP / 1.1 403访问被拒绝。
工作

1
我只是能够访问它,所以它一定是一个暂时性的问题。感谢您的链接,Manoj。
David Conrad

2
@Job星期三(3月16日,您显然收到403错误的一天)是域管理员在userpage.fu-berlin.de上的每月服务日。他们通常每月一次使网络的一部分脱机。恩,不要问……
康拉德·鲁道夫

您/某人能否澄清“我想摆脱数据”的含义?数据是OO不可或缺的一部分(即,通常将其封装在一个类中,或传递给类/从类中传递),无论使用哪种范式,在计算中都不能没有数据,因此摆脱数据对我来说毫无意义。
丹尼斯

1
<-是最初的smalltalk分配运算符
DangerMouse

22

Smalltalk语言体现了Alan Kay 面向对象所指的大多数(如果不是全部)。

另外,来自http://en.wikipedia.org/wiki/Message_passing#Influences_on_other_programming_models

艾伦·凯(Alan Kay)认为,消息传递比OOP中的对象更为重要,并且对象本身通常被过分强调。实时分布式对象编程模型基于此观察结果。它使用分布式数据流的概念,使用高级的功能样式规范,根据消息模式来表征复杂的分布式系统的行为。

18
然后有人想知道为什么他称其为“面向对象”而不是“面向消息”。
David Thornley

@David Thornley:这样会使C ++面向方法吗?
back2dos

60
我对60年代的用语不屑一顾,应该选择“面向消息”之类的东西
艾伦·凯

1
但是,什么是“面向消息的”呢?(我可以想到异步调用(可能),但是实际上不知道任何语言都没有实现或多或少的“正常”方法;返回值也有问题,但这可以通过sort-of来欺骗ref'/'out'参数或类似参数)
mlvljr

1
“面向消息”基本上是后期绑定/动态键入-在运行时(通过该对象)分析传递给对象的消息。
Mark Cidade

6

Smalltalk语言体现了Alan Kay面向对象所指的大多数(如果不是全部)。

“我们甚至没有在PARC上考虑所有想法。最初的Smalltalk激发了卡尔·休伊特(Carl Hewitt)的许多演员想法,其精神更多是OOP,而不是后来的Smalltalks。Erlang的重要部分更像是一种真正的OOP语言。当前的Smalltalk,当然还有使用“ OOP paint”绘制的基于C的语言。

摘自艾伦·凯的评论:

http://computinged.wordpress.com/2010/09/11/moti-asks-objects-never-well-hardly-ever/


您必须向下滚动很长的注释,以下是Alan Kay注释的直接链接:computinged.wordpress.com/2010/09/11/…–
icc97

整个注释非常有用,它首先可以回答以下问题:“互联网是我认为“面向对象”的大型系统的一个很好的例子。它包含数十亿个完全封装的对象(计算机本身),并且使用纯粹的“请求而不是命令”等消息系统。
icc97 '18 -10-21

5

我从关注Alan Kay和其他人(例如Jim Coplien)的著作中获得的主要观点之一是,真正的“面向对象”编程是关于在人类/用户心理模型方面对计算机和软件进行建模,而不是只是PROGRAMMERS的工具。

据我了解,艾伦(Alan)对OOP的愿景是使计算机成为一种工具,使人类用户可以执行他们想要的任何事情:计算机的全部功能通过直观的交互模型直接暴露给最终用户。我应该能够直接查看和雕刻运行时对象和交互,而不仅仅是通过代码。

这是有关我计划尝试使用JavaScript的某些版本作为概念证明的计划的文章:http : //www.cemetech.net/forum/viewtopic.php? p= 234494#234494

从软件开发/编程的角度来看,吉姆·科普林(Jim Coplien)讨论了代码如何并且应该类似于用户的思维模型。也就是说,该代码的读取方式与描述其行为的人员所听到的方式大致相同。这主要是通过考虑对象而不是类和类型来实现的。行为是根据对象扮演的角色来描述的,而不是作为对象标识定义的一部分。您应该能够根据对象建模交互,这些对象由对象在交互中扮演的角色识别。这就是人类思维模型的工作方式:服务员,客户,收银员,源帐户,目标帐户......这些是角色,而不是类型,并且您希望能够为“任何对象当时正在扮演这个角色”定义方法”,


DDD使用类似的概念。可能您对此是正确的。:-)
inf3rno
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.