依赖关系地狱-如何将依赖关系传递给深层嵌套的对象?
这是为这篇文章准备的一个通用的虚构示例。考虑6节课
TableFactory, TableData, TableCRUD, TableSchema, DBConnect, Logger.
TableFactory
是外部类,假设它TableData
为数据库表保留一个对象。
在此TableFactory
,没有呼叫TableSchema
或DBConnect
或logger
。我的目标是外部范围不需要的内部对象的示例。
TableData
是内取和操作的数据,因此需要TableCrud
,DBConnect
和Logger
。
TableCrud
包含TableSchema
和需要DBConnect
,和Logger
。
DbConnect
若要让事情变得有趣,它需要一个Logger。我的示例现在深了3个作用域。
**我的问题很简单,如果您有一个对象3(或更多)作用域,而外部作用域上的对象没有调用该对象,那么如何将这些对象从外部作用域发送到内部作用域而又不破坏接口隔离原理-
TableFactory应该不必处理内部对象所需的DBConnect或Logger。**
如果一个人遵循基本的OOP原则并旨在易于测试->您将需要注入5个外部对象,然后使用吸气剂方法将所需的对象进一步传递到链上。内部作用域对象反过来又需要注入其内部3层深度对象的依赖关系,并且也需要这些对象的吸气剂。这使得外部作用域对象需要许多依赖关系,而吸气剂只是将其传递给其他对象。
我在此过程中遗漏了一些其他方法来替代此对象传递方法吗?请分享!任何链接/评论表示赞赏。
回答:
常见的误解是依赖关系需要通过对象图传递。总结一下MiškoHevery给出的“干净代码”示例:不用找东西,需要一扇门的房屋,不需要了解门锁:
class HouseBuilder{
public function buildHouse()
{
$lock = new Lock;
$door = new Door($lock);
$house = new House($door);
return $house;
}
}
如您所见,House完全忽略了其中的门需要锁的事实。HouseBuilder的责任是创建所有必需的依赖项,并在需要时将它们堆叠在一起。从里到外。
因此,在您的方案中,您必须确定哪些对象应该在哪些依赖项上运行(参见Demeter定律)。然后,您的构建器必须创建所有协作者,并确保将依赖项注入到适当的对象中。
以上是 依赖关系地狱-如何将依赖关系传递给深层嵌套的对象? 的全部内容, 来源链接: utcz.com/qa/403545.html