依赖地狱——如何将依赖传递给深度嵌套的对象?

2023-11-24

这是为这篇文章编写的一个通用的虚构示例。考虑6个班级

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

TableFactory是外部类,假设它拥有一个TableData数据库表的对象。

In this TableFactory,没有呼叫TableSchema or DBConnect or logger。我的目标是提供外部范围中不需要的内部对象的示例。

TableData是内部获取并操作数据,所以它需要TableCrud, DBConnect and Logger.

TableCrud包含TableSchema和需要DBConnect, and Logger.

DbConnect为了让事情变得有趣,它本身需要一个记录器。我的示例现在深度为 3 个范围。

我的问题非常简单,如果您有一个对象 3 个(或更多)范围,其中外部范围上的对象没有调用这些范围,那么如何在不违反接口隔离原则的情况下将这些对象从外部范围发送到内部范围 -> TableFactory 应该不必处理内部对象所需的 DBConnect 或 Logger。

如果尊重基本的 OOP 原则并以易于测试为目标 -> 您将拥有需要注入 5 个对象的外部对象,然后拥有将所需对象传递到链上的 getter 方法。内部作用域对象反过来需要注入其内部 3 作用域深度对象的依赖项,以及这些对象的 getter。这使得外部作用域对象需要许多依赖项,而 getter 只是为了传递这些依赖项。

这种对象传递方法是否有替代方法,这是我一路上错过的?请分享!任何链接/评论表示赞赏。


依赖关系需要通过对象图传递是一个常见的误解。总结一下 Miško Hevery 给出的例子干净的代码:不要寻找东西,一栋需要门的房子,不需要知道门上的锁:

class HouseBuilder
{
    public function buildHouse()
    {
        $lock  = new Lock;
        $door  = new Door($lock);
        $house = new House($door);

        return $house;
    }
}

正如您所看到的,House 完全忘记了其中的门需要锁这一事实。 HouseBuilder 的责任是创建所有必需的依赖项并根据需要将它们堆叠在一起。从里到外。

因此,在您的场景中,您必须确定哪些对象应该对哪些依赖项进行操作(参见得墨忒耳定律)。然后,您的构建器必须创建所有协作者,并确保将依赖项注入到适当的对象中。

另请参阅如何考虑单元测试中的“新”操作符

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

