在过去的25年里,编程世界发生了巨大的变化,如今,我们有大量的有用的、灵活的数据类型可以使用,但在25年前,你需要花大量的额外时间自己去构造这些类型。
C和Pascal语言——当时的标准语言——提供了少量的面向机器的数据类型:数字,指针,数组,形式上的字符串,以及把多种数据组合到一起的结构体或record。重要的是,以这些基本的类型为基石,我们可以构造出更多有趣的类型,例如栈,树,链接表,哈希表,可变数组等。
在Perl或Python,或Erlang语言里,我不需要考虑这些东西。我在使用list、string或array时,根本不关心它们能容纳多少元素,或放在内存的什么地方。最常使用的还有字典,同样,根本不担心它的容量或哈希冲突是如何避免的细节内容。
除此外,我仍然需要一些新的数据类型,但它们更多的是现有类型的一种变换,而不是重新构造。任意维度的vector实际就是array。一个RGB颜色值实际上一个3元tuple。一个多项式既可以是一个tuple,也可以说list。我惊奇于这些array,tuple,list,dictionary等数据类型大大的消除了我在大学课程里学到的那些基本数据类型上的不便。在实现一个平衡二叉树时,你的注意力放在如何让二叉树平衡,而不是痛苦的纠结于乱如麻的指针操作。
将已有的小方块搭建成一个新的建筑,这将会引起比小方块出现带来的更大的变化。这些小方块是如何出现的已经不是人们关心的重点。在很多的编程课程和教材中,本来很好的教学中突然出现了一批新词汇:对象,构造器,抽象基础类,以及私有方法。于是,下一次作业中,用简单的三元tuple来表达的RGB颜色值变成了由一个具有get、set方法,多高构造器的类来代替,更要命的,出现了大量的代码。
这就是为什么有人会不停的呼吁、解释为什么面向对象不是个好东西、会使编程失去乐趣的原因。但很少奏效。
并不是面向对象不好,或含有什么缺陷。而是面向对象不是计算机编程的基本原子,它们不是人们想象的天生就存在的。不设门槛的任意使用面向对象来解决问题会让代码变得臃肿和过度技术化,然而,很多人还是坚持锲而不舍的用对象来解决所有问题。这非常糟糕,因为这样做让人们辨不清面向对象风格的做法是否真的产生了使问题简化并易于理解的效果。