王垠的 OOP 批判 | AI生成和翻译

Home 2026.03

问题:https://yinwang0.wordpress.com/2013/12/24/oop/ 的博客文章说了什么?

回答:

这是一篇由王垠(一位编程语言研究员)撰写的批判性文章,标题为 “On Object-Oriented Programming”(写于2013年末)。它是对 OOP 范式的一个全面批判。以下是关键论点的分解:


1. OOP 被当作一种宗教

作者开头将 OOP 称为“religion”——声称它承诺拯救世界免于“software crisis”,但反而带来了比益处更多的困惑和伤害。他认为尽管其教条从根本上是有缺陷的,但已深深根深蒂固。


2. “万物皆对象”是一个错误的教条

OOP 对对象的定义是“数据字段与相关过程(称为方法)的组合”。作者认为,并非万物都能符合这个模型。例如,速度、时间或变化等概念并不自然地包含方法——这就好比说“子弹包含了枪”。

他还指出了操作符问题:在 1 + 2 中,+ 属于 1 还是 2?这种任意选择揭示了操作本质上是在对象外部,而非内部。

他将“万物皆对象”与类似失败的教条相比:“万物皆函数”(lambda calculus / Church numerals)和“万物皆集合”(set theory)——两者在智力上都很有趣,但推向极端时都不实用。


3. 函数不是对象

将函数放入对象中的最初动机是狭隘的实用性——GUI 按钮回调。但这种有限用例无法证明“万物皆对象”的普适原则。

他认为,大多数方法只是碰巧以对象作为参数的函数。它们使用对象作为命名空间,而非逻辑所有者。像 Scala 或 Python 这样的语言将函数包装成带有 apply__call__ 方法的对象,但这只是包装——它并没有在任何有意义的意义上使函数成为对象。


4. 过度抽象是有害的

OOP 鼓励一种抽象层次,使得程序难以理解和分析。他描述了 Java 程序中多层继承、重载和 design patterns,这些实际工作很少,将导航此类代码比作走迷宫。

他还批判了 Smalltalk 的“extremely late binding”——甚至 if+ 都能被重新定义——认为这使得不可能知道任何代码片段的实际含义,并使编译器优化和静态分析变得非常困难。


5. Design Patterns 是 OOP 弱点的症状

作者认为,design patterns 主要是由于“万物皆对象”的教条以及 OO 语言中缺乏适当的高阶函数而产生的。他引用了 Peter Norvig 1998年的演讲,显示一旦拥有 first-class functions,几乎所有 design patterns 都会变得“transparent”。

他将 design patterns 描述为解决良好设计语言中不存在问题的权宜之计。他将它们的营销比作减肥产品——承诺简单解决方案而不理解基本原理——并认为它们“吃掉程序员的大脑”,导致他们以过度复杂的方式思考。


6. “OO Language”是一个无意义的营销术语

没有明确定义什么使一种语言成为“object-oriented”。OOP 从过程式编程中借用了(或“偷窃了”)大多数想法,重命名了术语,并将其营销为原创。“OO”标签历史上主要用于营销优势。


7. 对教育和行业的危害

许多大学用 Java 取代了像 Pascal(过程式)或 Scheme(函数式)这样的入门语言,导致学生错过了最基本的编程概念。作者曾在 Cornell 和 Indiana 为 Java 入门课程担任助教,观察到学生对 OOP 概念如 this、private fields、getters/setters,以及方法与 static methods 的区别感到极度困惑。

在行业中,他认为用 OO 语言构建的优秀系统是尽管 OOP 而成功,而非因为 OOP——因为熟练的程序员避免纯 OO 风格,转而采用更过程式/函数式的混合方式编写。


8. 结论:不要接受 OOP 的思维方式

作者最后的建议不是对 OO 语言宣战,而是避免 OOP 在过程式编程之上添加的额外“true OO techniques”。通过避开这些有问题的特性,你仍然可以在 OO 语言中编写可接受的程序——因为你本质上是在将其用作非 OO 的过程式语言。


一句话总结: 王垠认为 OOP 的核心教条——“万物皆对象”、design patterns、极端抽象和 late binding——从根本上是误导性的、对学习和实践都有害,优秀的程序员通过在很大程度上忽略这些 OOP 特定特性来取得成功。

参考文献:


Back Donate