依赖地狱——如何将依赖传递给深度嵌套的对象? 的相关文章

  • SplFileObject + LimitIterator + 偏移量

    我有两行数据文件 两行仅用于我的示例 实际上 该文件可以包含数百万行 并且我使用 SplFileObject 和 LimitIterator 进行偏移 但这种组合在某些情况下会有奇怪的行为 offset 0 file new SplFile
  • 将文件附加到 PHPMailer

    我目前正在开发一个项目 该项目将文件作为 blob 存储在数据库中 我需要将文件附加到电子邮件并通过 PHPMailer 发送出去 我熟悉 mail gt addAttachment 但是 这个函数似乎只接受文件路径 而我没有 我想知道是否
  • 如何在代码输出中显示 PHP 错误?

    当通过浏览器执行PHP页面时 我们只会得到输出 但不会得到代码中的错误 如何查看后端代码发生的错误 我在代码中使用以下内容进行错误报告 error reporting E ALL E ALL ini set display errors 1
  • php 错误地将字符串中的 ¬ 转换为 Ø

    我需要在 PHP 中组成一个简单的字符串 它是要发布到另一个站点的数据字符串 问题是其中一个字段是 notify url 当我使用该字段时 PHP 将其前面的 和 not 部分表示逻辑运算符 AND NOT 并将其转换为 字符 string
  • PHP:会话.auto_start

    我在同一台服务器上有两个项目 它们的设置在 session auto start 中冲突 相关post https stackoverflow com questions 1378324 php setting variables in i
  • phpstorm 和 xdebug 之间的连接

    我配置了 phpstorm xdebug 并且能够使用断点调试我的代码 这些天我更新了 php 通过brew 和 xdebug 现在我有 php 5 5 26 和 xdebug 2 3 3 当我尝试调试测试 和代码 时 phpstorm 告
  • Symfony2 - 多种形式的主题

    有没有办法在同一页面上的两个 或多个 表单使用不同的主题 我有 2 个表单 我想对第一个表单使用主题 X 对第二个表单使用主题 Y 您需要在显示表单之前声明您的主题 你应该试试 form theme form ThemeX html twi
  • 在 WordPress 中调用自定义 php 模板中的函数

    我想调用我在 WordPress 中编写的另一个 php 类中的函数 但是我对语法感到困惑 例如要获取页面上的标题 您只需调用 get header 等等 但是我如何调用特定类中的函数 例如 在index php中 我想调用一个名为this
  • 查找所有具有相同值的数组键

    当值未知时 是否有一种更简单的方法来获取具有相同值的所有数组键 The problem with array unique是它返回唯一的数组 因此它找不到唯一的值 例如 从这个数组 Array a gt 1000 b gt 1 c gt 1
  • 终端从包含空格的变量传递参数

    在终端中如何将包含空格的字符串作为参数传递 它实际上跳过了空格后面的部分 只取第一个单词 word soccer ball shell exec casperjs test js word word 那么我怎样才能转义空白它只运行这个命令
  • Powermockito 可以在非最终具体类中模拟最终方法吗?

    假设我有一个非最终具体类 具有如下所示的最终方法 public class ABC public final String myMethod return test test 可以嘲笑吗myMethod 调用时返回其他内容junit usi
  • 使用 laravel 5 和 Auth 更新登录的用户帐户设置

    截至今天 我对 Laravel 实际上是任何 PHP 框架 还是个新手 但对 PHP 并不陌生 我创建了我的第一个项目并设法使用预构建的登录Auth系统 我创建了一个新的路线 控制器和模型 名为AccountSettings所以当我去 ac
  • Razorpay 支付集成 -> 我如何检测关闭按钮 X 附近的 razorpay 模型

    我在 CI 框架中使用 Razorpay 当用户在没有付款的情况下关闭时 创建 razor 支付模型 然后对于取消订单 我希望通过状态更改为已取消来触发查询 那么我怎样才能检测到这一点 我已经在使用 by click jQuery 点击关闭
  • 如何知道 Solr Optimize 何时完成?

    我正在使用 Solr php client 通过 php 与 Solr 进行通信 这段代码触发solr优化命令 solr gt optimize 请问有没有什么方法可以确定优化完成了 这都是因为我的网站上有一个管理页面 我每天必须手动优化
  • WordPress ~ 如何在一页上显示多个 Google Chart?

    下面是我插入到 WordPress Visual Composer 中的原始 HTML 块中的一个 Google 图表的代码 图表 ID 名称为 chart div1 这适用于我的 WP 网页
  • 如何在 Yii 框架中从数据库中获取所有表名和列名

    我正在开发一个模块 我想在其中执行动态相关下拉表和列名称功能 前任 获取所有表名称并将其显示在下拉字段中 选择特定表后 我想在下拉字段中再次显示其所有列名称 问题是 1 如何从数据库中获取所有表名 2 如何从表中获取所有列名 我尝试了一些文
  • 维护 VS Test Project 中单元测试方法之间的上下文

    我想按顺序运行以下单元测试 使用随机数字的名称 密码等创建新客户 检索刚刚创建的客户并断言其属性包含相同的随机数 对同一用户调用 ForgotPassword 函数 并使用相同的随机数作为用户名 清楚地看到 我需要生成一次随机数 并在 3
  • JSON 编码和大引号

    我在 PHP 5 的本机实现中遇到了一个有趣的行为json encode 显然 当将对象序列化为 json 字符串时 编码器将清空包含 卷曲 引号的字符串的任何属性 这种类型可能会在启用自动转换的情况下从 MS Word 文档中复制粘贴 这
  • 如何通过引用文档查询嵌入文档?

    我正在使用 Doctrine ODM 但在通过引用文档查询嵌入文档时遇到问题 考虑以下文件
  • 当我在 PHP 中将 print_r() 应用于数组时,为什么会得到“Resource id #4”? [复制]

    这个问题在这里已经有答案了 可能的重复 我如何从 PHP 中的 MySql 响应中 回显 资源 id 6 https stackoverflow com questions 4290108 how do i echo a resource

