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

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

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

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

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

def Sum(aasduck, basduck):returna+b

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

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

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

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

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

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

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

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

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

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

定义一个鸭子的类java_鸭子类型:一切都是为了复用相关推荐

  1. 设计一个Windows应用程序,要求如下: 构造一个产品基类。 分别定义家电、日用百货、衣服等派生类,具体要求有不同的特征和行为。 定义一个泛型货架类,约束参数类型为产品

    设计一个Windows应用程序,要求如下: 构造一个产品基类. 分别定义家电.日用百货.衣服等派生类,具体要求有不同的特征和行为. 定义一个泛型货架类,约束参数类型为产品类.该泛型的货架类包括一个泛型 ...

  2. C#设计一个Windows应用程序,要求如下。 ①构造一个产品基类。 ②分别定义家电、日用百货、衣服等派生类,要求具有不同的特征和行为。 ③定义一个泛型货架类,约束参数类型为产品类。该泛型的货架类包

    设计一个Windows应用程序,要求如下. 1.构造一个产品基类. 2.分别定义家电.日用百货.衣服等派生类,要求具有不同的特征和行为. 3.定义一个泛型货架类,约束参数类型为产品类.该泛型的货架类包 ...

  3. 3.【练习题】构造方法与重载 定义一个网络用户类,要处理的信息有用户ID、用户密码、email地址。拓展:判断密码长度

    package day09;/*3.[练习题]构造方法与重载 定义一个网络用户类,要处理的信息有用户ID.用户密码.email地址. 在建立类的实例时,把以上三个信息都作为构造函数的参数输入, 其中用 ...

  4. 定义一个长方形(Rectangle)类,有长、宽属性,对每个属性都提供相应的get/set方法。

    // 定义一个长方形(Rectangle)类,有长.宽属性,对每个属性都提供相应的get/set方法. package ch3; import java.util.Scanner; public cl ...

  5. 《JAVA练习题目7》 定义一个素数生成器类PrimeGenerator,用于生成给定区间内的所有素数。(类PrimeGenerator都由类Main代替)

    题目内容: 定义一个素数生成器类PrimeGenerator,用于生成给定区间内的所有素数.要求PrimeGenerator类具有: 属性:start(区间起始值),end(区间终止值),两个属性均为 ...

  6. 构造方法与重载:定义一个网络用户类,信息有用户 ID、用户密码、 email 地址。在建立类的实例时把以上三个信息都作为构造函数的参数输入

    构造方法与重载:定义一个网络用户类,信息有用户 ID.用户密码. email 地址.在建立类的实例时把以上三个信息都作为构造函数的参数输入, 其中用户 ID 和用户密码时必须缺省时 email地址是用 ...

  7. 定义一个 圆形 Circle类 , 定义其中的长度length属性,定义一个求面积getArea()的方法。 并编写一个测试类,进行长度的赋值和展示,并调用求面积方法展示面积值。

    定义一个 圆形 Circle类 , 定义其中的长度length属性,定义一个求面积getArea()的方法. 并编写一个测试类,进行长度的赋值和展示,并调用求面积方法展示面积值. public cla ...

  8. 定义一个圆形Circle类。属性: r:半径 成员方法:get/set方法 showArea方法:打印圆形面积 showPerimeter方法......

    需求: 定义一个圆形Circle类. 属性: r:半径 成员方法: get/set方法 showArea方法:打印圆形面积 showPerimeter方法:打印圆形周长 定义测试类,创建Circle对 ...

  9. c++ 定义一个字符栈类Stack(包括类的实现)。数据成员包括一个存放字符的数组stck[ ]和一个栈指针tos。栈数组的尺寸由常量SIZE确定。栈的基本操作为Push()和Pop()。

    定义一个字符栈类Stack(包括类的实现).数据成员包括一个存放字符的数组stck[ ]和一个栈指针tos.栈数组的尺寸由常量SIZE确定.栈的基本操作为Push()和Pop(). //定义一个字符栈 ...

  10. 首先定义一个Point (点)类,包含属性x,y(x,y为坐标点),方法有setPoint、getX、getY和OprintInfo...python编程题练习

    复习python编程题集合的第五题,若有错误和改进意见,欢迎评论交流!            首先定义一个Point (点)类:                   (1)包含属性x,y(x,y为坐标 ...

最新文章

  1. DDD分层架构最佳实践
  2. python操作neo4j
  3. “诺奖摇篮”贝尔实验室:从辉煌到衰败的百年沉浮
  4. C++中使用Json的方法
  5. 服务器重启后,启动SAP ERP的步骤
  6. codeforces 112A-C语言解题报告
  7. 软件测试中的存根程序
  8. Angular / Ionic,React,Vue? 使用Stencil.js面向未来的应用程序!
  9. Dubbo学习笔记(一)
  10. Appium+python自动化(十六)- ADB命令,知否知否,应是必知必会(超详解)
  11. krpano漫游加方向性3D声音(这篇文章已被移到krpano中国网站 krpano360.com)
  12. c语言extern_【零基础C语言】- static和extern关键字 - 对变量的作用!
  13. 快速、准确使用EndNote插入参考文献
  14. 【毕业设计】大数据疫情数据分析及可视化系统 - python
  15. linux 光功率 模块_光模块基本参数-消光比/光功率/灵敏度
  16. C++之AStar寻路算法
  17. 8种赚取被动收入的方式
  18. JAVA-IDEA使用技巧
  19. 【游戏开发】视觉小说休闲游戏
  20. 微信去除 防欺诈盗号请勿支付或输入qq密码 以及 防欺诈或盗号请不要输入qq密码 的方法...

热门文章

  1. 影视动画专业有木有c语言,那些头秃的专业,不了解一下?
  2. win7升级win10正式版_win7升级win10数据是否会丢失?
  3. 全息投影图片合成-(matlab)(将4个视角图合成为一张)
  4. 如何在地图上按地址搜索位置
  5. 一文搞懂Overleaf(Latex)中的Environment和\newenvironment命令
  6. DS博客作业06——图
  7. 计算 变异系数 标准差 标准偏差 相关系数 平滑指数 回归系数等C++ 模板类
  8. python爬取电影票房网并保存csv
  9. domain adaptation 领域自适应
  10. Android经典蓝牙连接