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