我们在使用面向对象(OO)的编程语言时,时常感到有些挚肘的地方,可又无法言表,这说明OO技术有不足,网上都有很多这方面的讨论。这里我谨谈一点个人粗浅的看法。
我和很多人的看法一样,认为软件表达了编程人对客观世界的认识,在软件中我们设计了或表达了现实世界中的对应物。那么就Java而言,她的万物之本Object如何与现实世界对应?
可以想象,Object对应于物理学中的基本粒子,我们的万事万物皆来源于此。可是我们知道的基本粒子并不只有一种,什么质子、中子、介子等等。但是有些物理学家在冥冥之中笃信有一种最最基本的粒子,由它构造了我们的世界,因此前赴后继、越钻越深,据说现在已经穷追到了夸克、胶子,也许伟大的终极发现指日可待。那就假设Object对应这个最最最基本粒子吧。我们知道基本粒子都有一种能级跳跃的本事,如果我们万事万物都继承于它们的话,那你我显然也能这么干(不知一人得道鸡犬升天算不算?)。你有没有试过?所以,我们万事万物不是继承于基本粒子,而是由基本粒子所组成,组成后就发生了质变,不是原来的东东了。因此Object不能对应基本粒子。
让我们来到精神世界,将Object对应于上帝。世界各国都有将灵性或物品当作神的化身的传说,而神显然又是上帝的化身。在中国有道生一、一生二、二生三、三生万物之说,道就是中国的上帝。而我们软件中的所有东东均来源于Object,显然Object可以对应于上帝。上帝的特点不仅大慈大悲,而且法力无边。可是我们的Object却相对弱智的多。在西方,有天赋人权之说。在中国,上天还赋予我们生存权、发展权,据说最近还多给了我们一种:和谐权。Object有此能耐么?Object仅有8种法力(方法),而且这8种法力还经常无用武之地。不仅如此,在我们的软件中,任何一个家伙,其法力都会大于他,至少也不亚于他。Object是我们软件中最笨拙、最愚蠢的家伙。如果将Object对应于上帝真是OO的本质的话,那这个愚笨的Object是否就是挚肘我们施展拳脚的根源?
也许以上都不对,再换一种视角:Object只是我们对万事万物的一种最基本的抽象。这回总算说到点子上了。可是我们的世界总是先有万事万物,然后才能对其中的事物进行抽象。所谓:横看成岭侧成峰。总是先有山在那里,从一个角度去看,我们抽象出“岭”,从另一个角度去看,我们抽象出“峰”,最后我们又进行更高级的抽象:有岭有峰谓之“山”。在软件世界中,则恰恰相反,我们必须先有抽象,然后再有具体实现。我们先期已经构造了“岭”和“峰”,有一天忽然发现其实更应该构造的是“山”,你说这“山”是继承“岭”还是继承“峰”?于是前功尽废,重新来过。OO的死穴昭然若揭。
困难压不倒英雄汉,死穴岂可点大师?大师谆谆教诲我们:要尽量针对接口编程,而非针对实现。也有称之为面向接口。接口这位类的表兄天生就是来化解死穴的。相对类而言,接口才是真正代表了抽象。你说“山”有岭之魂,那就实现一个“岭”的接口;你说“山”有峰之魄,那就再实现一个“峰”的接口。接口在OO家族中虽非直系宗亲,却是我最为敬仰的。看看接口在软件世界中所受到的顶礼膜拜,其程度远远甚于类。任意打开一个中间件的API说明,其中最为扎眼的就是接口。OMG的规范文本开口闭口皆为接口,类则黯然失色。作为类的最高领导,Object的地位显然受到严峻挑战。可他还坐在那至高无上的皇位之上。名不正言不顺啊,怎一个愁字了得。
沉舟侧畔千帆过,死穴前头却萦愁。我能化解这千古愁吗?不才汗颜,我哪有这本事?除非我继承了基本粒子,来个能级跳跃。不过冥冥之中我可以有一个梦想,幻想在不久的将来,有一个小子,他实现了能级跳跃(没有继承基本粒子,大概接了口)。他创立了一种语言,不再面向对象,也不面向方面,而是面向上帝(饶恕我的不敬,阿门!)。所有的东东均为上帝的化身,所有的东东从它创立的那一刻起,便有了无限灵性的可能。我们在软件中编写的一切法术,均是属于上帝的,编得愈多,上帝的法力愈大。那位说了,这样的话,你的软件中就不需要其他东东了,所有事情均由上帝代劳可以了。此言差矣,让上帝一人干活,你怎能忍心?没有其他东东,岂不回到混沌世界?在那个世界,无须干任何活。为了抽象,为了表达现实世界的需要,我们和上帝都需要东东。上帝根据某个抽象概念,将必要的法力赋予他所看中的东东,这个东东于是就变成了那个概念所表达的东西了。一旦龙颜不悦,可以随时废了他的功力,他就又变成什么也不是的东东了。打一个现实一点的比方,有一部手机,仅能打电话和接电话。一日,上帝兴起,赋予了它拍照的法力,于是,它就变成了数码相机,同时也还是手机。还需要接口吗?问一问上帝,或查一查它的法力表,就知道它能代表什么概念了。