松散耦合的依赖关系:如何?

时间:2014-02-16 14:48:26

标签: php oop dependency-injection type-hinting

如何才能最好地将两个类分离,但仍然依赖彼此?

我有类型提示的构造函数参数:

public function __construct(\namespace\Interface1 $class1,
    \namespace\Interface2 $class2,
    \other\namespace\Abstract1 $class3){

但这是紧密耦合的,比如说:

new \namespace\Class1();

欢迎任何其他方法。

1 个答案:

答案 0 :(得分:1)

使用接口意味着您与实现分离。

您不能使用其他组件(即依赖项)而不至少与某些事物耦合。问题是如何最小化这种耦合:

  • 自己实例化依赖意味着耦合到类,该类的构造函数和依赖项的所有子依赖项。这非常糟糕。
  • 要求/ type-hinting(在构造函数参数中)特定类的对象意味着您与该类强烈耦合。如果你想改变课程,那你就搞砸了。这很糟糕。
  • 要求/类型提示实现接口的对象意味着您只能将自己耦合到接口。这意味着您可以拥有该界面的任何实现。这很好,你不是很依赖你的依赖,你只需要一个可以做X的对象(X是接口定义的契约)。

最后,这是关于选择涉及较少耦合的解决方案。

另一种方法是使用事件:您的类可以引发事件,并且依赖项会侦听这些事件。这样,您的类只耦合到EventManager的接口。

但是事件解决方案并不适合所有用例:您无法保证任何人实际注册到该事件,并且实际上在该事件上做了一些事情。如果你刚刚调用了一个方法,就无法获得结果。

结论:使用像你这样的界面很好,这里没有问题。:)