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