问题标签 [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 回答
25812 浏览

oop - 类的传入耦合和传出耦合有什么区别?

像Sonar这样的代码质量度量工具确实提供了深入到一个类并找出以下数量的能力:

  1. 传入(传入)耦合
  2. 传出(传出)耦合

这两个参数是什么?你能用一个简单的人为例子来描述吗?

0 投票
1 回答
2158 浏览

c - 如何在不耦合任务/线程之间共享数据?

我正在用C开发一个相当复杂的微控制器应用程序,我对如何在不同任务/线程之间“链接”我的共享数据而不耦合它们有一些疑问。

到目前为止,我一直使用时间片调度程序来运行我的应用程序,因此不需要数据保护。但我想让应用程序正确,我想让它为以后的多线程操作系统做好准备。

我试图通过使用与我正在使用的实际系统完全不同的系统来简化我的问题。我无法添加图片,因为我是新用户,但我会尝试解释一下:

我们有 4 个任务/线程:3 个输入线程,它们通过硬件抽象层 (HAL) 从不同的传感器读取一些传感器数据。收集的传感器数据存储在任务域中(即:它们不会是全局的!!)。现在我们也有 1 个输出任务,我们称之为“调节器”。调节器必须使用(读取)从所有 3 个传感器收集的传感器数据才能生成正确的输出。

问题:Regulator 如何在不与其他任务耦合的情况下读取存储在不同输入任务中的收集数据?

调节器必须只通过引用知道输入任务及其数据(即:没有#includes,没有耦合)。

到目前为止,Regulator 都有一个指向每个所需传感器数据的指针,并且该指针是在初始化时设置的。由于数据保护,这在多线程应用程序中不起作用。

我可以getSensorValue()为每个传感器值创建一些使用信号量的函数,然后使用函数指针将它们链接到 Regulator。但这会占用大量内存!有没有更优雅的方式来做到这一点?我只是在寻找输入。

我希望这一切都是可以理解的:)

0 投票
1 回答
98 浏览

mvvm - 如何保持不同的视图与 MVVM 解耦

我的应用程序旨在加载 XML 文件并显示错误(如果有)。

我遇到的问题是如何在不耦合的情况下在屏幕上同时显示(XML 和错误)(我的应用程序当前可以工作)。

我的应用程序目前看起来像(请不要嘲笑或评论我正在上 Photoshop\UI 课程):

在此处输入图像描述

棕色是称为 XmlView 的不同视图。
红色框是我希望显示错误的地方。

因此,用户单击 File->Open,选择文件,.XML 内容显示在我的 XmlView(棕色)中,我的错误消息显示为红色。这行得通,但是我有一种可怕的感觉,我的设计很糟糕,因为我已经完全耦合了我的 MainWindow 和 XmlView。

我的工作方式是,当用户选择一个有效的 XML 文件(从 File->Open)时,我创建我的 XmlView 的一个实例并将它绑定到我的 MainWindow 类的 Views 属性。我的 XmlView 采用 1 个参数,即 MainWindow 类型。

因此,在我的 XmlView 中,要更新我的 ErrorList,我会编写类似于

但这现在意味着我的 XmlView 知道我认为不想要的 MainWindow。

所以,最后,我的问题!我的设计很差还是可以?

0 投票
2 回答
937 浏览

c# - Remove coupling and then mock for unit test

This is a dilemma. Say we have two classes

Now this presents two tightly coupled classes. For testing B.fun(), we need to mock Class A and provide multiple values for A.memberValue.

As the A object is not required anywhere else beyond the scope of B.fun(), I dont see why should we inject it through B's constructor. How can we unit test this method fun() ?

0 投票
1 回答
95 浏览

jquery - Rails - 添加 AJAX 时减少耦合

我正在创建一个小型博客应用程序来学习 Rails - 用户可以登录、创建帖子和评论其他用户的帖子。现在我正在将 Ajax 添加到“添加您的评论”页面,并且在途中遇到了一些设计问题。页面流程如下所示:

问题:

1 - 评论按创建日期排序,因此我的 ajax 调用将新评论添加到页面顶部。如果我改变排序行为,ajax 代码就会被破坏。

2 - 一个评论div可以有 3 个 css 类:.odd、.even 或 .admin(如果评论是由管理员用户进行的,则应用周期奇数/偶数或管理员)。现在我正在对这些类名进行硬编码,并使用一些 if 来获得正确的类名。这也很糟糕,如果更改 css 类名,ajax 代码就会损坏。

我怎样才能避免这些事情,或者至少改善?这是我的 create.js.erb:

谢谢你的帮助!

0 投票
0 回答
86 浏览

c# - 如何绑定与其他对象相关的对象-C#、OOD

我在二十一点控制台应用程序上苦苦挣扎,需要帮助设计/关联我的座位类。

对于游戏,有六个座位,一个座位只能有一个玩家,但如果座位空置,一个玩家最多可以占用(或下注)三个座位。此外,TableGame 有六个座位可供使用。

关于 TableGame 类,它应该有六个座位。那么我应该在 TableGame 构造函数中构造六个座位吗?那么如何创建一个公共属性,即 SeatsAvailable,它使用一个数组来捕获哪些座位可用?

此外,玩家占据一个座位,并在其上下注。我应该如何将这些人结合在一起,以便与下注的玩家联系起来?

关于如何将 Seat 类与 TableGame、Player 类结合的建议以及我应该注意的任何批评和方向将不胜感激。预先感谢您帮助初学者学习 OO 设计的技巧。

0 投票
3 回答
2092 浏览

c# - 当一个类与其他类对象“有”关系时

假设我们有一个 Car、Wheel 和 Brakes 类。一辆汽车“有”四个轮子,所以当创建一个 Car 实例时,我想要同时创建 4 个 Wheels 实例。同样,如果我正在创建摩托车,我会想要创建两个 Wheels 实例。我的问题是如何在创建 Car 类时最好地创建 Wheel 实例并命名它们?

现在假设您要将刹车分配给特定的车轮,即:FrontBrakes 连接到 frontLeft、frontRight Wheels。我应该尝试在 Wheel 类中创建一个名为 AttachedTo 的属性吗?我如何将所有权分配给特定的车轮?

0 投票
1 回答
88 浏览

c# - 将两种形式结合在一起是不是很糟糕?

似乎一个表单应该是独立的,但这是我的困境:

我有一个名为GameMap. 它存在于MapForm一切都很好的地方。它可以自己编辑,等等。但是,我也有一个TilesetForm并且LayerForm我正在传递GameMap给这些对象 - 但后来我发现我还需要在图层表单和地图编辑器之间传递 CurrentLayer,以便它们可以编辑和被选中另一种形式。接下来我知道 - 两者之间的依赖关系非常紧密。瓦片集的唯一目的是服务于MapForm,那么将它们耦合在一起是否有意义?

我怎样才能明确这一点-我不能使用构造函数,因为表单可能未激活-现在我只是SwitchContext在聚焦新地图表单时调用。

0 投票
2 回答
170 浏览

php - CakePHP:高度相互依赖的模型、回调问题和数据工作流

Order我和Item模型之间有非常紧密的关系。

订单模型有一个特殊的Order::prepare()功能。它在所有附加的行为上触发一个Order.prepare事件,这些行为控制、验证和修改项目数据,例如运输、项目/订单重量、数量、折扣等。验证和暂存数据以进行保存操作。它还设置Order.total, Order.weight, Order.status, ...字段。

任何行为也可以根据其限制(库存限制、重量限制、增值税、任何东西)停止准备工作。

何时Item添加到现有的Order

  1. 从数据库中检索订单及其所有现有项目
  2. 新的 Item 数据被添加到 Items 数组中
  3. 订单已准备好(所有行为运行,Item.subtotals Order.total,,重量等都被重新计算......)
  4. 如果准备成功,所有新的(和修改的)订单和项目数据都将使用 Order.saveAssociated 保存。

在仔细考虑了多种方法后,我选择了第三种方法,但我卡住了:

beforeSave 回调

此回调将确保这些回调和计算在每个项目上运行,但它使检索相关的订单数据和项目以及运行回调变得更加困难。也很难确定数据是否已经准备好,递归也是一个问题。更难返回准备好的数据而不是保存它。

扩展Model::save方法

递归也是一个问题,没有保存就无法返回准备好的数据,我通常避免扩展 save()。

解耦准备和保存过程 通过使用自定义模型方法和回调(例如 Order::prepare 和 Order::commit),为订单数据操作创建一个特殊的工作流。行为在非标准事件(beforePrepare、beforeCommit 等)上运行,并且 Model::save() 保持不变。

我很乐意提供更多细节,但它确实是一个庞大的模型,这将是一个很长的问题,我已经尽可能地总结了。任何有关正确方法的想法或示例将不胜感激。

0 投票
1 回答
327 浏览

oop - 以不改进设计的方式应用得墨忒耳定律

假设,我们有以下Boy类,它试图Girl通过分析她的日程安排来安排日期(Java 中的示例):

Boy.tryArrangeDate()由于routine.happensAt()调用,该方法显然违反了得墨忒耳法则。解决此问题的方法之一是将进度分析直接Girl移至GirlRoutine. 在这种情况下,这可能是最好的决定之一。类的 RFCBoy将减少。

但是假设我们选择不同的方向来解决违反德墨忒耳法则的问题,并以这种方式更改代码:

添加了两个私有方法,它们只是将调用委托给Girl她的日程安排/例程。

每个单独采用的方法似乎都没有违反得墨忒耳法则(为了简单起见,让我们将从集合中检索项目视为原始的无方法调用操作)。但总的来说,我们并没有减少这个类的 RFC,也没有提高内聚性,实际上增加了 WMC。告诉,不问原则是不保留的。所以,得墨忒耳法则满足了,但设计仍然不稳定。

问题:( 正式)第二个代码片段确实不违反得墨忒耳定律吗?

注意:问题的目的不是寻找替代解决方案,而是确认/反驳该解决方案符合得墨忒耳定律