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

coupling - 是否应该/是否也应该在同一类的方法之间应用松散耦合?

假设类A有方法M1M2与其他类耦合度低

a) 我们是否还应该确保类中的每个单独方法A不与同一类中的任何其他方法紧密耦合?因此,我们是否应该确保更改 in 的代码A.M1并不需要我们更改 in 的代码A.M2

b)我假设如果A.M1正在执行两个密切相关的任务T1T2而不仅仅是一个任务,那么T1T2是紧密耦合的,因为更改T1可能还需要更改T2

谢谢你

0 投票
1 回答
267 浏览

ajax - 在 mvc 中将表单的 ajax 脚本(什么控制器)放在哪里?

这是我的情况:我有一个视图(我们称之为视图V),它带有一个带有多个组合框的表单,用于选择一些参数。

我想通过 AJAX 调用动态加载这些组合框的选项(在组合框中选择一个项目将加载其他带有数据的项目)

每个组合框向框架上的不同控制器(依次调用不同模型以获取数据)发出 AJAX 请求。让我们将这些控制器称为C1C2C3和模型M1M2M3

C1C2C3上的这些 AJAX 脚本很可能在未来的其他视图上使用

但我怀疑这是否是正确的方法。我把那些 AJAX 脚本放在哪里?在每个控制器或单独的控制器上(可能称为 FormAPI 或类似的东西)

在每个控制器上放置一个 ajax 脚本我将 V 与C1C2C3耦合,而为三个请求制作一个控制器只会将我的视图 V 与一个控制器耦合。此外,从我的角度来看,这样的控制器将具有高度的凝聚力。

但是,我可能不会保持我的代码 DRY,因为C1C2C3已经有一些逻辑来接收“获取M1M2M3的列表”类型的请求,我可以将其呈现为 JSON 并将其返回到视图V

如果我有另一个视图V2需要对C1C2C3、 ... CN的请求,将来会发生什么?我想很快我的代码将是“意大利面条耦合”

你怎么看?

另一个问题:我是否应该在 M1、M2、M3 上有逻辑来获取数组和项目列表?例如,如果 M1 有多个 M2 实例,创建方法 M1->getM2asArray() 是否正确

0 投票
3 回答
134 浏览

java - 如何在不将我的类绑定到特定实现的情况下获得实现继承的好处?

我正在开发一个应用程序,它建立在另一个开发人员编写的类上(我没有源代码)。

我希望使用该类的所有功能,但也希望使用其他功能对其进行扩展。通常为了实现这一点,我会定义一个接口 ( MyInterface ) 并在实现MyInterface时从我自己的 ( MyClass )扩展外部类 ( TheyClass ) 。

问题因以下事实而变得复杂:

  1. 我现在希望创建一个新类(MyNewClass ),它为MyClass添加附加功能,但我不希望我的代码依赖于TheyClass
  2. 我希望能够将我的类用作TheyOtherClass方法的参数。

为了解决这个问题,我重构了我的代码,改为使用组合而不是继承并实现TheyClassInterface。这可行,但需要我实现许多方法并将它们委托给theirClassObject(实际上,它们的ClassInterface包含大量方法)。

我的问题是我的方法在这种情况下是否合适,是否可以改进,因为在我看来,我的代码使用过多的委托来完成工作。

非常感谢任何人对此提供的任何指导。

丹尼

0 投票
3 回答
617 浏览

interface - 耦合:使用原始类型、接口或具体对象作为参数?

首先让我说,我对 OO 模式、实践、干净代码等方面的经验并不丰富。我实际上正在学习所有这些技术。

最松耦合的方式是使用原始类型来构造新对象或执行方法,但我认为这不切实际,对吗?因为它更容易出错。我可以放弃让我们说代表根本不存在的 Id 的整数。如果我要使用一个对象,我实际上知道它有有效的数据,否则该对象将不会被创建(异常)或处于我必须检查的无效状态。

