写点什么

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

2010 年 7 月 15 日

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

评论

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

PHP实现一致性哈希算法

任小龙

在Windows上使用IIS来托管站点

Puran

windows IIS Server

一文搞懂分布式消息中间件设计

小隐乐乐

消息队列

第一个Spring程序(代码篇)

JavaPub

spring

唯一路径的动态规划解法,阿里巴巴架构演化路径 John 易筋 ARTS 打卡 Week 07

John(易筋)

动态规划 ARTS 打卡计划 系统架构演化 唯一路径

ARTS Week6

丽子

spring 那点事儿——让你少走弯路

爱java爱自己

Spring Cloud Spring Boot

区块链+金融赋能高原特色农业重点产业

CECBC区块链专委会

打破信息孤岛 区块链+咖啡 特色农业 咖云链

Java架构-Apache POI Excel

猿灯塔

ConcurrentHashMap里面也有死循环

无予且行

Java jdk Java 面试 jdk8

【思考】互联网厂商争夺企业市场

superman

企业中台 互联网

Git【入门】这一篇就够了

JavaPub

spring

专科程序员与本科程序员之间有什么区别?薪资待遇又差多少?

码农月半

spring 程序员 程序员人生 Java 面试 程序员成长

如何站在架构师的角度做框架

小新

Java 集合 框架

架构师训练营第五周学习总结

张明森

一致性Hash算法——架构师训练营第5周

架构 极客大学架构师训练营 一致性Hash算法 第5周作业 负载均衡算法

你真的理解透彻高并发了吗?来看看架构师眼里的高并发

小谈

Java 面试 高并发 高并发系统设计

80%会问到的18个Dubbo面试题,快来看看你都掌握了吗

小新

Java 程序员 架构 面试 dubbo

极客大学架构师训练营 系统架构 消息队列 数据库备份 第10课 听课总结

John(易筋)

负载均衡 极客时间 极客大学 极客大学架构师训练营 消息队列

Python设计模式 单例模式

早睡蟒

Python 面向对象 设计模式 单例模式

架构师训练营 -week5 命题作业

J.Spring

极客大学架构师训练营

授权专利争夺正当时

CECBC区块链专委会

数据隐私 授权专利 平台应用服务

解读 java 并发队列 BlockingQueue

猿灯塔

Java

LeetCode | 7. Merge Two Sorted Lists 合并两个有序列表

Puran

Python C# 算法 LeetCode

游戏夜读 | 简单认识一下爬虫

game1night

ARTS|Week 6 合并有序列表、团队、MIME类型和IIS

Puran

LeetCode ARTS 打卡计划

总结

Mr.Monkey

面试官:既然CPU有MESI,为什么 JMM 还需要volatile关键字?

犬来八荒

Java JVM 硬件 java面试

面试中必问的JVM应该怎么学(面试题含答案)

猿灯塔

第五周作业

秦宝齐

学习

一篇告诉你什么是Spring

JavaPub

spring

NLP领域的2020年大事记及2021展望

NLP领域的2020年大事记及2021展望

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