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