问题标签 [decoupling]

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 投票
3 回答
1857 浏览

decoupling - 数据库好的系统解耦点?

我们有两个系统,其中系统 A 向系统 B 发送数据。要求每个系统都可以独立于另一个系统运行,并且如果另一个系统宕机,任何一个系统都不会崩溃。问题是在满足解耦要求的同时,系统 A 与系统 B 进行通信的最佳方式是什么。

系统 B 当前有一个进程轮询 db 表中的数据并处理已插入的任何新行。

一种建议的设计是系统 A 只需将数据插入到系统 b 的 db 表中,并让系统 B 通过现有进程处理新行。问题是这个解决方案是否满足两个系统解耦的要求?数据库是否被认为是系统 B 的一部分,可能变得不可用并导致系统 A 崩溃?

另一种解决方案是系统 A 将数据放入 MQ 队列,并有一个进程从 MQ 中读取,然后插入到系统 B 的数据库中。但这只是额外的开销吗?最终,MQ 队列是否比 db 表更容错?

0 投票
2 回答
2134 浏览

.net - 依赖注入和 .NET 属性

我有几个方法属性可以做一些记录。我们的日志记录代码位于接口 (ILog) 后面,如果属性仅依赖于该接口而不是实现,我会喜欢它。这实际上并不是关于可测试性或依赖倒置,而是关于保持组件的耦合清洁。

一个例子是我们有一个 web (Mvc) 特定属性,如下所示:

LogFactory 依赖于具体的实现 Log.cs。这具有将我的 Web DLL 耦合到包含具体实现的 DLL 的不幸效果——使整个系统更加僵化和脆弱。

任何其他明显存在这种依赖关系的位置,我们只需使用我们的 IOC 容器来注入它。这正是我现在想要对属性执行的操作,但我不确定如何操作!

所以,我的问题是:如何将具体的依赖项注入到接口后面的 .NET Framework 属性中(最好通过像 StructureMap 这样的 IOC 容器 - 但任何可行的方法都可以)?

0 投票
1 回答
604 浏览

cocoa - 在不耦合的情况下为 NSNotification 使用定义名称字符串

我将在我的应用程序中使用 NSNotifications 来解耦代码。

我希望编译器在使用字符串作为通知名称时帮助我,即,如果我输入错误,我希望编译器告诉我。

为此使用普通字符串是行不通的,因为编译器不会知道如果我输入"myNotificaion"了我的真正意思"myNotification"

一种方法是使用 #defines 或 const NSString 变量,但这意味着它们必须在文件中声明,要么是它们源自的类,要么是全局包含的文件。

将它们声明在它们源自的类中的问题是,无论在哪里监听通知,都需要包含它,因此创建了我不想要的耦合。

全局文件的问题在于它可能会变得又长又乱,并且会包含许多不相关的东西。

有没有办法在没有这种耦合或不整洁的情况下做到这一点?

0 投票
5 回答
198 浏览

design-patterns - 建议使用敏捷方法或其他方式编写松散耦合代码

最近,我一直在非常认真地阅读 Robert C. Martin(又名 Bob 叔叔)的书。我发现他谈到的很多东西对我来说都是现实生活中的救星(小函数大小,非常描述性的事物名称等)。

我还没有解决的一个问题是代码耦合。我一遍又一遍地遇到的一个问题是我将创建一个对象,例如包装数组的东西。我确实会在一个班上做一些工作,但后来不得不打电话给另一个班在另一个班上做。以至于我将相同的数据传递了 3-4 层,这似乎没有意义,因为很难跟踪该对象正在传递的所有地方,所以当是时候改变它了我有很多依赖项。这似乎不是一个好习惯。

我想知道是否有人知道更好的方法来处理这个问题,似乎 Bob 的建议(尽管我可能误解了它)似乎使情况变得更糟,因为它让我创建了更多的类。提前谢谢。

编辑:通过请求一个真实世界的例子(是的,我完全同意这很难理解):

0 投票
3 回答
205 浏览

logging - 日志记录应该驻留在一个主要目的不是日志记录的类中吗?

这更像是一个理论问题。日志记录应该驻留在一个主要目的不是日志记录的类中吗?

这是一个简单的界面,用于对数字进行计算的任何内容。

这是执行计算并进行一些日志记录的 ICalculation 接口的实现。我相信这是一种非常务实的做法。除了构造函数接受我们通常不希望在计算域中看到的东西之外,内联日志记录可以说是非侵入性的。

从 RealIntenseCalculation 中删除所有日志记录代码后,代码现在似乎具有明确的单一职责

好的,所以我们删除了真正强烈计算的记录其内部的能力。我们怎样才能找到一种方法来外部化该功能。输入装饰器模式。

通过创建一个装饰 ICalculation 的类,我们可以将日志重新添加到组合中,但这样做会损害在真正强烈计算的私有方法中发生的一些更精细的日志记录。

拥有日志装饰器还有哪些其他可能的优点和缺点?

0 投票
1 回答
1154 浏览

django - 解耦 django 应用程序 - 布局项目的最佳实践

我正在开发一个包含多个应用程序的项目,并希望包含一个用于新闻报道的新闻应用程序。

但是,我想将新闻报道链接到我的自定义应用程序中的对象,但使用开源新闻应用程序来运行新闻。

目前,我只是简单地破解了所选新闻应用程序,以添加与我的模型的 ForeignKey 关系。

