PG Paul Graham 文集
100%
Part 5 · 早期文章 Early Essays

为什么Arc并非特别面向对象

最近似乎流行起了一股面向对象编程的热潮,但我认识的一些最聪明的程序员却对此并不怎么热衷。

我个人认为,面向对象编程在某些情况下是一种有用的技术,但并不意味着必须贯穿于你编写的每一个程序中。你应当能够定义新类型,但不必将每个程序都表达为新类型的定义。

我想人们喜欢面向对象编程有五个原因,其中三个半是不太好的:

  • 如果你使用的是没有词法闭包或宏的静态类型语言,那么面向对象编程会令人兴奋。它在某种程度上提供了一条绕开这些限制的路径。(参见格林斯潘第十定律。)

  • 面向对象编程在大公司中很流行,因为它契合了他们的软件开发方式。在大公司里,软件往往由庞大的(且频繁变动的)平庸程序员团队编写。面向对象编程为这些程序员设定了一种纪律,防止其中任何一人造成过大损害。其代价是,生成的代码充满了协议,臃肿且重复繁多。对大公司而言,这个代价不算太高,因为他们的软件无论如何都可能会变得臃肿且充满重复。

  • 面向对象编程产生了大量貌似的工作。回想连续纸打印机的时代,有一种程序员,他们只在每页上写5到10行代码,前面加上20行精心格式化的注释。面向对象编程对于这类人来说就像毒品:它让你能把所有这些脚手架直接嵌入源代码中。一个Lisp黑客或许只需将一个符号压入列表就能解决的事情,到了这里就变成了整整一个包含类和方法的文件。因此,如果你想说服自己或他人你正在做大量工作,这是一个好工具。

  • 如果一门语言本身就是一个面向对象程序,那么它可以由用户进行扩展。嗯,或许吧。或者,通过按需提供面向对象编程的子概念,你或许能做到更好。例如,重载并不是必然与类绑定在一起的。我们拭目以待。

  • 面向对象抽象完美地映射到某些特定类型的程序领域,例如模拟和CAD系统。

就我个人而言,从不需要面向对象的抽象。Common Lisp拥有极其强大的对象系统,但我一次也没用过。我做过许多事情(例如创建满是闭包的哈希表),这些在功能较弱的语言中可能需要面向对象技术才能实现,但我从未被迫使用CLOS。

也许我只是愚钝,或是只涉及了一些有限的应用子集。基于个人编程经验来设计语言存在风险。但更危险的是,仅仅因为认为某个特性是个好主意,就把它加入到你从未需要过的东西中。