我应该如何调用使用鸭子打字的过程?我应该说“我正在执行鸭子打字”或“我正在检查它是否是鸭子:)”。
鸭子检查听起来不太好,类型检查只是简单的错误名称。
我应该如何调用使用鸭子打字的过程?我应该说“我正在执行鸭子打字”或“我正在检查它是否是鸭子:)”。
鸭子检查听起来不太好,类型检查只是简单的错误名称。
我会说,我正在使用鸭子打字。它与“我正在使用静态类型”的内容相同,尽管它们是不同的东西。
我认为这里的上下文很重要,我们是在谈论内联注释还是整体设计文档?
对于设计文档,我认为说我使用鸭子打字是很合理的。
在代码中的给定点,我不确定这样说是否有用。考虑一下,使用一些虚构的语言
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程序周围做面向对象一样。评论可能会说明为什么您知道该对象可以计算中位数,或者如果不能计算该怎么办。
鸭打字
这个名字来自以下短语:
如果它长得像鸭子,游得像鸭子,叫起来像鸭子,那么它很可能就是鸭子。
https://en.wikipedia.org/wiki/Duck_test
这意味着如果它具有鸭子的所有相关属性,为什么还要仔细测试以检查它是否不是鸭子。
它可能不是鸭子,但大多数人不会在意,因为它在现在很重要的那些方面很像鸭子。
鸭子类型在这种方式上是相似的:为什么要控制参数和变量的类型来限制用户可以执行的操作。
传递给函数的类型无关紧要,只要操作仍然适用于它实际上是什么类型。
如果你可以添加两种类型,谁在乎它们是什么数字类型?
如果你传递给paginateResult()
函数的对象有一个query()
, 和一个get_next_result()
方法,它是什么类型有什么关系?
在静态类型语言中,对象必须是接口的子类queryResult
或实现paginates
接口。