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

时间:2010-08-25 16:23:04

标签: php oop design-by-contract

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

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

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

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

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

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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