问题标签 [loose-coupling]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
134 浏览

php - PHP电商系统循环依赖问题

我刚刚开始使用依赖注入,我立即遇到了一个问题:我有两个相互依赖的类。

类是篮子和运输。在我的篮子类中,我有以下相关方法:

$this->_shipping是 Shipping 类的一个实例

在我的运输课程中,我有以下相关方法:

$this->_basket是 Basket 类的一个实例。

我对如何解决这种循环依赖一无所知。提前谢谢你的帮助。

更新

在我的运输类中,我也有这种方法:

0 投票
1 回答
105 浏览

php - Zend Framework Quick Start 是否包含耦合对象?

我仍在尝试处理依赖注入和松散耦合的对象。查看Zend Framework Quick Start,我注意到 Application_Model_GuestbookMapper 中有以下方法:

我的问题是:这是紧耦合的一个例子,因为 Mapper 依赖于 DbTable?如果改为使用依赖注入,控制器中会不会有这样的东西?:

如果是这样,那么为什么 Zend 推荐紧密耦合的对象?

0 投票
3 回答
83 浏览

php - 如何使我的 MailingList 管理器类更松散耦合?

我正在做一个涉及ProspectsOffers的简单项目。该项目将与第三方邮件列表提供商集成,该提供商将使用 Prospect 对象来管理列表中的电子邮件地址,并使用 Offer 对象来管理活动。

我担心的一个问题是,任何邮件列表提供商(例如 MailChimp)都可能决定停止提供他们的服务,或者在未来更改条款。我不想让我的软件依赖于提供者,而是想让它依赖于通用接口,该接口可以使用使用不同邮件列表提供者的不同类重新实现。这样,如果确实发生了这样的事情,我只需编写一个新类并实例化旧类即可。

这似乎很容易实现。我的抽象类,包括在下面,定义了抽象方法,它们采用 Prospect 或 Offer 对象并对它们执行通用邮件列表相关函数,在需要时返回 true/false 或整数值。这个接口应该可以很好地满足我的应用程序的需求。

困境来了。

将来,在我的应用程序和邮件列表提供程序之间传递的数据可能会发生变化,但是,我不想在任何地方都必须不断更改接口。通过将对象传递给方法,我可以修改方法以在新属性可用时使用它们,而无需在任何地方更改接口。这似乎是一个非常灵活的解决方案。

我想在其他项目中使用这个类,这可能不一定使用 Prospect 或 Offer 类。从类的角度来看,上面的接口似乎耦合得太紧了,因为类依赖于传递给它的对象。

有没有人对我如何保持将对象传递给方法的灵活性有任何建议,但有一个我可以轻松地重用于其他项目的类?

非常感谢你读到这里!我一直在寻求提高我的技能,我将非常感谢您对我如何才能做得更好的洞察力。

0 投票
2 回答
284 浏览

php - 是否将 $this 传递给静态方法紧密耦合?

这是一个简单的例子:

是否可以将$this作为参数传递给另一个类的方法?或者这总是紧耦合?我可以使用工厂模式代替静态方法调用来提出另一个类似的示例。

0 投票
10 回答
2086 浏览

oop - 如何理解松耦合应用程序的大局?

我们一直在使用松耦合和依赖注入来开发代码。

许多“服务”风格的类都有一个构造函数和一个实现接口的方法。每个单独的类都非常容易孤立地理解。

然而,由于耦合的松散,查看一个类并不能告诉您它周围的类或它在更大范围内的位置。

使用 Eclipse 跳转到协作者并不容易,因为您必须通过界面。如果接口是Runnable,则对于查找实际插入的类没有帮助。确实有必要回到 DI 容器定义并尝试从那里找出问题。

这是依赖注入服务类中的一行代码:-

这里的耦合尽可能松散。到期日可以以任何方式逐字执行。

这是在耦合度更高的应用程序中的样子。

从紧密耦合的版本中,我可以推断截止日期是通过使用数据库连接的支付工具以某种方式确定的。

我发现第一种风格的代码比第二种风格的代码更难理解。

你可能会争辩说,在阅读这门课时,我不需要知道截止日期是如何计算出来的。确实如此,但如果我正在缩小错误范围或找出需要增强的地方,那么这是有用的信息。

还有其他人遇到这个问题吗?你有什么解决方案?这只是要适应的东西吗?是否有任何工具可以可视化类的连接方式?我应该让课程更大还是更耦合?

(故意让这个问题与容器无关,因为我对任何答案都感兴趣)。

0 投票
1 回答
106 浏览

c# - 孩子之间的 C# 事件

我在事件中遇到了一些麻烦:

可以说我有 3 个班级 1 是“主人”和 2 个“奴隶”。

主实例化从属。

其中一个从属是调试显示类,它报告正在运行的程序的各个方面。另一个从站包含自己的对象,其中包含调试显示需要报告的变量。