这篇文章说为此使用具体对象是邪恶的,我应该交出它们的接口(你们都知道,我猜)。对具体类型(而不是接口)的更改会导致依赖类型“崩溃”。在所有情况下都是这样吗?对于封闭的单一项目环境也是如此吗?我只会明白,如果接口 - 一旦编写 - 就无法触及并且永远不会再被修改/重构。

0 投票
0 回答
67 浏览

java - 拆分组件和通信

我有一个扩展 JFrame 的主类(Main.java)。

主类包含一个包含两个面板的左面板。第一个(组件)包含许多 TabelPanel,第二个名为 Property。

我有一个中心面板(设计)和一个底部面板,其中包含一个按钮。设计面板包含一个 jtree。

我从组件面板中获取元素,然后拖放到 jtree。当我在 jtree 中选择一个元素时,我需要向属性面板显示信息。

当我单击底部(底部面板)时,我需要迭代到 jtree 面板。

而不是到处都有参考,避免这种情况的最佳方法是什么?

0 投票
1 回答
278 浏览

c# - exceptions and coupling

I have this main-class that receives a queuemessage and then uses a few other classes to do some work. All these other classes use some lower classes themselves, and eventually data is written to a database or send to wcf services.

Based on the result of the lower classes the main-class has to decide wheter to remove the queuemessage, or place it on the queue again, or send it to a deadletterqueue.

If for example a the database is unreachable, the queuemessage can be placed in the queue to try it again later. But if the wdcf service returns that it doesn't accept some data, the message has to be sent to the deadletterqueue.

I have a couple of ways to implement this scenario:

  1. Throw exceptions and only handle them in the main-class.
  2. Throw exceptions but catch them in each calling class. And rethrow a new exception
  3. Return result-objects which indicate error/success-state

These are my ideas about the scenarios:

  1. If one of the lowest classes throws an exception, and the main-class has to handle it, it couples the main-class all the way to the lowest classes. If one of the lowest classes decides to change an exception, I have to change the main-class exception handling.

  2. There is no good way to let upper classes know which exceptions will be thrown from the called class in C#.

  3. This is what i prefer. Every called method can return a result-object, with an enum indicating succes or failure, and the type of failure.

So, my preferred way is option 3, but I don't know if that's architecturally acceptable. Or if there are any better ways.

Code

This is what the code (in simplified form) looks like:

QueueHandler

DeliveryOrderHandler

DeliverDocumentToExternalSystem

As you can see there's a lot that can go wrong; failed database connections, failed wcf service calls, files not present etc.

I was hoping I could prevent this:

QueueHandler

0 投票
4 回答
1133 浏览

c# - 单元测试:如何测试具有大量底层对象和业务逻辑的方法

我对单元测试真的很陌生,尽管我在研究上花了很多时间,但我无法找出适合我的情况的正确方法。

我的代码库很大(大约 3 年的工作),不幸的是,耦合度很高,很难测试,也没有对其进行过单元测试。

因此,例如,当尝试测试一个集合类ProductCollection时,更具体地说,bool MoveElementAtIndex(Product productToMove, int newIndex)它的,我遇到了以下问题:

  • 首先我必须初始化这个new ProductCollection()
  • 构造函数初始化另一个手工类:new KeyedList<ID, Product>. 我想这不应该在这个构造函数中调用,因为我不是在测试KeyedList.
  • 接下来,我正在尝试向其中添加 3 个产品ProductCollection
  • 然后我首先创建这些 3 new Product()
  • 但是Product类的构造函数做了几件事
  • 它为新创建的产品计算一个唯一 ID:this.ID = IDUtils.ComputeNewIDBasedOnTheMoonPhase()。我想我也不应该测试这个,因为它不是我的范围。我应该如何避免这种深度的调用?
  • 相同的 Product 构造函数为此产品分配了一些默认属性:this.Properties = new ProductProperties(folderPathToDefaultProperties). 这不应该从我的简单FieldCollection.MoveElementAtIndex测试中调用,对吧?
  • 假设我现在终于有了我的产品对象,我正在尝试将它们添加到我的收藏中。
  • ProductCollection.Add(MyProduct)检查底层证券是否KeyedList已经包含该产品。这也是我应该避免的业务逻辑,与我的测试无关。问题是如何?
  • 此外,在这种Add方法中,会引发一些事件,通知系统一些事情(例如,新产品已添加到集合中)。我想这些也不应该被解雇。
  • 最后,当我添加了我的产品时,我调用了所需的 SUT:移动元素方法。
  • 但是这个方法也有可能超出我的测试范围的逻辑:它验证底层KeyedList实际上包含这些字段,它调用KeyedList.Remove()KeyedList.Insert()为其移动逻辑,并触发像CollectionModified.

