繁体   English   中英

为什么动态/松散类型的语言接口?

[英]why interfaces in dynamic/loosely-typed languages?

我在php工作,接口的概念在我看来有点无用。 从阅读中,我理解接口是“按合同设计”的一部分,但至少不保证某类特定类型的返回,实际上没有任何合同。 这似乎是一份合同,上面写着“我们同意做以下事情:''” - 没有协议的条款。

如果我想保证一个对象有一个方法,那么接口似乎并不特别有用。 如果我尝试调用一个对象没有的方法,我会得到一个致命错误,所以我很快发现该类没有一个具有该名称的方法。 如果我想要聪明并事先检查一个类是否有方法,那么检查接口,并查看对象是否实现了该接口似乎不再节省我的时间,而不仅仅是直接检查该对象(我会这样做)无论如何,无论它做了什么接口或没有实现任何接口,该类都有该方法。

换句话说,仅仅因为我有一组具有特定名称的方法,这并不能保证我有任何特定的行为 如果我保证返回某个类型的变量,我至少会对输出的内容有所了解,并且我可以编写使用该接口的对象的代码,因为我知道我得到的是什么它的。 如果它返回一个字符串,我可以继续编码至少确定我之后正在处理字符串输出。 所以当指定返回类型时,我保证至少有一些行为。 是保证行为的一部分是什么接口,或不是?

我唯一能想到的是,当我编写代码时,它会作为一个便利贴给自己,以确保在以后编写该类时创建某些方法。 当我编写代码时,它似乎更像是脚手架; 当我实际使用它时,我没有看到太多的好处。 因此,在我创建类时,保持标准比在编写类时要多得多。 这种好处似乎并没有真正体现在合同设计的概念中。

在动态/松散类型的语言(如PHP)中使用接口实际获得了哪些好处? 它们是伟大的,还是更强大的OO语言实现的东西,所以PHP也实现了它?

当您实际期望对象实现方法时,将使用接口。

例如,如果我正在构建一个DB包装器并且它支持您自己在引导程序中注册的行为,那么在运行您的行为之前(例如,sluggable),我将通过使用以下方法检查它们是否实现了我的“DB_Wrapper_Behaviour_Interface”:

if(!($behaviourObject instanceof DB_Wrapper_Behaviour_Interface)) {
    throw new Exception("Your behaviour doesn't implement my interface");
}

没有退货类型,合同设计变得更加困难,但不要忘记赞成“告诉”而不是“问”。

我相信一个界面就像一个责任。 您正在编码并需要合作者。 你要求它做某事,因为你正在处理的代码不能做任何事情。 所以你要求另一个对象做某事。 界面保证协作者可以完成工作,但隐藏了“如何”完成的部分。

现在你可以争辩说这里不需要正式的合同,因为如果合作者不能做你要求它做的事情,系统就会抛出一个错误。 但我认为错过了使用接口作为责任的重点。

获得致命错误并不总是“容易”。 有时您必须继续执行特定模块/操作才能看到课程中实际缺少某些内容。 该接口使您能够确保实现每个方法并记录这些方法(参数究竟是什么,返回值应该是什么样的)。 如果参数/值是具有特定结构的数组并且您不想使用类(为了简单起见),这将非常有用。

我想指出,PHP 5.4将支持类型提示。 现在我觉得函数参数只有类型提示,但我想也会有返回值。 (至少已经存在一个RFC ,虽然它是一个非常陈旧且过时的RFC 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM