问题标签 [loose-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.
ruby-on-rails - 将主应用程序中的类委托给 Rails 引擎中的类
我有一个独立的 Rails 引擎:Admin
.
在那个引擎中,我Sites
通过 GUI 创建。
在引擎中:
在主应用程序中,我从引擎继承Site
,以便在根级别将其用作常量:
Admin::Site
我这样做是因为将主应用程序的模型、控制器和测试耦合起来感觉不对。但我猜这种方法有一些缺点,我也猜想有人可能会争辩说耦合是相同的。
我怎样才能以比继承更好的方式委派这个?
或者
我是否应该重组我的代码并将Site
类放在主应用程序和引擎都可以使用的 gem 中?我真正想要的是引擎类的接口,以减少入口点,从而减少耦合。
旁注,我总共有 3-4 个这些类驻留在引擎中,但在主应用程序中使用。
编辑:
也许我应该像这样包装它:
当然,我也可以将界面缩小Site
到只包含我需要Admin::Site
的主应用程序中的内容。
c# - 如何使用 Ninject 实现松耦合
我是 Ninject 的新手。有人可以帮助我实现我想要的。我会给你我的例子。请帮助我如何使用 NInject 获得松散耦合。
可以说我有一个下面给出的界面。
现在我有三个实现上述接口的类。它们可以如图所示。
现在在我的主程序中,我会有这样的东西。在这里,我使用 new 运算符创建了Car
,Bus
和的三个具体实现Truck
。我必须显示所有三辆车的规格。现在我想知道如何编写我的 Ninject 代码,以便不依赖具体类。
javascript - 处理相互依赖和/或分层的异步调用
例如,假设我想从某个地方获取文件列表,然后加载这些文件的内容,最后将它们显示给用户。在同步模型中,它会是这样的(伪代码):
这为用户提供了不错的反馈,如果我认为有必要,我可以将代码片段移动到函数中。生活是简单的。
fetchFiles()
现在,粉碎我的梦想:loadFile()
实际上是异步的。简单的方法是将它们转换为同步函数。但是,如果浏览器锁定等待调用完成,这并不好。
如何处理多个相互依赖和/或分层的异步调用,而无需深入研究无尽的回调链,以经典的缩减广告意大利面方式?是否有经过验证的范例可以干净地处理这些问题,同时保持代码松散耦合?
.net - Mediator/EventAggregator 的区别
此外,当我需要在松散耦合的对象(例如MVVM
ViewModel 的)之间进行通信时,关于最佳编程实践的不同书籍和博客建议使用 Mediator/EventAggregator 模式。我的问题是关于这些模式之间的差异/关系。任何人都可以为我描述它们吗?
c# - 依赖注入还是服务定位?
我正在尝试学习依赖注入,但我还没有掌握许多微妙之处。为此,我开始阅读的其中一本书是Karl Seguin 的《编程基础》。有一个关于依赖注入的例子:
然后他继续建议添加另一个间接级别,而不是ObjectFactory
直接在方法中调用:
但这不是“服务位置”吗?
api - 决定耦合程度
我有一个组件,它的 API 公开了大约 10 个功能。我可以想到两种方法来实现它:
将所有这些功能作为单独的功能提供。
仅公开一个以 XML 作为输入的函数。根据指定的 request_Type 和 XML 中传递的参数,我在内部调用了相应的函数之一。
Q1。第二种设计会比第一种更松散耦合吗?
我总是读到我应该如何尝试我的组件松散耦合,我真的应该达到这种程度来实现失去耦合吗?
Q2。就 OOP 而言,其中哪一个是更好的设计,为什么?
编辑:
如果我通过 D-Bus 公开这个 API 供其他人使用,类型检查是否仍然是比较这两种方法的考虑因素?据我了解,类型检查是在编译时完成的,但是如果这个函数通过一些 IPC 暴露出来,类型检查的问题就会出现?
c# - IoC 隐藏平台不匹配
假设您有一个 3 层应用程序:
- 界面层(UI)
- 业务层(BLL)
- 数据层 (DAL):引用 32 位 DLL,因此必须编译为 x86
在传统应用程序中,UI 将引用 BLL,而 BLL 将引用 DAL。如果 UI 或 BLL 设置为“任何 CPU”平台,您将在 C# 编译器中收到平台不匹配警告。因此,x86 要求(或“建议”,因为它是一个警告)会冒泡到 UI,然后编译器会很高兴。
在使用 IoC 的应用程序中,假设您现在添加了第四个程序集“共享接口”,它被所有层引用。此外,UI 引用 BLL 和 DAL,而 BLL 不引用DAL。在这种情况下,UI 会看到平台不匹配警告。但是,BLL 可以保持为“任何 CPU”并且不会收到任何警告。您可以想象其余的以及这如何导致运行时错误。
我的推理正确吗?IoC,或者更广泛地说,松散耦合,本质上是否倾向于将一些错误从编译时转移到运行时?
编辑:所以在重新考虑这一点时,我意识到我的逻辑是有缺陷的。主程序集 (UI) 是确定应用程序在哪个平台下运行的程序集。因此,即使 BLL 保持为“任何 CPU”,UI 也会强制 x86 并且不会导致任何运行时错误。更好的是,如果 BLL 是共享的并且另一个 DAL 实现不需要 x86,则另一个应用程序可以保持为 Any CPU,因为您没有拖动该引用。还有其他一些编译器错误转移到运行时错误的例子吗?
.net - 泛型和松耦合:Can 类在没有类型假设的情况下解耦?
我一直在玩松耦合我的数据访问层。我发现依赖注入过程很有帮助,但在考虑使用泛型时遇到了一些难题。
有没有办法让一个支持泛型类型参数的类真正解耦和类型安全?我担心的是,即使您写入一个公共接口,如果派生类型与您最初编码的实体不同,那么您可能会遇到一些编译器可能无法捕获的令人讨厌的运行时错误。
问题是,当我编写代码以从数据库中获取数据并为我的对象添加水合物时,我在尝试在下一层上实现它时遇到了一个难题。如果我传入下面的 Foo2 之类的类,我可以破坏我的代码,因为没有“隐式”转换。我一直在使用反射来尝试放松,但我不断回到从数据库中获取数据时需要对具体类型进行水合的问题。然后,该类型会在转换和类型保证方面产生问题。此外,如果我想为我的实体库中的所有许多类型抽象所有方法,我可以通过反射来做到这一点,但我仍然遇到泛型只能对显式“where T: ISomeInterface”语句做出类型保证的问题. 最后,如果我们有更多的派生类型或者从接口分支形成新类型的类型,这个模型就会崩溃。认为我需要为曾经做过的每一种类型实现新的数据访问对象会迫使数据访问层发生变化。这打破了我对松散耦合的定义。
所有这一切似乎迫使我回到这个问题——泛型可以以真正松耦合的方式使用吗?如果是这样,您可以提供哪些参考资料?
简化示例:
那么,您将如何处理可以处理任何 IFoo 派生对象并且仍然能够返回完全形成的具体类型的代码,而不管程序员在路上做什么?最好放弃通用部分并坚持依赖注入吗?任何参考资料、指导等都会很棒。
php - 一个库应该调用另一个库还是 Codeigniter 和 MVC 中的控制器任务?
我必须使用 Codeigniter 在我的应用程序中做出一些设计决定。
我在控制器中有一个方法,它调用一个库来创建 PDF。另外我有一些类将数字作为参数并返回字符串(口头数字)。
我想知道在所有此类之间传递数据的最佳做法是什么。这是控制器调用所有库(在步骤 2 和步骤 3 之间)并将所有准备好的数据提供给将创建 PDF 的模型的任务吗?或者这是模型本身的任务,通过加载和调用将数字转换为字符串的类来转换提供的原始数据。
就松散耦合以及代码的模块化和清晰度而言,最好的解决方案是什么。
这是一个控制器:
codeigniter - 在 CodeIgniter 中查询多对多表时,如何保持模型松散耦合?
我正在使用 CodeIgniter 并有三个表和一个模型:
- 用户 - 用户表
- 产品 - 产品表
- UserProduct - 显示哪些用户拥有哪些产品的表(两个外键列和一些其他列,例如日期)
在我的代码中,我想为特定用户显示一个列表,显示他们拥有哪些产品。因此,我在 UserProduct 类中有一个方法,它对与 userId 匹配的 UserProduct 表进行选择,并通过一个连接来引入我需要的关于每个产品的所有数据。
这很好用,但我现在担心我正在走紧耦合的道路。例如,假设我想找出产品图片的 URL。我在产品模型中有一个方法来返回它,我不想在 UserProduct 模型中使用重复的方法,并且我不想通过让 UserProduct 模型尝试访问其他模型中的方法来创建耦合(我不要认为 CodeIgniter 喜欢你这样做)。
此问题似乎可能发生在访问具有外键的数据库表的任何模型中,其中该模型可能需要来自父表的数据并希望对其进行操作。
是否有一个优雅的解决方案,或者我是否需要接受外键必然会在模型中创建耦合或需要跨模型的类似方法?
TIA,菲尔。