鸭子类型:一切都是为了复用

当小平同志说出“科技是第一生产力”的时候,中国的发展无不是围绕此展开的。软件工程亦是如此。虽然小平同志的话只是一个总结。但必须承认,这个总结非常有见地。

软件发展,你可能已经被各种各样的名次搞晕了头。一堆类似OP、OO、SOA等等概念,如果你半年不关心IT,很可能你就发觉被世界遗忘了。

可是推开这些概念的表面迷雾,你会看到,所有这的一切,都是我们在努力提高生产力的结果。而提高生产力的最有效方法就是复用!

从汇编语言的出现,后来高级语言C的出现,面向对象的C++出现,面向类型的动态语言(如Python,Ruby)出现(这是我个人的看法,我若认为动态语言主要是从类型入手进行复用,欢迎指正),个个都是围绕不同层次的复用,复用二进制指令、复用逻辑、复用对象、复用类型。

这里我特意说一下动态语言中的Duck Type(走起来像鸭子那就是鸭子 it walks like a duck so it must be a duck)。如果说这是一种类型的话,我更愿意称之为“鸭子理论”。因为不为理论,不足以说明其在思想上的先进性。

def Sum(a as duck, b as duck):
      
return a + b

上面是一段简单的语法。如果从实现上讲,duck也许只是让编译器识别的一个关键字而已。代码执行的时候,会根据duck进行类型推定。但是我们这里讲的不是实现,而是藏在duck后面的思想。

那么,为什么要有鸭子出现?回答这个问题很难。因为我们都已经被静态类型的语言影响很久,甚至可以说毒害不浅,这会让我们非常难以接受新的思想。

静态类型中最最关键的一点是面向契约编程,即双方定下调用契约,然后你实现,我调用。这解决了很大问题。可是,你有没有发现就是因为这点,我可能不能复用很多我原本可以复用的。

谈到这里,我先说一下多重继承。C++语言中一直被人骂的鸡肋多重继承,大家有没有去想想他出现的根本?原因还在于复用。因为,人们不满足于只能仅仅复用简单的个体,很希望能够吸取多种对象的功能。这和现实是很相近的。一个业务实体往往能够兼备多种实体的功能。

尽管后来其他语言都是采用接口的机制取代多重继承,来实现业务实体的多个功能面的契约定义。可是,接口只是解决的契约的定义。另外,对于契约,其实有时候是很不公平的事。这让我想起一个微软的认证。

微软的认证是有阶梯约束的。过了初级才能考中级,而不管你是否已经拥有了初级的能力。一句话,你得听我的!这种契约式的预定,制约了很多已经拥有了能力,但是没有交钱考试的人!对于他们,这是多么不公平的事?而且,如果有一项任务,必须拥有某种资格认证的人才能做,你是看资质证书呢?还是看能力表现?

这是个非常有意思的问题。如果是你,你会选择哪个呢?静态语言选择了前者,动态语言选择了后者。

鸭子理论这个时候,就是充分想利用这些没有获得契约的资源。在不改变这些对象的前提下,使用这些资源,就是非常大的复用。

所以说,万变不离其宗!抓住“复用”这点,就能很容易理解很多新技术的背后思想。

我最近在学习动态语言的时候,一直在思考其中的思想。一些感悟,写出来和大家一起分享。 

posted on 2006-12-24 01:18  ohmyjava  阅读(1790)  评论(0编辑  收藏  举报

导航