据报道,艾伦·凯(Alan Kay)是“面向对象”一词的发明者。经常有人引用他的话说,今天我们所说的面向对象不是他的意思。
例如,我刚刚在Google上找到了它:

我用“对象-面向”,我可以告诉你我没有C ++。
-OOPSLA '97的Alan Kay,

我隐约记得听到一些关于他的意思的见解。类似于“消息传递”。
你知道他的意思吗?您能否详细说明他的意思以及它与当今常见的OO有何不同?如果有的话,请分享一些参考。

评论

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

请查看此博客文章的评论部分,艾伦·凯本人在其中回答问题:艾伦·凯关于他的错是错的

#1 楼

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



日期:2003年7月23日,星期三09:33:31 -0800致:Stefan Ram [从
隐私中删除]摘自:艾伦·凯[出于隐私而删除]主题:Re:
澄清“面向对象”

Stefan--

/>很抱歉耽搁了,但我正在度假。

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


亲爱的Kay博士,

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


我敢肯定我做到了。包含您对该术语的定义或说明的网页或资源

有一些关于您可能在这方面所说的内容的报告
(例如“继承,多态性和封装”),但是
这些不是第一手资料。我也知道,以后
您将更多的重点放在“消息传递”上-但我仍然希望
了解“面向对象”。

记录一下,我的教程页,以及进一步的分发
和出版物,请您解释一下:

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

它的最初概念包括以下部分。


