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

#思特沃克好声音#

(图片:网络)

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

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

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

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

    Javascript中鸭子型的实现:

function log(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 {

    return any.(I).Get()

 }

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

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

原文发布于微信公众号 - 思特沃克(ThoughtWorks)

原文发表时间:2014-04-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C/C++基础

C++以智能指针管理内存资源

C++作为一门应用广泛的高级编程语言,却没有像Java、C#等语言拥有垃圾回收(Garbage Collection )机制来自动进行内存管理,这也是C++一直...

1263
来自专栏王亚昌的专栏

让代码更有效率的方法

        老大总结的代码级提高代码执行效率需要注意的点,很值得和大家分享一下,在这儿也由衷地感谢下老大的总结和工作中的指导。大多数的点都在项目中验证过,比...

831
来自专栏idealclover的填坑日常

C语言循环和switch中的break和continue

问题的关键在于循环和switch中的break和continue的不同。在switch中是响应break但不响应continue的,换句话说,在switch中使...

2371
来自专栏二进制文集

Java 与 C/C++ 的编译器对比

这两天重温了周志明的《深入理解Java虚拟机》第2版,发现第11章第4节关于 Java 编译器的内容写得太棒了~本文完全摘自《深入理解Java虚拟机》第2版 0...

2136
来自专栏灯塔大数据

塔秘 | Python 2.7即将停止支持,请收下这份3.x迁移指南

前言 目前,Python 科学栈中的所有主要项目都同时支持 Python 3.x 和 Python 2.7,不过,这种情况很快即将结束。 去年 11 月,Num...

3589
来自专栏java一日一条

程序中减少使用if语句的方法集锦

大约十年前,我听说了反if的活动,觉得这个概念非常荒谬。如果不用if语句,又怎么能写出有用的程序呢?这简直太荒谬了。

1532
来自专栏Java3y

给女朋友讲解什么是代理模式

2675
来自专栏瓜大三哥

UVM(十)之config机制续1

UVM(十)之config机制续1 1. 省略get的config config总是set和get成对出现的。在build_phase中,要写上如下的两句话才...

2769
来自专栏马洪彪

spss C# 二次开发 学习笔记(二)——Spss以及统计术语解释(IT人眼中的统计术语)

针对客户需求,需要对一些数据做统计分析。统计分析的第一步,即为数据查询,查找出要统计分析的数据。 查询得出的是一个行列表格的结果集,行、列、表格等这些IT的数据...

2825
来自专栏java一日一条

编写高质量代码的思考

最近在看《代码大全》,可以说是一本软件开发的百科全书,特别厚,但是干货也很多。平时写代码,代码规范是一个最低的要求(很多老代码连最低要求都达不到),为什么要这样...

1042

扫码关注云+社区

领取腾讯云代金券