我应该在接口中添加所有公共功能吗?

时间:2019-06-28 07:56:24

标签: php oop

我发现一些项目没有在接口中声明所有公共方法,而该接口仅使用了一次。

类似classinterface。接口中未声明transform方法。

AFAIK我们使用界面来允许计算机对对象(类)强制执行某些属性。

那么当该接口只有一个实现时,是否应该在该接口中添加所有公共方法?

2 个答案:

答案 0 :(得分:0)

这取决于您的界面所表达的内容。接口和类之间不必存在1:1的关联,否则接口和类的区别将毫无意义。

您抽象定义接口以描述对象需要实现的期望。例如:

interface Foo {
    public function bar();
}

function baz(Foo $foo) {
    $foo->bar();
}

这描述了一个函数baz,该函数需要一个实参$foo,该实参至少实现一种方法bar()。为了满足此要求,您需要具有一个implements Foo的类。 该类还可以实现其他接口或实现更多方法。

class ConcreteFoo implements Foo, Bar, Baz, Countable, ArrayAccess {
    public function bar() { ... }

    public function ham() { ... }

    ...
}

除了许多其他事项之外,此类还满足interface Foo的期望。不必担心interface Foofunction baz。这称为interface segregation

所以,不,接口不一定表示实现该接口的类的每个方法。

答案 1 :(得分:0)

您并不需要所有类的接口,但是许多人认为将接口放在应用程序的不同层之间或应用程序的不同逻辑块之间是一个好主意。

因此,例如,如果您的应用程序访问数据库,则在数据库和应用程序的其余部分之间放置一个接口是一个好主意,因此您可以轻松使用另一个数据库而无需更改应用程序的其余部分。

应用程序中的示例是一个存储库,其中有一个pattern

  

存储库

     

使用以下命令在域和数据映射层之间进行调解   类集合的接口,用于访问域对象。

如果您在不同目录中具有不同的源代码逻辑块,那么在它们之间放置接口也是一个好主意,您可能会决定将某一部分放在另一台服务器上。有一个很好的工具可以定义边界并检查是否没有破坏边界:deptrac

一旦您定义了规则并运行deptrac,它将创建如下图像:

enter image description here