BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

面向对象编程──走错了路?

| 作者 Dave West 关注 1 他的粉丝 ,译者 池建强 关注 4 他的粉丝 发布于 2010年7月16日. 估计阅读时间: 9 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

“如果我们现在回头看一下面向对象这个思想是从哪来的,如果以基于消息传递机制的Smalltalk-80的特性来衡量现在的状态继承和面向对象的使用方式,我们不禁要问,我们是不是已经走错路了?”这是在2010伦敦QCon大会采访中提给Joe Armstrong和Ralph Johnson的一个公开问题。Joe Armstrong是Erlang语言的早期开发人员,而Ralph Johnson则长期从事Smalltalk、面向对象编程和模式等领域的研究。受访者都表明目前我们都已经在这条“错路”上了,但这是由于实现上的缺陷导致的,并不是面向对象的思想本身有问题。Ralph Johnson的原话是这样的:

事实上这样的事情总在发生,你有了一个好的想法,并把它公布了出去,但对于大多数人来说,它总是显得很激进。很多人不愿意全盘接受这套理论,他们总是采用其中的一部分,这样,你就会看到很多相似的东西出来。

甚至是Smalltalk,被很多人奉为面向对象语言的典范,也只是在向面向对象这个理念无限逼近。Johnson博士为Smalltalk提了两个具体的问题:

... 我想Smalltalk犯了一个根本性的错误。我觉得让那些不用Smalltalk编程的人去理解Smalltalk是非常困难的,但是如果你在使用Samlltalk进行编程和调试,你会发现你是在调试整个系统。

而且

在Smalltalk中你可以从映像中得到任何你想要的对象。但你没法对新旧对象的版本进行跟踪 ... 还有,复杂度总是一个问题。你构建了一个系统,只有少数人能够维护它,而且Smalltalk并不是总能工作的很好。

事实上,把所有的东西(你的应用类,开发和调试工具和库)都放在“映像”中一直是Smalltalk的问题,即使是对这门语言的崇拜者来讲也是一样。但是,这并不妨碍人们去构建大型的关键任务的系统,例如Cargill Lynx项目。Lynx是全球的粮食贸易系统,该系统支持的用户超过1500,在全美有150多个站点,而且已经运行了十多年了。在Lynx项目的生命周期内,有超过一百名程序员对其进行开发维护,全版本控制,健壮性测试和调试。类似Lynx这样的巨型项目,并不能消除Ralph Johnson的质疑,当然他们也没有否认Smalltalk是一个有缺陷的面向对象的实现。他们只是从不同视角提出了自己的观点。

什么样的特征能够让一门语言具备面向对象的特性,这个问题在90年代进行了广泛和激烈的辩论。在伦敦QCon大会的采访中,Joe Armstrong's的论文导师的话被引述之后,同样引发了争论:

我开始想知道面向对象编程到底是什么,而且我认为Erlang不是面向对象的,它是函数式编程语言。那我的论文导师就说了:“你是错的,Erlang是完全面向对象的”。他说面向对象的语言其实不是去面向对象。我在想,虽然我不能确信是不是能相信这句话,但Erlang可能是唯一的面向对象语言,这时因为Erlang具备面向对象编程的三原则:基于消息传递机制,对象分离和多态。

Armstrong博士表示,他并没有被他的导师的论点说服,但似乎认为Erlang“可能是唯一的面向对象语言。” 除了之前提到的三个特征,单继承和动态类型也被引用为面向对象语言的“绝对需求”。

在这次采访中,Johnson博士和Armstrong博士都表示,面向对象的思想在过去和现在都是非常重要的。Armstrong博士花时间分析了Erlang是如何试图实现面向对象的思想和语言的特性。Johnson博士则花了更多的时间批判以前的试图实现面向对象思想的实践,特别是Smalltalk。这有点奇怪,因为长期以来他一直是Smalltalk和面向对象思想(Johnson博士合著的设计模式的书的标题包含了面向对象)的倡导者,但是Ralph Johnson的论点并不孤立。

Dave Thomas是另一个对面向对象和Smalltalk有相近观点的人。他的团队为Digitalk's Method(第一个PC上的Smalltalk应用)创建了第一个“Goodies Packs”,他是该公司的创始人和CEO,他们的成果最终成为了IBM的VisualAge Smalltalk,而且他的团队开发了非常流行的工具Eclipse(本来是为Smalltalk写的)。Thomas博士被引用的话包括“面向对象是个错误”和“我是国家罪人。” 这些描述当然是为了增加戏剧效果,但同样也指出了Smalltalk在实现对象思想时的“错误”──例如,只关注状态,在类和基于映像的语言里缺乏良好的并发模型和消息机制。

Alan Kay最先提出了“面向对象”词条,他和Dan Ingalls以及其他在Xerox PARC共事的人发明了重要的Smalltalk语言。在最近的澳大利亚计算机世界的采访中,他谈到:

