把握行业变革关键节点,12 月 19 日 - 20 日,AICon北京站即将重磅启幕! 了解详情
写点什么

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

  • 2010-07-15
  • 本文字数:2725 字

    阅读完需:约 9 分钟

“如果我们现在回头看一下面向对象这个思想是从哪来的,如果以基于消息传递机制的 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?

2010-07-15 18:4211067

评论

发布
暂无评论
发现更多内容

跨架构编程不再难,英特尔机器编程工具迎来重磅更新

E科讯

1分钟解密:博睿大数据核心引擎Bonree Zeus六大优势

博睿数据

《前端实战总结》之使用CSS3实现酷炫的3D旋转透视

徐小夕

css3 大前端 CSS小技巧

挑战赛 | 话题王者VS互动先锋(第一季)

InfoQ写作社区官方

话题讨论 热门活动

已拿腾讯后台开发岗offer,简单说下自己的面试经历和学习路线

程序员小灰

c++ 后台开发 架构师 TCP/IP Linux服务器开发

架构师训练营第 11 周课后练习

叶纪想

极客大学架构师训练营

英特尔发布第二代Horse Ridge低温量子控制芯片

E科讯

《技术男征服美女HR》—Fiber、Coroutine和多线程那些事

太白上仙

Java 程序员 面试 后端 多线程

Linux平台中调试C/C++内存泄漏方法 (腾讯和MTK面试的时候问到的)

linux大本营

c++ Linux 后台开发 架构师

即使不会node.js,拖拽就可完成数据的可视化展示

华为云开发者联盟

node.js 数据 可视化

一个真正0基础小白学习前端开发的心路历程

华为云开发者联盟

开发 开发小白 0基础

给你一个亿的keys,Redis如何统计?

不才陈某

redis

ONES 收购知名协作工具 Tower

万事ONES

团队协作 高效 研发管理工具 收购 资讯

性能压测

jorden wang

英特尔推动集成光电的发展,用于数据中心

E科讯

javascript开发后端程序的神器nodejs

程序那些事

Java 后端 nodejs koa 程序那些事

腾讯大牛整合Java+spring5系统学习架构,神乎其技

小Q

Java 学习 编程 面试 spring 5

IntelliJ IDEA 2020.3正式发布,年度最后一个版本很讲武德

YourBatman

IDEA 新特性 2020.3

国产电子表格Luckysheet后台也开源了!支持在线协作,一键docker私有部署

奇异石榴果

Java Excel SpreadJS 表格控件

训练营第七周作业

大脸猫

极客大学架构师训练营

ONES 收购 Tower,五源资本合伙人对话两位创始人

万事ONES

项目管理 团队协作 ONES Tower 收购

想了解任务型对话机器人,我们先从自然语言理解聊起

华为云开发者联盟

人工智能 机器人 自然语言

微软最强 Python 自动化工具开源了!不用写一行代码!

星安果

Python 微软 自动化 自动化测试 playwright

加码线下,新荣耀“破题”场景经济

脑极体

关于binlog,这个参数能不能用?

Simon

MySQL Binlog

谁能阻止世纪互联星光?2020年第11期北京机房网络质量评测数据排行榜发布

博睿数据

新闻|Babelfish使PostgreSQL直接兼容SQL Server应用程序

PostgreSQLChina

数据库 postgresql 开源

面试无忧:源码+实践,讲到MySQL调优的底层算法实现

996小迁

Java 架构 面试

英特尔神经拟态生态系统发展和研究的最新进展

E科讯

架构师训练营第 1 期 -week11

习习

【技术分享】浅谈RTC及Agora RTC SDK集成介绍

Hanson

面向对象编程──走错了路?_后端_Dave West_InfoQ精选文章