松散耦合的依赖关系:如何?
Posted
技术标签:
【中文标题】松散耦合的依赖关系:如何?【英文标题】: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 谢谢。但是我在自动加载时使用命名空间作为文件夹 【参考方案1】:使用接口意味着您与实现分离。
你不能使用另一个组件(即依赖项)而不耦合到至少一些东西。问题是如何最小化这种耦合:
自己实例化依赖意味着耦合到类、该类的构造函数以及依赖项的所有子依赖项。这很糟糕。 要求/类型提示(在构造函数参数中)特定类的对象意味着您与该类紧密耦合。如果你想换班,那你就完蛋了。这很糟糕。 要求/类型提示实现接口的对象意味着您只需将自己耦合到接口。这意味着您可以拥有该接口的任何实现。这很好,你和你的依赖关系不是很耦合,你只需要一个可以做 X 的对象(X 是接口定义的契约)。归根结底,就是选择耦合度更低的解决方案。
另一种方法是使用事件:您的类可以引发事件,并让依赖项监听这些事件。这样,你的类就只耦合到 EventManager 的一个接口。
但事件解决方案并不真正适合每个用例:您无法保证任何人都实际注册了该事件,并且实际上对该事件做了一些事情。如果你只是调用一个方法,你不能像你一样得到结果。
结论:使用像你这样的界面是好的,这里没有问题。 :)
【讨论】:
以上是关于松散耦合的依赖关系:如何?的主要内容,如果未能解决你的问题,请参考以下文章