我确实创造了这个词条(而且现在看来这是个糟糕的选择,因为它并没有强调消息传递的重要性)。现在其中一部分思想仍然存在(在几个系统中)。考虑到所有的有效虚拟机的通讯都能通过消息进行交互,我们其实可以建立一个更为全面的理论基础。这样的基础可以提供更好的伸缩性,是我的研究社区的虚拟版本,ARPA-IPTO(美国国防部研究机构的信息处理技术办公室)已经开始构建大规模网络,同时具备强大的“代数”属性(类似多态性)...... 然而,我并不是Smalltalk的粉丝,虽然至今Smalltalk仍然比其他大多数编程系统更好用(我不喜欢其中任何一种,而且至今我也不认为它们适合解决真正的编程问题,无论是对系统还是对终端用户)。

最近对Smalltalk的批评使我想起了在旧杯垫歌曲中重复的那句歌词,Charlie Brown唱到:“(为什么每个人都针对我)。” 当然,Johnson、Armstrong、Kay和Thomas都没有“针对我(Smalltalk)” 。在伦敦QCon大会采访中,其他相对低调一点的批评者提出,正如Johnson博士所言,好的思想总是“对大多数人显得很激进”,那么什么程度的思想才能够被任何程序语言实现呢?

这很可能是因为编程语言无法直接通过定义和结构去描述面向对象的思想。在澳大利亚计算机世界的采访中,Kay博士指出:

对我来说,采用真实对象语义的好处之一就是它们是“real computers all the way down  (RCATWD)”──这意味着真实对象保留了全部的能力,可以描述任何事物。用旧的方式虽然可以快速获取数据和过程,但它们不是电脑,延迟优化和分析某些行为是否合理的能力会突然丢失。换句话说,总有真实对象保留着能力去模拟你想要的东西,并把它发送到周围环境中...... 而且RCATWD还提供了两个方向上的完美保护。我们能够从网络(可能是工作中唯一真正面向对象的系统)的硬件模型中了解这种思想。你只需要简单的接受消息格式的约定,就可以免费获得语言的扩展性。我在70年代的想法是,我们一起在互联网上工作并进行个人计算,这是一个非常好的可扩展的设计,而且我们还可以通过虚拟机构建虚拟网络,通过硬件机器进行缓存等。非常糟糕的是这些想法并没有得以实现。

如果‘真实对象’是RCATWD,那么就可以使用编程语言以最恰当的方式实现每个对象的内在特性,这将为‘多语言编程’赋予新的含义。

查看英文原文:Object Oriented Programming: The Wrong Path?

 

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

我也认为Erlang或者类似语言才是真正的OO by 典 刘

发送消息和函数调用是有本质区别的。

Ralph Johnson, Joe Armstrong on the State of OOP by 高 翌翔

www.infoq.com/interviews/johnson-armstrong-oop

值得认真思考:What is Object-Oriented Programming?
俺也没有答案 :-(

对象和类这2个概念应该分开 by Shichao Liu

函数调用适用于构建对象的内部实现, 而不适合作为对象间交互的方式,因为函数内部逻辑会持有调用线程,并且同时会被多个线程调用, 进而破坏封装.

Re: Object oriented languages aren't object oriented by 高 翌翔

Joe Armstrong 说他的导师曾他说过,“Object oriented languages aren't object oriented”!

语言只是工具,而人类只要有了新思想就可以改造或创造更多更好的新工具!

Re: OOP 思想的本质是封装稳定的抽象!!! by 高 翌翔

OOP 思想的本质是封装稳定的抽象!!!

在 OOPL 流行的今天,真正的大师们仍在有关思考 OO 的问题!

而使用 OOPL 的程序员在做什么?
继续用面向过程的思路编写一个个匪夷所思的类、构建所谓的 n 层架构、模式的滥用作为炫耀的资本?!
没错,这个程序员就是“我”,一名 C# 程序员!

Smalltalk,Erlang,Ruby,Java,C# 等等 OOPL 仅仅是工具,而非 OO!
OOPL 编写出的程序,并未展现 OO 的众多优点,相反,Bug 不断,代码如一团乱麻,难以维护!

我开始寻找解决办法,拜读大师们的著作,从中寻求答案!
直至今天,我认识到“OOP 思想的本质是封装稳定的抽象”,它与实现语言无关!

我对OOP的理解《OOP思维导论》 by Wei Todd

Re: OOP 思想的本质是封装稳定的抽象!!! by Wei Todd

同意。

讨论这个有什么意义? by 冯 光头

求指点.

Re: Ralph Johnson, Joe Armstrong on the State of OOP by henyo ma

同样的

Re: OOP 思想的本质是封装稳定的抽象!!! by henyo ma

上面说的就是我这样一个java程序员,
你怎么找到oop的真谛的?

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

10 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT