为什么 ARC 不是特别面向对象的
OriginalJanuary 2001
目前,面向对象编程有一种狂热,但我知道一些最聪明的程序员对它并不那么兴奋。
我个人的感觉是,面向对象编程在某些情况下是一种有用的技术,但它并不是必须贯穿你编写的每个程序的东西。你应该能够定义新的类型,但你不应该必须将每个程序都表达为新类型的定义。
我认为人们喜欢面向对象编程有五个原因,其中三个半是错误的:
如果你有一个静态类型的语言,没有词法闭包或宏,面向对象编程会让人兴奋。在某种程度上,它提供了一种绕过这些限制的方法。(参见Greenspun 的第十条规则。)
面向对象编程在大公司很流行,因为它适合他们编写软件的方式。在大公司,软件往往由大型(且经常变化)的平庸程序员团队编写。面向对象编程对这些程序员施加了一种纪律,防止任何一个人造成过大的破坏。代价是生成的代码充斥着协议,充满了重复。这对大公司来说不是太高的代价,因为他们的软件很可能无论如何都会膨胀,充满了重复。
面向对象编程会产生很多看起来像工作的东西。在翻页纸的时代,有一种程序员只会在页面上放五到十行代码,前面是二十行精心格式化的注释。面向对象编程就像这些人的可卡因:它让你把所有这些脚手架直接融入你的源代码。Lisp 黑客可能通过将一个符号推入一个列表来处理的事情,变成了一个完整的类和方法文件。所以,如果你想说服自己或其他人,你正在做很多工作,它就是一个好工具。
如果一种语言本身就是一个面向对象的程序,它就可以被用户扩展。好吧,也许吧。或者,也许你可以通过提供面向对象编程的子概念来更好地做到这一点。例如,重载本身并不与类绑定。我们拭目以待。
面向对象的抽象可以很好地映射到某些特定类型程序的领域,例如模拟和 CAD 系统。
我个人从未需要面向对象的抽象。Common Lisp 拥有一个功能强大的对象系统,但我从未使用过它。我做过很多事情(例如,制作充满闭包的哈希表),这些事情在更弱的语言中需要面向对象技术才能完成,但我从未需要使用 CLOS。
也许我只是愚蠢,或者只在某些有限的应用程序子集上工作过。根据自己编程经验设计语言存在风险。但把一些你从未需要的东西放进去,因为人们认为这是一个好主意,似乎更危险。