问题标签 [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 投票
4 回答
757 浏览

c++ - 多态性是否值得增加耦合?

我正在编写一个简单的游戏来学习获得更多的 C++ 经验,并且我知道我觉得多态性几乎可以工作,但没有。在这个游戏中,Party通过 a 的移动相当线性Map,但偶尔会Fork在路上遇到 a。叉子(基本上)是一个std::vector<location*>.Original 我打算在Party成员函数中编写如下代码:

但我想知道以下的一些变体是否会更好:

Fork 实际上是从 Location 派生的,并重载了一些新功能getNext()。但是在后一种情况下,location(一个低级结构)必须是向用户呈现消息而不是“传递这个备份”的那个,我不觉得它是优雅的,因为它locationUserInterface::*.

你的意见?

0 投票
10 回答
25698 浏览

language-agnostic - 如何解决违反得墨忒耳法则的问题?

我和一位同事为我们的客户设计了一个系统,我们认为我们创造了一个很好的干净设计。但是我在我们引入的一些耦合方面遇到了问题。我可以尝试创建一个示例设计,其中包含与我们的设计相同的问题,但如果您原谅我,我将创建我们设计的摘录来支持这个问题。

我们正在开发一个系统,用于为患者注册某些治疗。为了避免到图像的链接断开,我将把 UML 概念类图描述为 ac# 样式类定义。

我将尝试解释一下设计,协议是新治疗的模板。并且协议属于某种类型并且具有需要管理的药物。根据协议,相同药物的剂量可能不同(除其他外),因此存储在 ProtocolMedication 类中。AdministrationRoute 是与协议管理分开管理和创建/更新药物的方式。

我发现以下我们将违反德墨忒耳法则的地方:

违反得墨忒耳法则

BLL 内部

例如,在 ProtocolMedication 的业务逻辑中,有一些规则依赖于药物的 AdministrationRoute.Soluble 属性。代码将变为

存储库内部

列出特定学科中所有协议的方法将被写为:

用户界面内部

我们使用 ASP.NET(无 MVC)作为我们系统的接口,在我看来,这一层目前的违规行为最严重。gridview 的数据绑定(必须显示协议纪律的列必须绑定到 Kind.Discipline.Name),它们是字符串,所以没有编译时错误

所以我认为实际的问题可能是,什么时候可以将其更多地视为德墨忒耳的建议,以及如何解决违反德墨忒耳法则的行为?

我对自己有一些想法,但我会将它们作为答案发布,以便可以单独对其进行评论和投票。(我不确定这是这样做的方式,如果不是,我将删除我的答案并将它们添加到问题中)。

0 投票
9 回答
1226 浏览

coupling - 解耦与 YAGNI

他们矛盾吗?

解耦是一件很棒的事情,而且很难实现。然而在大多数应用程序中我们并不真正需要它,所以我可以设计高度耦合的应用程序,它几乎不会改变任何东西,除了明显的副作用,例如“你不能分离组件”,“单元测试是痛苦的屁股”等。

你怎么看?您是否总是尝试解耦并处理开销?

0 投票
8 回答
348 浏览

java - 班级设计

我正在制作的游戏有 2 个课程,

gui 类和 logic 类,用于三分球游戏。GUI 类有一个使用 JButtons 数组的方法,并使用相同的匿名内部类动作侦听器将它们全部返回

问题是这样的,当我单击按钮时,我希望文本更改为取决于播放器 1 或 2 的 x 或 ao,但是这段代码应该在逻辑类中,不应该这样,所以我应该在逻辑类并从 make 按钮方法的匿名内部类动作侦听器调用它。但是,逻辑类不应该有对 gui 的引用,因为 gui 有对逻辑类的引用,

我想不出一个体面的解决方案

谢谢

0 投票
4 回答
703 浏览

dll - .NET 中的 DLL 混乱,如何将一个解决方案拆分为多个 DLL?

我有一个包含 5-6 个项目的大型 VS.NET 项目,其中一个项目是 Core DLL。

现在要添加一些插件支持,我提取了一个接口,但是需要接口才能使用其他一些类,并且 Core.dll 需要该接口,因此我必须将它们分开。(我不能互相引用)

在那之后,我的一天被毁了,因为即使花了大约 4 个小时,我也无法将它们分开!最后,我创建了 20 多个项目,但仍然无法正常工作(实际上甚至没有关闭)。看起来我最终将完成 50 个项目,并且需要更改大量代码以使其正确。

我知道我的代码是高度耦合的,并且有点退缩。

我这样做对吗?现在我是否必须为我的高度耦合的代码付出代价并受苦?还是我错过了什么?

0 投票
6 回答
2796 浏览

.net - 如何重构紧耦合类?

我正在尝试重构一个大型紧密耦合的应用程序,并试图使其更易于维护和灵活。

我有很多单元测试,所以我希望逐步重构。

我应该考虑实施/应用哪些设计和重构模式来完成这项任务?

我能想到一些:

也可以随意分享你自己的这种重构工作的经验和最佳实践。

更新

由于这个问题中解释的原因,我正在执行此重构。基本上我不能在不提取几个接口的情况下实现插件系统,并且这些接口是高度耦合的,这需要将应用程序分离到 40 多个 DLL 中才能在没有循环引用问题的情况下进行编译。

0 投票
4 回答
51 浏览

c# - 对象搜索器方法应该在父对象中,还是与被搜索的对象相同?

哪个构成更好的面向对象设计?

或者这个

0 投票
2 回答
632 浏览

design-patterns - GRASP Creator 真的解耦了吗?

我在学校学习 GRASP 模式,我对 Creator 模式有疑问。

假设您有三个类,ComputerUserRespositoryUser

GRASP Creator 模式的规则之一告诉您将创建对象的责任分配给包含这些对象的类。按照这个指南,UserRepository 应该是 User 的创建者。

所以如果Computer想要创建一个用户,他会询问UserRespository。

这有效地将ComputerUser解耦。真的吗?

显然,Computer没有提到 User,但我认为 Computer 仍然与 User 的创建高度耦合。为什么?createUser方法很难隐藏创建如果User更改它的构造函数,您必须更改createUser方法以反映这些更改以及使用该方法的每个客户端。

那么使用这种模式有什么好处呢?

0 投票
3 回答
2246 浏览

unit-testing - 如何测试匿名类?

相信你一定对这个成语很熟悉,这算是java给闭包找的借口吧

我经常使用这种成语/模式,但最近我尝试对其进行测试,这让我很头疼......

如何独立测试 ResourceManager 和 Client 类?我发现这将它们紧密结合在一起,以至于你不能轻易做到。

想法受到赞赏。

问候

0 投票
2 回答
134 浏览

coupling - 通过将两个不同的数据项存储在一个变量中来耦合它们的概念是否有名称?

例如,如果我有一个 64 位变量并在其中存储两个 32 位数据项,也许是出于 SIMD 处理的目的,是否有一个名称来描述这两项数据的逻辑耦合?

我的一位同事建议“混合耦合”,这是一个广泛使用的术语吗?

澄清一下:我们追求的是比具体实现更高层次的概念。例如,在类 C 语言中,我们有以下两个结构:

不管这样做的原因是什么,CoupledData 中的 x 和 y 数据成员之间存在隐式耦合,而 UncoupledData 中不存在这种耦合。是否有一个术语可以描述 x 和 y 之间的这种耦合?