即一个小部件应用程序,具有小部件模型

然后是一个新闻应用程序,其入口模型直接链接到我的小部件模型

有一个更好的方法吗?因为如果我想用它的最新版本更新新闻应用程序,它显然会覆盖我的 hack。

我可以从我的自定义模型中获得链接,但工作流程确实应该是

  1. 添加新闻文章
  2. 选择一个小部件将其链接到

不是

  1. 添加新闻文章,保存
  2. 找到将其链接到的小部件
  3. 链接回新闻文章
0 投票
3 回答
681 浏览

django - 解耦 django 应用程序 2 - 如何从 URL 中的 slug 获取对象信息

我正在尝试解耦两个应用程序:

  1. 位置 - 包含有关某些位置(城镇、国家、地点等)的详细信息的应用程序
  2. 目录 - 包含景点(商店、火车站、酒吧等)详细信息的应用程序 - 全部分类。

两者都locations.Location包含directory.Item纬度/经度坐标,我可以在特定纬度/经度坐标的一定距离内找到项目。

我想使用以下 URL 结构:

/locations/<location_slug>/directory/<category_slug>/

但我不想让我的目录应用程序依赖于我的位置应用程序。

如何翻译此 url 以在我的目录应用程序中使用这样的视图?

一种解决方法是在某处创建一个新视图来翻译这个 - 但我应该把它放在哪里?如果它进入目录应用程序,那么我已经将它与我的位置应用程序相结合,反之亦然。

将这个解决方法代码放在我的项目 URL 文件中是个好主意吗?从而避开这两个应用程序?这样做有什么问题吗?

0 投票
7 回答
1688 浏览

c++ - 使用 C++ 命名空间会增加耦合吗?

我知道 C++ 库应该使用命名空间来避免名称冲突,但是因为我已经必须:

  1. #include正确的标题(或转发声明我打算使用的类)
  2. 按名称使用这些类

不要这两个参数推断命名空间传达的相同信息。使用命名空间现在引入了第三个参数 - 完全限定名称。如果库的实现发生变化,现在我需要改变三个潜在的事情。根据定义,这不是增加库代码和我的代码之间的耦合吗?


例如,看一下 Xerces-C:它定义了一个Parser在命名空间内调用的纯虚拟接口XERCES_CPP_NAMESPACE。我可以Parser通过包含适当的头文件,然后导入命名空间using namespace XERCES_CPP_NAMESPACE或在声明/定义前面加上XERCES_CPP_NAMESPACE::.

随着代码的发展,可能需要放弃 Xerces 以支持不同的解析器。纯虚拟接口对库实现的更改部分“保护”了我(如果我使用工厂构造我的解析器更是如此),但是一旦我从 Xerces 切换到其他东西,我需要梳理我的代码并更改我的所有using namespace XERCES_CPP_NAMESPACE代码XERCES_CPP_NAMESPACE::Parser


我最近在重构一个现有的 C++ 项目以将一些现有的有用功能拆分到一个库中时遇到了这个问题:

foo.h

foo.cpp

当时很大程度上出于无知(部分出于懒惰),所有的功能useful.lib都放在了全局命名空间中。

随着内容的useful.lib增长(以及更多的客户开始使用该功能),决定将所有代码从useful.lib它自己的命名空间移动到名为"useful".

客户端.cpp文件很容易修复,只需添加一个using namespace useful;

foo.cpp

但是这些.h文件确实是劳动密集型的。我没有通过放入头文件来污染全局命名空间,而是using namespace useful;将现有的前向声明包装在命名空间中:

foo.h

有几十个(和几十个)文件,这最终成为一个巨大的痛苦!它不应该那么困难。显然我在设计和/或实现方面做错了。

尽管我知道库代码应该在其自己的命名空间中,但将库代码保留在全局命名空间中是否有利,而不是尝试管理#includes?

0 投票
15 回答
444469 浏览

java - Java 中的类型 List 与类型 ArrayList

我知道使用 (1),可以交换List接口的实现。似乎(1)通常在应用程序中使用,无论需要(我自己总是使用它)。

我想知道是否有人使用(2)?

此外,这种情况实际上需要使用 (1) 而不是 (2) 的频率(即,如果 (2) 不够……除了对接口和最佳实践进行编码等)

0 投票
3 回答
771 浏览

javascript - 在开发现代 Web 应用程序时,将 GUI 设计与服务器端开发分离的最佳实践是什么?

我们目前正在开发一些 Web 应用程序,并让我们的设计师将已签署的纸质原型转换为静态网页。除了页面之间的超链接之外,设计人员还开始添加 jquery 调用,通过从静态 json 文件中获取数据来更新页面上的元素。一旦设计师完成并移交完成的网页、CSS 和 JavaScript 文件;然后,服务器端开发人员编辑页面并将对本地静态 json 文档的引用替换为对返回相同 json 数据结构的实时 json url 的引用。

我的问题:将 GUI 设计与服务器端开发分离并减少集成时间和工作量的有效方法是什么?一些例子:

  • 您是否让开发人员手动更改设计人员原型网页中的每个 json 引用?
  • 您是否在某处添加了一个全局变量以使设计人员的页面能够轻松地在使用静态数据和动态数据之间来回切换?
  • 当网页从 Web 服务器运行或只是从某个文件夹提供服务时,您是否让网页具有自我意识?