【问题标题】:Loosely coupled dependencies: How?松散耦合的依赖关系:如何?
【发布时间】:2014-03-15 18:46:38
【问题描述】:

如何最好地解耦两个类,但仍然让它们相互依赖?

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

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

但是这是否像以下那样紧密耦合:

new \namespace\Class1();

欢迎任何其他方法。

【问题讨论】:

  • 我不确定我是否理解这个问题。您能否通过回答这些问题来澄清一下:您认为哪两个类是紧密耦合的?其中哪一个取决于另一个?
  • @ShaunakKashyap 对不起。具有构造方法的类将依赖于 Class1。
  • 你可以省略命名空间,它们在这里似乎没有什么区别,只是增加了混乱。
  • @Jack 谢谢。但是我在自动加载时使用命名空间作为文件夹

标签: php oop dependency-injection type-hinting


【解决方案1】:

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

你不能使用另一个组件(即依赖项)而不耦合到至少一些东西。问题是如何最小化这种耦合:

  • 自己实例化依赖意味着耦合到类、该类的构造函数以及依赖项的所有子依赖项。这很糟糕。
  • 要求/类型提示(在构造函数参数中)特定类的对象意味着您与该类紧密耦合。如果你想换班,那你就完蛋了。这很糟糕。
  • 要求/类型提示实现接口的对象意味着您只需将自己耦合到接口。这意味着您可以拥有该接口的任何实现。这很好,你和你的依赖关系不是很耦合,你只需要一个可以做 X 的对象(X 是接口定义的契约)。

归根结底,就是选择耦合度更低的解决方案。

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

但事件解决方案并不真正适合每个用例:您无法保证任何人都实际注册了该事件,并且实际上对该事件做了一些事情。如果你只是调用一个方法,你不能像你一样得到结果。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 2013-05-26
    • 2020-10-26
    • 2011-02-22
    相关资源
    最近更新 更多