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

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(使用前将#替换为@)

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

  • 对具有混合类型值的数组进行数字排序

    我有一个像这样的混合数组 fruits array lemon Lemon 20 banana apple 121 40 50 然后申请sort 其功能如下 sort fruits SORT NUMERIC foreach fruits a
  • 如何将 php curl 中的 cookie 获取到变量中

    因此 其他公司的一些人认为 如果不使用soap xml rpc rest 或任何其他合理的通信协议 而是将所有响应作为cookie 嵌入标头中 那就太棒了 我需要从这个卷曲响应中将这些 cookie 作为数组取出 如果我不得不为此浪费大量的
  • 我可以使用 WGET 生成给定 URL 的网站的站点地图吗?

    我需要一个可以抓取网站并以纯文本或类似格式返回所有已抓取页面的列表的脚本 我将把它作为站点地图提交给搜索引擎 我可以使用 WGET 生成网站的站点地图吗 或者有没有一个 PHP 脚本可以做同样的事情 wget spider recursiv
  • 基于mysql表中唯一电子邮件地址的唯一代码?

    我有一个 mysql 表 它将存储用户电子邮件地址 每个地址都是唯一的 并且是主字段 和时间戳 我添加了另一列名为 unique code varchar 64 utf8 unicode ci 我非常感谢您提供的帮助 a 生成5位字母数字代
  • octobercms 任务调度不起作用

    我正在使用基于 Laravel 的 OctoberCMS 我没有 SSH 访问我的服务器的权限 每天我需要删除一些注册后 24 小时内未激活帐户的用户 所以我正在考虑使用任务调度 如 cronjobs 根据 10 月 CMSdocs htt
  • PHP表单提交后如何显示成功消息?

    这是代码 我想要这样 表单提交 gt page2 php gt 重定向 gt page1 php 这是消息 弹出窗口或其他内容 page1 php
  • 创建一个基于简单文本文件的搜索引擎

    我需要尽快创建一个基于简单文本文件的搜索引擎 使用 PHP 基本上它必须读取目录中的文件 删除停止词和无用词 为每个剩余的有用词及其在每个文档中出现的次数建立索引 我猜这个的伪代码是 for each file in directory r
  • 如何从MySQL数据库获取今天/昨天的数据?

    我想从数据库中检索今天的数据 但我不知道该怎么做 我实际上想要获取不是过去 24 小时的数据 我只想获取今天的数据 因此基于实际服务器时间 我还想获取昨天的数据 谁能帮我怎么做 示例代码 SELECT id FROM folk WHERE
  • ResourceBundle 返回 NULL,没有引发任何错误

    对于国际化数据 与 ResourceBundle来自 PHP 的 intl 扩展的类 我运行了扩展 PHP 5 3 4 Windows 并使用以下命令创建了一个 dat 文件ICU 数据库定制器 http apps icu project
  • 是否可以模拟 Python 3.6 中的内置 len() 函数?

    是否可以模拟内置len Python 3 6 中的函数 我有一个类定义了一个简单的方法 该方法依赖于len 函数如下 class MyLenFunc object def is longer than three characters se
  • 将 Javascript 变量转换为 PHP 变量

    我想使用由 videoel getCurrentTime 函数返回给我的 javascript 变量 并将其转换为 php 变量 以便我能够将其添加到我的 SQL 插入查询中 例如 INSERT INTO tblData VALUES ph
  • 使用 swiftmailer 向多个收件人发送电子邮件

    我正在尝试在我的项目中使用 swiftmailer 以便我可以向多个用户发送 html 新闻通讯 我已经彻底搜索过 但我得到的一切从未对我有用 我想在表单输入字段中粘贴多个收件人 以逗号分隔 然后将 html 电子邮件发送给他们 我将收件人
  • 在 PHP 中将对象作为参数传递[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PHP $_FILES 多个文件上传问题

    我在 PHP 中上传多个文件时遇到一个小问题 我有这个 html 表单
  • 如何在 PHP 中上传 .txt 文件并在另一页面上逐行读取该文件?

    我的目标是在表单上上传 txt 文件 浏览 将文件发布到另一个 php 页面 然后逐行读取该文件 到目前为止我的代码就在这里 文件 1 HTML 上传
  • Laravel + AngularJS Nginx 路由

    我有以下问题 我需要配置Nginx 这样在任何URL用户访问时 它都会保留uri 例如domain com some url 但仅传递给 laravel 并让 Angular 处理路由 Route get function return v
  • dompdf:找不到图像或类型未知

    这是我的代码 我几乎尝试了所有在 PDF 上显示图像的方法 但仍然不起作用 你能帮我解决这个问题吗 我还将 DOMPDF ENABLE REMOTE 设置为 true 结果仍然相同 require once dompdf autoload
  • 如何对这个 Flask 应用程序进行单元测试?

    我有一个 Flask 应用程序 它使用 Flask Restless 来提供 API 我刚刚写了一些身份验证来检查 如果消费者主机被识别 该请求包含一个哈希值 通过加密 POST 的请求内容和 GET 的 URL 以及秘密 API 密钥来计
  • “完整性约束违规:1062 重复条目” - 但没有重复行

    我正在将应用程序从本机 mysqli 调用转换为 PDO 尝试将行插入具有外键约束的表时遇到错误 Note 这是一个简化的测试用例 不应复制 粘贴到生产环境中 InfoPHP 5 3 MySQL 5 4 首先 这是表格 CREATE TAB
  • 如何手动添加Android Studio依赖

    我多次尝试向我的项目添加依赖项 但每次都会出现错误 我想添加它们的依赖项是 de hdodenhof circleimageview 1 3 0 and com github bumptech glide glide 3 6 1 所以我想下

随机推荐

  • 在 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