Shell's Home

Apr 19, 2011 - 1 minute read - Comments

编程语言的一点想法

最早高级语言出现的时候,编程是面对过程式的。当你需要喝水时,你需要判断是否有热水,没有烧。有热水之后倒,倒好了喝掉。和我们日常过日子的思路差不多。

后来,我们出现了OO,即面对对象编程。OO的好处是,当你处理某个对象的某个动作时,是无须关心外部世界的。这将问题切割成了很多细节动作来完成,非常有利于多个程序员协作。

但是C++和Java在OO的实现上有些问题,主要问题是接口。C++必须先定义函数才能调用,Java也至少需要接口定义才能抽象调用。接口的存在妨碍了对象处理繁杂的动作。例如,我定义了一个抽象的人。可以吃饭,可以喝水。然后具体的把自己实现出来,于是我可以实现自己的吃饭和喝水了。但是,我脾气比较暴躁,看到不顺眼的就会骂人,看到驴蛋就抽丫的,偏偏人这个抽象接口没有定义骂人这个函数。

一种做法是修改抽象接口。这往往导致定义混乱,接口三天两头修改。

另一种做法是,将动作抽象成算子,应用Command模式。于是增加新的动作出来的时候,只需要产生新的算子,抽象的把动作传进去,然后,bing,事情就做好了。从某种意义上说,你可以把Command模式当作python中的bound function。

然而,你不觉得很繁琐么?明明我是支持骂人的,你直接骂就好了。使用Command模式需要为每个动作产生一个新类,内部机制无比繁琐。偏偏OO中有些人为了抽象而抽象,绕这么大一个圈子还沾沾自喜,我会用这么复杂的设计模式了。。。

更大的问题是,Factory模式之类简单模式还好说,Command等复杂模式,和人类的先天思考并不吻合。这导致严重的心智负担,并且只有经过严格培训的人才能进行编程。这是训练人以适应机器的做法,很不人道。 objective c在解决这个问题上就漂亮多了,objective c采用的是消息传递风格,想要什么自己拿好了。python也应用了类似的机制。

C++中之所以设计接口,是因为C++主要面向效率,因而当时采用的是虚函数设计。C++要求编译期决定调用哪个函数,多态的时候用虚函数表来确定。但是在目前,一方面是CPU速度已经没有紧张到这个地步,另一方面,objective c经过改善,效率也接近了C++。所以无论从哪个方面说,都不要再写一堆接口了。