当前位置: 首页 > 面试题库 >

依赖关系地狱-如何将依赖关系传递给深层嵌套的对象?

姬博瀚
2023-03-14
问题内容

这是为这篇文章准备的一个通用的虚构示例。考虑6节课

TableFactory, TableData, TableCRUD, TableSchema, DBConnect, Logger.

TableFactory是外部类,假设它TableData数据库表保留一个对象。

在此TableFactory,没有呼叫TableSchemaDBConnectlogger。我的目标是外部范围不需要的内部对象的示例。

TableData是内取和操作的数据,因此需要TableCrudDBConnectLogger

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定律)。然后,您的构建器必须创建所有协作者,并确保将依赖项注入到适当的对象中。



 类似资料:
  • 问题内容: 我在ivaven.xml中添加了一个依赖项(让我们将其命名为A),它在maven Central中具有一个pom文件。Ivy使用ibiblio解决了Maven依赖关系。添加到ivy.xml的依赖项(A)具有传递的依赖项(B)。到目前为止,到目前为止很好。常春藤无法解决传递性依赖项(B)的依赖项(C)。 我在ivy.xml中定义了A,如下所示: 在B的pom文件中,在编译和测试范围中都定

  • 编写的PHP扩展需要需要依赖另外一个扩展,在PHP-X中可以调用Extension->require来实现。 PHPX_EXTENSION() { Extension *ext = new Extension("test", "0.0.1"); ext->require("swoole"); ext->require("sockets"); return ext;

  • 依赖关系 这是一个非常轻量级的模块,没有其他依赖项。希望大家在JVM或Android上使用以太坊的RLP编码的项目时会选择使用这个模块,而不再编写自己的实现。

  • 依赖关系 ABI一个非常轻量级的模块,唯一的第三方依赖是 Bouncy Castle,用于hash加密 (Spongy Castle on Android)。 最后希望java和安卓开发者,在JVM或Android上有以太坊ABI合作的项目时会选择使用这个模块,而不是再编写自己的实现。

  • 问题内容: 我有一个依赖关系如下: 当我部署一切正常时,这将拉下另一个引发ClassDefNotFound的依赖项。 我添加了两个依赖项,如下所示: 并且仍然面临着同样的问题,即:MVN带来下来不 我该如何解决? 编辑: 添加; 问题答案: 您可能有一个传递依赖项,另一个依赖项取决于您不需要的版本。 要获得所有直接和传递依赖关系的概述,请尝试: mvn依赖项:树 如果您发现同一依赖项的不同版本之间

  • 我正在从一个使用Android-Maven-Plugin的Maven项目中构建一个Android应用程序。在这个项目中,我使用了新的beta版数据绑定库。 它包含在Android SDK的本地m2repository中(extras/Android/m2repository)。这个存储库中的库打包为AAR类型。 附注:对于我自己的本地构建,我有几个解决方案(例如重新打包为jar),但我更喜欢一个更