我想到的对象就像生物细胞和/或网络上的单个计算机,只能与消息通信(因此,
消息传递是一开始的-花费了一段时间才能看到如何有效地以编程语言进行消息传递,以变得有用。
我想摆脱数据。 B5000几乎通过令人难以置信的硬件架构来做到这一点。我意识到,
单元格/整个计算机的隐喻将摆脱数据,并且“ <-”
只是另一个消息令牌(花了我好一会儿才想到
因为我真的把所有这些符号都当作
函数和过程的名称。
我的数学背景使我认识到每个对象可以有多个与其关联的代数,并且可以有
这些,并且它们将非常有用。
“多态性”一词的提出时间很晚(我认为是彼得·韦格纳(Peter Wegner)),由于它确实来自
函数的术语,我想要的不只是函数,我还用
术语“泛型”以准代数形式处理泛型行为。我不喜欢Simula I或Simula 67做继承的方式(尽管我认为Nygaard和Dahl只是伟大的思想家和设计师),所以我决定不考虑继承。内置的
功能,直到对它有所了解为止。 br />和Wirth的Euler。两者都相当像LISP,但是具有更多的常规可读语法。那时我不了解庞然大物的LISP
有形金属语言的想法,但与想法有点接近
关于可扩展语言的信息来自各种来源,包括Irons的
IMP。

第二阶段是最终了解LISP,然后使用
这种理解使之变得更好更小和更强大的
,以及更多后期绑定的基础结构。戴夫·费舍尔(Dave Fisher)的论文是用“麦卡锡”(McCarthy)风格完成的,他关于可扩展控制结构的思想很有帮助。当时的另一个大影响力是卡尔
休伊特的PLANNER(鉴于它能够预见Prolog的程度和时间,它从来没有得到应有的认可。


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


“面向对象的[编程]”对您意味着什么?
(不需要像教程一样的介绍,只需要简短的解释即可[像如果可能的话,请熟悉其他概念的读者参考“用继承编程,
多态性和封装”
。而且,
不必解释“对象”,因为我已经有了
来源,其中有您来自
“ Smalltalk的早期历史”中对“对象”的解释。)


(我不反对类型,但我反对类型不知道有没有什么类型的系统不能完全解决,所以我仍然喜欢动态类型。)

对我来说,面向对象意味着仅消息传递,本地保留和保护以及
隐藏状态进程ess,以及所有事物的极端后期绑定。
可以在Smalltalk和LISP中完成。可能还有其他系统可以实现,但我不知道。

[也,]我应该提到的一件事是,有
/>Simula促进了两条主要路径。最早的(只是偶然的)是我所采用的生物/网络非数据过程路线。
后来作为研究对象出现的另一个是
抽象数据类型,这起了更大的作用。

如果我们回顾整个历史,我们看到原始OOP的东西
是从ADT开始的,朝我所谓的“对象”
有一个小分支–导致Smalltalk等,但是在这个小分支之后, CS部门几乎完成了ADT,并希望坚持使用
数据过程范式。从历史上看,值得一看的是USAF
Burroughs 220文件系统(我在Smalltalk历史中曾描述过),
Doug Ross在麻省理工学院(AED和更早的时期)的早期工作中,他
提倡在数据结构Sketchpad
中嵌入过程指针(具有完全多态性-例如,其数据中的相同偏移量
结构表示“显示”,并且将有一个指向
的指针)例程,用于表示结构表示的对象的类型,例如
,以及Burroughs B5000,其程序参考表是
真正的“大对象”,并且包含指向“数据”和“
”的指针过程”,但是如果它试图去查找数据并找到过程指针,通常可以做正确的事。而我最初用犹他州的东西解决的第一个问题就是“数据消失”仅使用
方法和对象。60年代末(我认为),鲍勃·巴尔泽(Bob Balzer)
写了一篇很漂亮的论文,叫做“ Dataless Pr约翰·雷诺兹(John Reynolds)随后写了一篇同样漂亮的论文“ Gedanken”(我认为是在1970年出版),其中他证明了使用lamda表达式正确的方法可以使数据被过程抽象化。

那些喜欢将对象作为非数据对象的人数量更少,并且
包括我自己,卡尔·休伊特(Carl Hewitt),戴夫·里德(Dave Reed)以及其他一些人-相当
该小组中的许多人都来自ARPA社区,并以一种或另一种方式参与了ARPAnet的设计→Internet in br />计算的基本单位是一台完整的计算机。但是,只是为了展示一个想法如何顽固地坚持到整个70年代和
80年代,有很多人试图通过“远程
过程调用”来解决问题,而不是思考对象和消息。 Sic
运输gloria mundi。

干杯,

Alan Kay


评论


HTTP / 1.1 403访问被拒绝。

–求职
2011年3月16日在18:01

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

–大卫·康拉德(David Conrad)
2011-3-24在13:36

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

–康拉德·鲁道夫(Konrad Rudolph)
2011年7月8日在11:45



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

–丹尼斯
15年7月16日在15:42



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

–危险老鼠
16年6月16日在12:29

#2 楼

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

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

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

评论


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

– David Thornley
2011-3-16在17:36

@David Thornley:这样可以使C ++面向方法吗?

–back2dos
2011年3月16日19:12

我对60年代的这个术语不太了解,应该选择类似“面向消息”的名称

–艾伦·凯(Alan Kay)
2011年6月8日在16:27

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

– mlvljr
2011年7月6日在22:49

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

– Mark Cidade
2011年7月7日在2:59

#3 楼


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


”“我们甚至都没有在PARC中实现所有想法。最初的Smalltalk激发了许多卡尔·休伊特(Carl Hewitt)的Actors思想,其精神更多地是出于OOP的考虑,而不是后来的Smalltalks。

摘自艾伦·凯(Alan Kay)的评论,网址为:

http://computinged.wordpress.com/2010/09/11/moti-asks -objects-ever-ever-everly-ever /

评论


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

–icc97
18-10-21在20:10

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

–icc97
18-10-21在20:12

#4 楼

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

据我所知,Alan对OOP的愿景是使计算机成为一种工具,该工具可以使人类用户随心所欲:计算机的全部功能都可以直接使用。最终用户通过直观的交互模型。我应该能够直接查看并雕刻运行时对象和交互,而不仅仅是通过代码。

这里有一篇关于我计划在JavaScript中尝试对此版本进行验证的计划的帖子:http: //www.cemetech.net/forum/viewtopic.php?p=234494#234494

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

评论


DDD使用类似的概念。也许您对此是正确的。 :-)

– inf3rno
17年9月21日在23:36