随机推荐

  • 在 log4net 中使用 smtpAppender 的多个 smtphost 地址

    我希望能够指定多个 smtp 服务器主机地址并实现一种逻辑 如果使用一个 smtp 服务器的电子邮件失败 它会尝试使用下一个 smtp 服务器地址发送 是否可以使用 log4net 我们可以重写 log4net 的一些功能并在其中实现我们自
  • android 设置首选项屏幕的分隔线填充

    我有 PreferenceScreen 包含许多 CheckBox 我通过将其引用到自定义布局来自定义它 如下所示
  • gnuplot 边距在多图模式下如何工作?

    我对 gnuplot 边距有点困惑 首先我不知道这些东西指向什么单位 它们是指向画布坐标还是画布坐标的一部分 它们在 gnuplot 模式和 multiplot 模式下的行为是否相同 在多图模式下绘制一些数据时出现了我的问题 我正在绘制到屏
  • 如何制作可重用的 HTML 导航菜单?

    我相信这个话题一直都会出现但我似乎无法给出一个简洁的答案 我有一个垂直菜单栏 我想在网页 gt 20 中重复使用它 这Menu Bar以 HTML 编码并使用 UL LI A div 标签和 CSS 我们需要这个 Reusable 可维护
  • Mysql 匹配...与“%term%”之类的简单匹配

    有什么问题 term POST search function buildQuery exploded count query if count exploded gt count query AND column LIKE explode
  • javax.tools 依赖于 JDK 吗?

    我想用JavaCompiler动态创建一些类 我找到了源代码javax tools封装了 但是没有实现 互联网上的一些帖子说这取决于tools jar 我不知道tools jar与 JRE 合作 那么 在没有安装JDK的情况下 可以在JRE
  • mycout 自动结束

    我想要实施类MyCout 它可以提供自动endl的可能性 即这段代码 MyCout mycout mycout lt lt 1 lt lt 2 lt lt 3 outputs 123 empty line here 是否可以实现具有此类功能
  • IOS:将图像添加到自定义 MKAnnotationview

    我想将自定义图像添加到地图中的注释中 我制作了以下自定义 MkAnnotationView import
  • 验证 do-while 循环中的输入类型

    基本上 我需要确保输入是integer 像这样 do printf Enter gt scanf d integer while user entered a char instead of an int 我尝试了各种方法 但当我尝试输入时
  • 是什么让这个头文件使 VS2005 慢得像爬行一样? (智能感知无罪?)

    我正在尝试使用 C 项目我在这里找到的编译时哈希技术 宏按预期工作 编译时间也合理 但 64 个递归宏似乎与 Visual Studio 的 Intellisense 玩得很不愉快 每次简短编辑后 IDE 都会挂起约 30 秒 我怀疑它正在
  • Android Chrome 浏览器中的通知 API

    我的网络应用程序使用通知API 我认为 KitKat 的 Chrome 浏览器应该有它 或者至少是旧的webkitNotifications 但两者window Notification and window webkitNotificat
  • 如何在 WinForms 中显示显示轨迹栏值的工具提示

    我是 C 和 WinForms 的新手 所以请原谅 这是一个新手问题 我正在尝试向 TrackBar 控件添加一个工具提示 该提示在您拖动该栏时显示该栏的当前值 我已经实例化了一个 ToolTip 对象并尝试了以下处理程序代码 但它没有显示
  • Spring 数据 JPA。子实体的分页

    我将 Spring Data JPA 与 Spring boot 版本 1 3 6 RELEASE 和内存数据库一起使用 我想知道如何对子实体进行分页来自父实体 将获取设置为LAZY对我来说不是一个解决方案 这是用例 Parent has
  • 格式化字符串未使用的命名参数[重复]

    这个问题在这里已经有答案了 假设我有 action bond james bond format bond bond james james 这将输出 bond james bond 接下来我们有 action bond james bon
  • UDP 数据包大小和数据包丢失

    我一直在编写一个程序 该程序在 UDP 之上使用停止和等待协议来通过 LAN 和 WAN 发送数据包 我最近测试了我的程序 发现数据包越大 接近 64k 字节 丢包率越高 直观上这是有道理的 但实际原因是什么 UDP 数据包大于MTU si
  • GraphQL Blackbox /“任何”类型?

    是否可以指定 GraphQL 中的字段应该是黑盒 类似于 Flow 具有 任意 类型 我的模式中有一个字段应该能够接受任何任意值 可以是字符串 布尔值 对象 数组等 我想出了一个中间立场的解决方案 我没有尝试将这种复杂性推到 GraphQL
  • 从图库中选择图像不适用于 Redmi Note 4

    我在 S O 上看到了几个与此相关的其他问题 但与我的问题最接近的一个似乎没有得到很多回复 小米设备无法从图库中选取图像 希望这个问题能有更好的运气 我正在尝试从手机图库中选择图像 并将图像路径传递到另一个活动 以便用户预览该图像 我已经在
  • 使用 PySpark 时如何将 jdbc 驱动程序添加到类路径?

    如何 在哪里安装 Spark sql 的 jdbc 驱动程序 我正在运行全火花笔记本docker 镜像 并尝试将一些数据直接从 sql 数据库提取到 Spark 中 据我所知 我可以告诉我需要将驱动程序包含在我的Classpath 我只是不
  • 谷歌浏览器和铬中不支持不连续选择错误

    我正在开发一个书签应用程序 我必须在其中存储用户选择的关键字 单词或内容 我使用 createRange 和 addRange javascript 方法来创建范围 然后找出用户选择的元素 内容 我为此编写的代码如下
  • 依赖地狱——如何将依赖传递给深度嵌套的对象?

    这是为这篇文章编写的一个通用的虚构示例 考虑6个班级 TableFactory TableData TableCRUD TableSchema DBConnect Logger TableFactory是外部类 假设它拥有一个TableDa