在动态语言的世界里一直流传着一种叫做鸭子类型的风格,其来自谚语:“如果行鸭子一样走路,像鸭子一样呱呱叫,那它就是一只鸭子”。

从鸭子类型,我们可以联想到它的推导,并不在乎类型的真正实体,只要他的行为有鸭子的特性,那么我们就可以把它当做一只鸭子来看到。在动态语言设计中,可以解释为无论一个对象是什么类型的,只要它具有某类型的行为(方法),则它就是这一类型的实例,而不在于它是否显示的实现或者继承。

鸭子类型在动态语言中被广为奉行。某类接口需要一个log接口,换句话说这借口中需要调用传入对象的log,方法,在动态语言中无论你传入的是什么对象,只有具有log方法则就是合法的。而java,c#这类静态强类型语言(当前首先声明c#已经不是纯的静态强类型语言,它具有dynamic,表达式,当然这里所说的c#是去掉这类特性,或者说C#2.0吧)我们传入的对象是必须显示实现该接口的类实例,他们直接必须具有显示的继承链。

以上所说的是两类语言设计中的对抽象的制约的区别。

Javascript中鸭子型的实现:

functionlog(logger){

logger.log(“hello world”);

}

log({log:function(msg){

console.log(msg);

}});

代码量很少,这里只是一种简单的约定,而不是强制,使得我们的自控感增强,所以我喜欢javascript这门语言给我的自由度。但是相对于java这类静态强类型语言而言是将语法的检查推向了运行时期,延迟了发现问题的时间,不助于我们的调试。在强类型系统的语言中由于具有完备的类型信息,我们可以提高良好的IDE于开发时限制,有助于我们的大规模开发。所以这里没有对错,只是看你的选择和喜爱。如果你是一个优秀的程序员,动态语言这种检查的推迟对你并无什么问题,因为你能够有条理次序的节奏型开发。

关于鸭子型风格这里还得必须提到go语言,也是go语言带来我对这种风格的思考。

我们还可以显示的定义在消费者方法中,形如

func SomeFunction(logger interface{Log(string)}){

logger.Log(“hello world, I am go lang”).

}

实现提供者:

type S struct{ }

func (this *S)Log(msg string) {

console.log(msg)

}

在类型S就是一个实现了Logger的实例。

Go还有一种叫做空接口,能够容纳万物的东西;

func log(any interface{}) int{returnany.(I).Get()

}

Go语言不同于其他鸭子类型语言的是它实现了在编译时期检查,同时也不失这种自由度。

另外TypeScript想必你也知道 ,这与google的dart一样致力于将javascript带入大规模开发的语言,不同的是TypeScript是javascript的超集,并不是重造一门新语言。他为javascript引入的接口,类型,泛型等较完备的类型系统,是的能够有更好的IDE支持,从某种程度上来说,这是对鸭子类型或者javascript编译器的检查推迟的弥补。

java鸭子类型_语言设计中的鸭子类型风格相关推荐

  1. 语言设计中的鸭子类型风格

    在动态语言的世界里一直流传着一种叫做鸭子类型的风格,其来自谚语:"如果行鸭子一样走路,像鸭子一样呱呱叫,那它就是一只鸭子". 从鸭子类型,我们可以联想到它的推导,并不在乎类型的真正 ...

  2. 凡是函数中未指定存储类型_凡是函数中未指定存储类型的局部变量,其隐含的存储类别为    。...

    凡是函数中未指定存储类型的局部变量,其隐含的存储类别为 . 答:自动(auto) 婴儿1.5岁-2岁时,使用的句子主要是( ). 答:电报句 监控批量成本预测需要() 答:选择预测所需的成本研究 现行 ...

  3. java converter转换器_在SpringMVC中设置自定义类型转换器Converter

    前言 在SpringMVC中为我们提供了许多内置的类型转换器,当我们在HTML表单中发起一个请求时,Spring会根据表单项中name属性的值映射到POJO的属性名,调用相对性属性的set方法帮我们把 ...

  4. c++ enum 给定类型_讲解C++中的枚举类型以及声明新类型的方法

    C++枚举类型如果一个变量只有几种可能的值,可以定义为枚举(enumeration)类型.所谓"枚举"是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内.声明枚举类型用 ...

  5. qq空间网页设计_网页设计中的负空间

    qq空间网页设计 重点 (Top highlight) Because screens are limited, web design is also limited. It can be said ...

  6. 视觉感知_产品设计中的视觉感知

    视觉感知 The role of the UX designer has evolved immensely over time, but at its core, it remains the sa ...

  7. java coin介绍_代码示例中的Java 7:Project Coin

    java coin介绍 该博客通过代码示例介绍了一些新的Java 7功能,这些项目在Project Coin一词下进行了概述. Project Coin的目标是向JDK 7添加一组小的语言更改.这些更 ...

  8. Java 8 Friday:语言设计很微妙

    在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. Java 8星期五 每个星期 ...

  9. qq空间网页设计_网页设计中负空间的有效利用

    qq空间网页设计 Written by Alan Smith 由艾伦·史密斯 ( Alan Smith)撰写 Negative space is a key design element that y ...

最新文章

  1. 32位dll注入到64位程序_你用的32位还是64位?有什么区别呢?
  2. zookeeper动物园管理员学习笔记
  3. caffe apt install
  4. kibana操作elasticsearch:多词条精确匹配(terms)
  5. 用C#开发.NET CF 蓝牙通信模块
  6. SolrCloud7.4(Jetty容器)+mysql oracle 部署与应用
  7. 推荐一款软件(作业)
  8. Visual Studio 2022发布了,我最爱的5大特性
  9. 医疗器械监管系统总结
  10. java游戏暂停弹出字体_小白写了个java的小游戏 想加个暂停的功能 无从下手 求大佬们帮...
  11. python自动化是什么意思_python appium自动化是什么?
  12. [Erlang 0041] 详解io:format
  13. 简记mysql在tomcat下和hibernate一起使用,No suitable driver found for的问题
  14. 随机搜索和网格搜索以优化函数
  15. 134安装教程_最新市政造价教程
  16. STM8(STM8S003F3) Bootloader (IAP) 升级程序
  17. 内网环境中公网域名解析成内网地址的问题
  18. java实现树形菜单_Java构建树形菜单的实例代码(支持多级菜单)
  19. MySQL之——mysqldump参数详细说明
  20. 数据库——操作(mysql)

热门文章

  1. 2020.06-Study_update.4
  2. 微信小程序picker组件实现多列选择器
  3. maya包裹表情变形_MAYA制作逼真的人物表情之变形制作教程
  4. 图像基础知识与Python中Pillow库Image模块的基础应用
  5. CSS3 Tranform 3D 的应用
  6. ZZULIOJ1066-1070Python解法
  7. 小白保险:听说你买了一份保险?
  8. 使用pyplot一定要记得close
  9. execle表快速移动表格到另一个execle表
  10. CMD命令下进入某个文件夹 运行.py文件