如果您能解释一下如何正确地进行此单元测试,如何避免调用底层对象,我将不胜感激。

我正在考虑微软的 Moles 框架(VS2010),因为我的印象是它不需要我重构所有东西,因为这绝对不是一个选择。但是已经尝试过了,仍然找不到合适的使用方法。

另外,我的印象是,这个具体的例子对我的情况有很多帮助,因为现实世界中的代码通常是这样的。

有什么想法吗?

0 投票
3 回答
4089 浏览

java - 松耦合 - 封装之间的区别

到目前为止,据我所知,我认为耦合与两个或多个类“互连”的程度有关。换句话说,一个类在多大程度上使用了其他类的方法或变量。我们在设计良好的软件系统中的目标当然是保持低耦合(松散)。

我目前正在阅读一本书,其中明确指出,松散耦合的目标是通过设计系统来实现的,因此每个类只使用其他类的 API(公共方法),而不是直接使用它们的实例变量。因此,实例变量必须是私有的。如果这就是重点,那么松耦合和强封装有什么区别?就我而言,后者指的是封装。关于 OO 软件开发的上述概念,实际上是什么?

0 投票
2 回答
93 浏览

java - 在类上使用接口

我对使用 Java 类的接口的建议有点困惑,就像在这个线程中一样:为什么应该首选 Java 类的接口?

我理解您为什么要使用该界面:如果稍后发生更改,您需要清理的代码就会减少。

但是,在某些情况下,使用接口会阻止您利用性能原因,您首先选择该特定类吗?

例如,如果我有一个 TreeMap,我假设我应该能够在最多 O(logn) 中找到任何元素。这就是为什么它有我可以利用的好方法,比如higherEntry()、lowerEntry()、lastEntry()。

如果我改为将此 TreeMap 引用为 Map,现在我相信我不得不通过 O(n) 中的列表一次迭代一个元素来定位该条目。

我是 Java 新手,所以如果我在这里遗漏了什么,请告诉我。

0 投票
2 回答
70 浏览

oop - 共享重要实例而不耦合

假设您正在编写一个“更大”的应用程序,并且您想在类中记录某些错误。现在几乎每个班级都需要访问 Logger。

一个简单的解决方案如下(PHP,但这没关系):

这种方法的问题是它使每个使用 Logger 的类都依赖它,并且你不能简单地在没有 Logger 的其他项目中使用相同的类。它是紧密耦合的。如果不更改SomeClass.

上述方法的“小”升级如下:

这并不能真正解决问题,因为SomeClass现在只依赖于LoggerFactory并且它与它紧密耦合。这样做的好处是,它LoggerFactory现在可以返回该类的不同实例Logger。因此,如果您想更改记录消息的方式,则无需更改SomeClass.

另一种方法是使用依赖注入:

现在这不SomeClass与任何特定的类耦合。它只需要一个实现Logger接口的类。但是我遇到的问题是,Logger每当您创建一个对象时,您都需要将一个实例传递给构造函数。

我遇到的另一个问题是,Logger 并不是真正的Position类的一部分,例如$xand $y。它只是一个实用程序。

你如何最好地处理这种情况?在这种情况下,耦合和内聚之间的最佳折衷是什么?