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

language-agnostic - 如何避免在我的代码中使用运行总计?

我现在正在学校学习编程和软件设计以及 Java。让我混淆的课程是软件设计。我们正在使用 Word 运行简单的 VB 代码来做简单的程序。我的教练说我使用运行总数正在失去凝聚力。我很难想办法避免它们。这是我正在谈论的一些伪代码的示例(这些模块被称为来自未显示的驱动程序模块):

基本上DiscountPrice是用来连接前两个模块,然后DeliveryPrice是后两个。据说,最后一个模块甚至可能不需要在那里,我解决了这个问题。对初学者有帮助吗?

0 投票
1 回答
791 浏览

.net - 你会说 .Net 远程处理依赖于紧密耦合吗?

鉴于客户端和服务器都需要了解有关被远程对象的所有信息,首先这种紧密耦合是否存在,其次.Net Remoting 可以以其他方式工作吗?

0 投票
7 回答
319 浏览

c++ - 当班级想要耦合时

我对曾经很好分开的 2 个班级有疑问,但现在他们想结合。

无需过多讨论问题的细节,这里是:

我曾经有一个包含 3 个空间位置顶点的三角形类。

程序中有许多 Triangle 实例,因此每个实例都保留了自己的顶点副本。诸如 等的成员函数getArea()getCentroid()在类中Triangle,并且由于每个Triangle实例都有顶点 a、b 和 c 的副本,因此查找区域或质心不依赖于其他类。应该是这样!

然后,出于其他原因,我想转向顶点数组/索引缓冲区样式表示。这意味着所有顶点都存储在位于Scene对象中的单个数组中,并且每个Triangle顶点仅保留对 in 顶点的引用Scene,而不是顶点本身的副本。起初,我尝试切换出指针:

(如果您想知道好处,我这样做的原因主要是与共享顶点的三角形有关。如果 *a 移动,则使用该顶点的所有三角形都会自动更新)。

这将是一个非常好的解决方案!但它不能可靠地工作,因为 std::vector 使指针无效,并且我在 class 中使用 std::vector 作为主顶点列表Scene

所以我不得不使用整数:

但是现在我遇到了这个新的耦合问题:要找到自己的区域或质心,类Triangle需要访问class Scene之前没有的地方。好像我已经 fsck`d 了一些东西,但不是真的。

世界青年会?

0 投票
2 回答
10361 浏览

ruby-on-rails - 在 Rails 应用程序中使用模块建模

我有一个模型需要从辅助源加载外部数据。存在许多 Web 服务,我的模型可以从中获取数据(可交换),但我不想创建难以更改服务的代码(成本因可变和固定使用而显着不同,并且可能会发生变化将被要求)。

我想创建一个驱动程序来执行交互(如果服务需要切换,然后创建进一步的自定义驱动程序)。不幸的是,由于驱动程序和模型的紧密耦合,将代码提取到插件或 gem 中是没有意义的。我已将所有代码提取到一个模块中(参见示例),并且目前在我的模型上方声明了代码。

Rails (3.0.0) 是否有存储模块与模型紧密耦合的约定?我应该使用插件来做到这一点吗?这与“app/helpers”目录相关联吗?如果不是,最适合存储代码的位置在哪里?谢谢!

0 投票
4 回答
1469 浏览

c# - WCF 和模拟

当谈到 WCF 时,我缺乏经验,而且我真的无法找到一种无痛的方式来模拟 WCF 服务。

情况:客户端和服务器都可以访问定义服务的接口,如下所示:

现在,我的第一个问题是,您是否有理由不让客户端和服务器共享在共享库中定义服务的相同接口类型。当然,如果服务的使用者不是 .NET,或者如果您将其暴露给没有库的第三方,则根本不可能,但我在可能的情况下分享它不会伤害那些其他场景,对吧?

其次,如果这不是一个坏主意,我实际上如何让 Visual Studio 重用服务接口?我设法通过检查来让它共享Customer类型Re-use types,这也是在共享程序集中定义的,但它仍然重新生成接口。

但是,不管这些问题如何,我如何让客户端变得可模拟?如果我通过 VS 生成的服务引用,我会得到一个可以使用的具体类型,但我不希望我的代码直接引用该类型,我想与一个接口交谈。如果我将生成的客户端公开为ICustomerService有效的,我没有Close方法,因为接口没有定义它。

我还想到了以下方法,完全放弃了自动生成客户端,自己编写客户端,因为它很简单:

这行得通,我可以将它作为IServiceClient<ICustomerService>我的 IoC 容器公开,但需要注意的是,现在是这样,并且当接口更改client.Services.GetCustomer(1)时,我已经失去了轻松重新生成客户端的好处。ICustomerService添加的代码很简单,但维护它可能仍然很烦人。

另一种可能性是利用生成的类是partial. 当我这样做时它也有效:

但这创建了一个虚假的类和接口,这不是灾难,但不是很漂亮。

在我走任何一条路线之前,有什么明显的我忽略的吗?

0 投票
5 回答
467 浏览

c++ - 自动实例化的智能指针

我正在寻找一种简单的方法来减少 C++ 项目中的标头耦合,这主要是由于(过度使用)类组合,这当然需要完整的类型。例如:

我也考虑过接口和 pimpl,但两者都暗示了一些我不想手动编写/支持的样板代码(或者有没有办法让它自动化?)。

所以我考虑用指针和前向替换 member class B* pB;,但这需要处理对象的创建和删除。好的,我可以使用智能指针进行删除(auto_ptr虽然不是因为它在创建时需要完整的类型,所以说类似shared_ptr<class B> pB;),但是现在如何创建对象呢?

我可以在A的构造函数中创建对象,就像pB = new B;但这又是手动的,更糟糕​​的是,可能有几个构造函数......所以我正在寻找一种自动执行此操作的方法,它的工作原理很简单就像更改B b;autoobjptr<class B> pB;inA的定义而不必为pB实例化而烦恼。

我很确定这不是一个新想法,所以也许你可以给我一个通用解决方案或讨论的参考?

更新:为了澄清,我不是试图打破 and 之间的依赖关系AB但我想避免B在一个包含 ' 的标题时包含A' 。在实践中,B用于实现A,因此典型的解决方案是创建一个接口或 pimpl ,A但我目前正在寻找更容易的东西。

UPDATE2:我突然意识到,当结合虚拟析构函数(允许不完整的类型)时,像这里提出的惰性指针可以解决问题(太糟糕了,说 boost 中没有标准实现)。我仍然不明白为什么没有标准解决方案,并且感觉就像重新发明轮子......

UPDATE3:突然,谢尔盖·塔切诺夫提出了一个非常简单的解决方案(接受的答案),虽然我花了半个小时才明白为什么它真的有效......如果你删除 A() 构造函数或在头文件中内联定义它,魔法不再起作用(编译错误)。我猜当你定义一个显式的非内联构造函数时,成员的构造(甚至是隐式的)是在类型完整的同一个编译单元(A.cpp)内B完成的。另一方面,如果您的A构造函数是内联的,则成员的创建必须在其他编译单元内进行,并且不会因为B那里不完整而工作。嗯,这是合乎逻辑的,但现在我很好奇——这种行为是由 C++ 标准定义的吗?

UPDATE4:希望是最终更新。有关上述问题的讨论,请参阅已接受的答案和评论。

0 投票
1 回答
47 浏览

oop - 当不在工厂设计中时,一个对象生成另一个对象是否干净?

假设你有一个 ZipFile 类和一个 Content 类。
ZipFile 有一个 load() 方法,用于读取 zip 存档中所有文件的内容并将其放入 Content 对象中。
什么是最合适的 OOP 设计?

1) ZipFile.load() 将创建一个 Content 对象

B) 给 ZipFile 构造函数一个 Content 对象来填充

基本上,分离对象(松散耦合)更好吗?作为一个老派的程序程序员,我不能停止质疑设计 OOP 的几种方法。我在“什么是OOP的最佳方法是什么是最好的方法上浪费了很多时间。有什么建议可以考虑一下吗?书?网站?

谢谢你的帮助

0 投票
4 回答
207 浏览

coupling - OO设计中的耦合

我有两个对象。一个会议对象和一个动作对象(在会议中提出的动作)。动作也可以独立于会议而存在。我有两种方法可以将提出的行动与会议联系起来:

  1. 在会议上有一个方法,我在其中传入 Action 对象,例如“addToMeeting(Action action)”。在会议的内部,然后我将操作链接到会议。对于这种方法,尽管 Meeting 对象需要了解并使用 Action 对象上的方法,但因此变得耦合。
  2. 在会议上有一个方法,我只需传递要链接的操作编号,例如“addToMeeting(int actionID)”。现在很好,会议对象不需要知道任何关于动作的信息,但是......现在将动作添加到会议的代码需要知道如何获取动作 ID,所以已经从这个“meeting.addToMeeting(action)”转向到这个“meeting.addToMeeting(action.getID())”。

对于良好的 OO 设计,应该使用哪种方法?或者有没有第三种方法......

0 投票
4 回答
1315 浏览

java - 耦合/凝聚力

虽然这个论坛上有很多很好的例子,其中包含耦合和内聚的例子,但我正在努力将它完全应用到我的代码中。我可以识别代码中可能需要更改的部分。是否有任何 Java 专家能够查看我的代码并向我解释哪些方面是好的和坏的。我完全不介意自己改变它。只是很多人似乎彼此不同意,我发现很难真正理解要遵循的原则......

0 投票
2 回答
141 浏览

actionscript - Flash / ActionScript - 应用程序设计问题

有人可以分享应该如何设计的方式:

假设我有一些数据模型,它是使用Entries.

基本上,我有一个抽象类Entry(或接口IEntry——这对这种情况来说并不那么重要),并且有这个类的几个实现—— MovieEntry、、、SoundEntry等等FoodEntry……

每一个都是一些数据(url、描述、卡路里数量等)的包装器,并且这些数据在每个相应的类中组合在一起。


现在 - 如果我希望在屏幕上显示条目的数据(比如说电影海报和注释MovieEntry) - 我应该如何设计呢?

显然,我可以提供另一个接口/抽象类并调用它DrawableEntry (它会继承Sprite,然后构建一堆类DrawableMovieEntryDrawableSoundEntry如下所示:

但这对于小型应用程序来说似乎有点过头了。

另一种方法是使MovieEntry, SoundEntry, ... 扩展 sprite 并自己提供绘图实现 - 但这显然很糟糕,因为数据与其可视化例程紧密耦合。

那么 - 这应该怎么做呢?也许 MVC 方法可以为这种情况提供一些东西?