我想到的第一件事就是在从属和从属的子类上公开一个属性,然后让主控将它传递给调试显示,但这似乎是非常糟糕的设计?

所以我做了一些阅读并了解了 C# 中的委托(我了解基础知识并且能够自己编写一些简单的示例)。

我发现的所有示例都涉及侦听器也是引发异常的类的发起者。那么我应该如何支持两个孩子之间的传递/处理事件(或数据)?

非常感谢任何建议。

PS:我试图用谷歌搜索,但发现了大量涉及事件/代表但不太像这样的例子......

0 投票
3 回答
10308 浏览

c# - 初学者需要的减少耦合简单示例

刚从大学毕业,遇到了一些我需要减少耦合的代码。但我并不完全理解所有的概念,并且想要一个简单的例子来帮助我。为了让你开始,我有一个带有单个字段的人员类,名称。我在该类中有一个方法来连接一些文本。

我知道这是一个愚蠢的例子,大多数人永远不会考虑在如此简单的情况下减少耦合,但我只想要一个简单的例子来帮助我完全理解代码和概念。

在主窗口后面的代码中,我放置了一个文本框和一个按钮。当窗口加载时,它会显示人员 x 姓名字段的当前值。单击按钮时,将调用 x.PersonAddText 方法。目前,此示例的耦合计算为 8。按钮单击事件为 3,窗口加载事件为 3。

有什么办法吗,使用这个例子,我们可以将它们中的一个或两个都降低到低于这个值。

以下是我的所有代码:

我的个人类:

我的代码背后:

我的简单 XAML:

我很难理解互联网上解释这一点的教程。据我所知,有 3 种方法可以做到这一点(如果可能的话,将上面的代码转换为所有这三种方法的示例会很好):

  • 服务定位器
  • 依赖注入
  • 控制反转 (IoC)

解释我读过的东西的文章非常好,但这些例子与我无关,因为他正在使用带有数据库连接字符串的 VB 和 ASP.Net。这与我所需要的完全相反,我不想在学习概念的同时考虑如何翻译代码,也不想考虑如何将其应用到相关的东西上。虽然这个例子很好,但它太多了,我真的很感激任何额外的帮助。

编辑历史:更正拼写。添加以下内容以澄清我的问题:

我理解耦合和内聚背后的理论,以及为什么你应该减少一个并增加另一个。但是我们在大学里从来没有编写过任何例子。另外,虽然在大学里没有涉及,但我确实了解接口。但是,我不明白如何使用它们来减少耦合。

添加了我上面引用的文章的链接。

编辑2:到目前为止,我现在得到的是以下内容:

我现在如何在后面的主窗口代码中使用它?我想我应该更换

这是正确的吗?如果是,我还需要做什么。我问的原因是因为我仍然没有看到 Visual Studio 报告的代码耦合数字有任何减少(事实上,它在后面的主窗口代码上增加了 1)。

0 投票
2 回答
3377 浏览

design-patterns - 关注点分离与松散耦合

我想了解关注点分离和松散耦合之间的区别。

通过关注点分离进行编码是否会产生松散耦合的代码?

谢谢你。

0 投票
1 回答
4227 浏览

c++ - 在 dll 边界上暴露 std::vector - 编译器独立性的最佳实践

在 DLL 边界上公开 STL 容器不是一个好主意,而且通常是不可能的(请参阅这个答案了解为什么,以及这个关于在 dll 边界上公开 std::list 的答案)。我需要能够在使用不同(VC08/VC10+)编译器编译的 DLL 和 EXE 之间传递数据;此 Q仅处理相同的所有内容。

暴露它们的最佳方法是什么?向量与列表有点不同,因为内存保证是连续的,所以如果我只需要一个双精度的 const 向量,我可以只提供指向 dll 中函数块的开始和结束指针吗?dll 还需要返回一些结构,例如向量数组。

我想知道一个包含开始和结束指针的结构:

这会是明智的吗?大概从函数返回的任何东西都需要一个析构函数(在 dll 端)来破坏它指向的东西。

0 投票
4 回答
1172 浏览

java - 如何实现JDBC驱动和​​源码的松耦合?

我不想让我的代码与一些 JDBC 驱动程序(例如 MySql)紧密耦合。我想制作通用代码,可以与许多数据库实现一起使用。而且我不太明白在使用 JDBC 时如何实现这个目标。

我认为要实现这一点,我只需要将驱动程序类名(和连接字符串)导出到.properties文件(例如"com.mysql.jdbc.Driver"),然后在代码中像这样使用它Class.forName(PROPERTIES.getDriverName()).newInstance();所以当我决定更改我的数据库时,我需要更改的只是 jdbc文件中的驱动程序名称.properties(例如 to "COM.ibm.db2.jdbc.app.DB2Driver"),连接字符串,并.jar在类路径中更改驱动程序的文件。

这样对吗?