如何称为使用鸭子打字

Posted

技术标签:

【中文标题】如何称为使用鸭子打字【英文标题】:How is called use of duck typing 【发布时间】:2011-06-13 20:05:29 【问题描述】:

duck typing的使用过程应该如何调用?我应该说“我正在执行鸭子打字”或“我正在检查它是否是鸭子:)”。

鸭子检查听起来不太好,类型检查只是一个错误的名字。

【问题讨论】:

...这是一个编程问题吗? @Anonymous:哈哈哈......不,我想他的意思是duck typing。 哦,我不明白这些编程理论的废话。 我认为你应该说“我在嘎嘎叫”。并解决它。 xD 顺便说一句,对于那些想知道为什么叫鸭子打字的人:这句话起源于这样一句话:“如果它看起来像鸭子,叫起来像鸭子,那它一定是鸭子。” 【参考方案1】:

我会说,我正在使用鸭子打字。它与“我正在使用静态类型”类似,尽管它们是不同的东西。

【讨论】:

【参考方案2】:

我认为这里的上下文很重要,我们是在谈论内联 cmets 还是整体设计文档?

对于设计文档,我认为说我正在使用鸭式打字是很合理的。

在代码中的给定点,我不确定这样说是否有用。考虑一下,使用一些虚构的语言

 function wibble(anObject) 

      // what do we say here? 
      anObject.computeMedianValue();

      anObject.render(device);
 

首先请注意,我们实际上并没有检查它是一只鸭子,在示例中我看到代码只是运行

 obj.quack()

程序结构通常安排只有可以嘎嘎作响的东西才能传递下去。我没有看到很多例子

if (obj can quack )
  obj.quack()
else if ( obj can grunt)
  obj.grunt()

这不会是非常多态的,但即使我们确实想检查功能,我们也不会编写代码

if ( obj isA duck)

鸭子类型的整个想法是我们考虑在当前上下文中我们需要的特定功能 - walk(像鸭子),quack(像鸭子) - 而不是“它是鸭子吗?”

所以在代码中我不会特别提到鸭子类型,就像我在标准 Java 程序周围散布我正在做面向对象一样。注释可能会说明为什么您知道该对象可以计算中位数,或者如果不能计算该怎么办。

【讨论】:

【参考方案3】:

鸭子打字

这个名字来源于这句话:

如果它长得像鸭子,游得像鸭子,叫起来像鸭子, 那么它可能是一只鸭子。

https://en.wikipedia.org/wiki/Duck_test

这意味着如果它具有鸭子的所有相关属性,为什么还要仔细测试以检查它是否不是鸭子。

它可能不是鸭子,但大多数人不会在意,因为它在现在很重要的那些方面很像鸭子。

鸭子类型在这方面是类似的:为什么还要控制参数和变量的类型来限制用户可以执行的操作。

传递给函数的类型无关紧要,只要操作仍然适用于它真正的类型。

如果你可以添加两种类型,谁在乎它们是什么数字类型?

如果您传递给paginateResult() 函数的对象具有query()get_next_result() 方法,那么它是什么类型有什么关系?

在静态类型语言中,对象必须是queryResult 的子类或实现paginates 接口。

https://en.wikipedia.org/wiki/Duck_typing

【讨论】:

以上是关于如何称为使用鸭子打字的主要内容,如果未能解决你的问题,请参考以下文章

golang 鸭子打字使用界面

使用 python 3.5 样式类型注释进行鸭子打字

鸭子打字和(java)接口概念

减少实体组件系统中的鸭子打字劣势

什么是鸭子打字?

带有鸭子类型对象的打字稿字符串文字