鸭子类型:一切是为了复用
2014-01-10 16:04
330 查看
尊重原创:http://www.cnblogs.com/ohmyjava/archive/2006/12/24/2141966.html
当小平同志说出“科技是第一生产力”的时候,中国的发展无不是围绕此展开的。软件工程亦是如此。虽然小平同志的话只是一个总结。但必须承认,这个总结非常有见地。
软件发展,你可能已经被各种各样的名次搞晕了头。一堆类似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++语言中一直被人骂的鸡肋多重继承,大家有没有去想想他出现的根本?原因还在于复用。因为,人们不满足于只能仅仅复用简单的个体,很希望能够吸取多种对象的功能。这和现实是很相近的。一个业务实体往往能够兼备多种实体的功能。
尽管后来其他语言都是采用接口的机制取代多重继承,来实现业务实体的多个功能面的契约定义。可是,接口只是解决的契约的定义。另外,对于契约,其实有时候是很不公平的事。这让我想起一个微软的认证。
微软的认证是有阶梯约束的。过了初级才能考中级,而不管你是否已经拥有了初级的能力。一句话,你得听我的!这种契约式的预定,制约了很多已经拥有了能力,但是没有交钱考试的人!对于他们,这是多么不公平的事?而且,如果有一项任务,必须拥有某种资格认证的人才能做,你是看资质证书呢?还是看能力表现?
这是个非常有意思的问题。如果是你,你会选择哪个呢?静态语言选择了前者,动态语言选择了后者。
鸭子理论这个时候,就是充分想利用这些没有获得契约的资源。在不改变这些对象的前提下,使用这些资源,就是非常大的复用。
所以说,万变不离其宗!抓住“复用”这点,就能很容易理解很多新技术的背后思想。
当小平同志说出“科技是第一生产力”的时候,中国的发展无不是围绕此展开的。软件工程亦是如此。虽然小平同志的话只是一个总结。但必须承认,这个总结非常有见地。
软件发展,你可能已经被各种各样的名次搞晕了头。一堆类似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++语言中一直被人骂的鸡肋多重继承,大家有没有去想想他出现的根本?原因还在于复用。因为,人们不满足于只能仅仅复用简单的个体,很希望能够吸取多种对象的功能。这和现实是很相近的。一个业务实体往往能够兼备多种实体的功能。
尽管后来其他语言都是采用接口的机制取代多重继承,来实现业务实体的多个功能面的契约定义。可是,接口只是解决的契约的定义。另外,对于契约,其实有时候是很不公平的事。这让我想起一个微软的认证。
微软的认证是有阶梯约束的。过了初级才能考中级,而不管你是否已经拥有了初级的能力。一句话,你得听我的!这种契约式的预定,制约了很多已经拥有了能力,但是没有交钱考试的人!对于他们,这是多么不公平的事?而且,如果有一项任务,必须拥有某种资格认证的人才能做,你是看资质证书呢?还是看能力表现?
这是个非常有意思的问题。如果是你,你会选择哪个呢?静态语言选择了前者,动态语言选择了后者。
鸭子理论这个时候,就是充分想利用这些没有获得契约的资源。在不改变这些对象的前提下,使用这些资源,就是非常大的复用。
所以说,万变不离其宗!抓住“复用”这点,就能很容易理解很多新技术的背后思想。
相关文章推荐
- 鸭子类型:一切都是为了复用
- 鸭子类型:一切都是为了复用
- 鸭子类型:一切都是为了复用
- 鸭子类型:一切都是为了复用
- 鸭子类型:一切都是为了复用
- POI 日期类型的显示,日期类型存储为Double,数字类型雷同,为了显示为日期格式。。。
- QuartusII下,解决添加引脚后配置引脚的麻烦,一切都是为了节省时间
- 一切皆对象之两个方法概括js,无函数签名(无多态),原型,闭包,封装,引用类型,继承……
- 诠释 Linux 中“一切都是文件”概念和相应的文件类型
- 一切为了笔试~
- Linux 中“一切都是文件”概念和相应的文件类型
- 读奇虎Q3季报:一切都是为了货币化
- [置顶] 心情札记 --- 人活着是为了天天开心快乐, 去憧憬和实现一切美好的事物
- 一切都是为了提高自己...
- 51的核心定位,一切为了泡与被泡!
- 《Java编程思想》学习记录仪三 -- 2.2.2 基本类型初步介绍(第二章一切都是对象)
- [翻译]并非一切类型都继承源自object
- 详解duck typing鸭子类型程序设计与Python的实现示例
- 代码自动生成 --- 一切都为了提高您的工作效率,和苦逼码农说NO
- springmvc的参数绑定和类型转换(东西不是我写的,为了方便记一下)