Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

为什么 Arc 没有特别面向对象

原文:Why Arc Isn’t Especially Object-Oriented
作者:Paul Graham 发表:—
译者:Claude(baoyu-translate)

眼下有一种对面向对象编程的狂热——但我认识的最聪明的几位程序员,恰恰是对它最不兴奋的几个。

我自己的感觉是:面向对象编程在某些情形下是一种有用的技术——但它不是一种必须贯穿你写的每段程序的东西。你应该能够定义新类型——但你不应当被迫把每一段程序都表述为新类型的定义

我觉得人们喜欢面向对象编程有 5 个原因——其中3 个半是糟糕的:

  1. 如果你用的是一门没有词法闭包、没有宏的静态类型语言,面向对象编程就令人激动——它在某种程度上提供了绕开这些限制的途径。(参见 Greenspun 第十定律。)

  2. 面向对象编程在大公司里流行,因为它适配大公司写软件的方式。在大公司里,软件往往由大型且频繁换人的、由平庸程序员组成的团队写。面向对象编程给这些程序员强加了一种纪律,避免任何一个人造成太大破坏。代价是——产出的代码被各种“协议“撑得臃肿,且充满重复。对大公司来说这代价不算高——反正他们的软件本来也大概率会臃肿、充满重复。

  3. 面向对象编程能制造出一大堆看起来像工作的东西。在折页打印纸(老式带孔连续打印纸)的年代,有一种程序员——一页只放 5 行或 10 行代码,前面冠以 20 行精心格式化的注释。面向对象编程对这种人就像可卡因:它让你能把这套脚手架直接糊进源代码里。一件 Lisp 黑客可能用“把一个符号 push 进一个列表“就处理掉的事,会变成一整个文件的类和方法。所以——如果你想说服自己(或别人)你正在做大量工作,它是一件好工具。

  4. 如果一门语言本身就是一段面向对象的程序,它就能被用户扩展。嗯——也许吧。又或者,把面向对象编程的子概念 à la carte(法语:按菜单点选)单独提供会更好。比如“重载“,本质上并不和“类“绑定。我们走着瞧。

  5. 面向对象的抽象确实整齐地映射到某些特定种类程序的领域——比如仿真和 CAD 系统。

我个人从没需要过面向对象的抽象。Common Lisp 有一个极其强大的对象系统,我一次都没用过。我做过许多事(比如造一个塞满闭包的哈希表)——这些事在更弱的语言里要解决就得用面向对象的技巧——但我从来不用 CLOS(Common Lisp 对象系统)也能解决

也许只是我蠢,或者我做的应用是某种有限的子集。“基于自己的编程经验去设计一门语言“是有风险的。但把自己从没需要过、却被认为是个好主意的东西塞进去,看上去风险更大