在不总是检查属性和方法的情况下,如何在JavaScript中使用鸭子输入?
简单:不必总是检查属性和方法。
在Ruby中,您所说的称为“鸡型”。使用一种动态的鸭子式语言,您只需相信调用方会为您传递一个合适的对象。履行合同的一方是呼叫者的工作。
我知道javascript使用鸭子类型,而且起初我认为与强类型语言(如C#)相比,这会使多态性变得容易。
您在这里混淆了多个正交轴输入。有四个正交的打字轴:
- 时间:动态类型(在运行时才知道和检查类型)与静态类型(在运行时才知道和检查类型)
- 什么:鸭子类型(类型是基于行为),结构性类型(类型是基于结构)和名义类型(类型是基于名称)
- 你看得到他们吗?显式类型(必须对类型进行显式注释)与隐式类型(推断出的类型)
- 强键入与弱键入–您可能已经注意到,我没有给这个标题加上醒目的标题,也没有在括号中给出解释,这是因为与上述七个术语不同,每个术语都有一个通用的精确定义,这两个术语有大约十二个相互矛盾的半广泛使用的模糊定义;理想情况下,您应该完全避免使用这些术语,并且如果必须使用它们,请先精确定义它们
自从您提到C#:它主要是静态类型的,但是支持通过type进行动态类型的输入dynamic
,它主要是名义上的类型的,但是匿名类型使用结构化类型,并且语法模式(例如LINQ查询理解语法)可以说是鸭蛋。类型或结构类型,它通常是显式类型,但支持通用类型参数和局部变量的隐式键入(尽管与大多数其他语言相比,局部变量的大小写很奇怪,因为您不能只是将类型排除在外,而必须给它一个明确的伪类型var
,换句话说,如果您要使用隐式类型,则必须明确声明。C#是强类型还是弱类型取决于所使用的两个术语的定义,但是请注意,C#中可能存在很多运行时类型错误,尤其是由于数组的协方差不安全。
我知道我无法检查,但是跟踪javascript运行时错误可能是一场噩梦,因为它们并非总是在代码中实际发生错误的地方发生。
调试并非易学的技能。但是,有一些使调试更容易的技术,例如Saff Squeeze是Kent Beck描述的一种技术,它使用测试和重构进行调试:
回归测试和Saff压缩
三河研究所肯特·贝克
摘要:为了有效地隔离缺陷,请从系统级测试开始,逐步进行内联和修剪,直到您拥有最小的可以证明缺陷的测试为止。